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)不要做(还)

相关文章

/etc/sysctl.conf这个目录主要是配置一些系统信息,/etc/sys...
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起...
它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅...
不管是我们在安装软件还是监测软件的使用性能,我们都要随时...
装好Tomcat7后,发现除了本机能访问外界访问不了,岂有此理。...
修改防火墙配置需要修改 /etc/sysconfig/iptables 这个文件,...