这使我相信文件系统缓存正在消耗内存 – 因为我不想长时间读取这些数据,我希望绕过系统缓冲区,这样我的数据直接写入磁盘.我没有梦想改善perf或是一个超级忍者,我的希望是提示文件系统,我不会再回来这个记忆,很快,所以不要花时间优化这些情况.
在Windows上,我遇到类似的问题,并使用FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH修复了问题 – 机器内存没有被我的应用程序消耗,机器一般更可用.我希望能够复制我在Linux上看到的改进.在Windows上,有部分大小的部分写作的限制,我对这个限制我感到乐观.
在Linux中是否有类似的方法?
解决方法
另一种影响较小的方法是在不使用O_DIRECT的情况下停止使用操作系统缓存的块,是使用posix_fadvise(fd,offset,len,POSIX_FADV_DONTNEED).在支持它的Linux 2.6内核下,这会立即从缓存中丢弃(清除)块.当然,您需要使用fdatasync()或类似于第一个,否则这些块可能仍然是脏的,因此不会从缓存中清除.
在每次写入后,这可能是fdatasync()和posix_fadvise(… POSIX_FADV_DONTNEED)的一个坏主意,而是等到你完成了一个合理的数量(50M,100M也许)之后.
所以简而言之
在每一个(显着的块)写入之后,
>调用fdatasync后跟posix_fadvise(… POSIX_FADV_DONTNEED)
>这将刷新数据到光盘,并立即从操作系统缓存中删除它们,为更重要的事情留下空间.
一些用户发现,像快速增长的日志文件这样的东西可以轻松地将光盘缓存中的“更有用”的东西吹出来,这样可以在需要大量读取缓存的盒子上减少高速缓存命中,而且还可以快速写入日志.这是这个功能的主要动力.
但是,像任何优化一样
a)你不需要它
b)不要做(还)