Linux中无缓冲的I / O

前端之家收集整理的这篇文章主要介绍了Linux中无缓冲的I / O前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写大量的数据,这些数据将不会再被读取几个星期 – 因为我的程序运行机器上的可用内存量(以“免费”或“顶”显示)下降速度非常快,内存量应用程序使用不增加 – 其他进程使用的内存量也不会增加.

这使我相信文件系统缓存正在消耗内存 – 因为我不想长时间读取这些数据,我希望绕过系统缓冲区,这样我的数据直接写入磁盘.我没有梦想改善perf或是一个超级忍者,我的希望是提示文件系统,我不会再回来这个记忆,很快,所以不要花时间优化这些情况.

Windows上,我遇到类似的问题,并使用FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH修复了问题 – 机器内存没有被我的应用程序消耗,机器一般更可用.我希望能够复制我在Linux上看到的改进.在Windows上,有部分大小的部分写作的限制,我对这个限制我感到乐观.

在Linux中是否有类似的方法

解决方法

您可以使用O_DIRECT,但在这种情况下,您需要自己做块IO;您必须以FS块大小和块边界的倍数写入(有可能这不是强制性的,但如果您的性能不会吸收x1000,因为每个未对齐的写入将首先需要读取).

另一种影响较小的方法是在不使用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)不要做(还)

猜你在找的Linux相关文章