Linux中无缓冲的IO

Linux中无缓冲的IO,第1张

概述我正在编写大量的数据,这些数据将不会再被读取几个星期 – 因为我的程序运行机器上的可用内存量(以“免费”或“顶”显示)下降速度非常快,内存量应用程序使用不增加 – 其他进程使用的内存量也不会增加. 这使我相信文件系统缓存正在消耗内存 – 因为我不想长时间读取这些数据,我希望绕过系统缓冲区,这样我的数据直接写入磁盘.我没有梦想改善perf或是一个超级忍者,我的希望是提示文件系统,我不会再回来这个记忆 我正在编写大量的数据,这些数据将不会再被读取几个星期 – 因为我的程序运行机器上的可用内存量(以“免费”或“顶”显示)下降速度非常快,内存量应用程序使用不增加 – 其他进程使用的内存量也不会增加.

这使我相信文件系统缓存正在消耗内存 – 因为我不想长时间读取这些数据,我希望绕过系统缓冲区,这样我的数据直接写入磁盘.我没有梦想改善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中无缓冲的I / O全部内容,希望文章能够帮你解决Linux中无缓冲的I / O所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存