在Linux机器上的重磁盘I / O期间,文件写入停止

时间:2015-08-13 20:14:19

标签: linux filesystems disk virtual-memory disk-io

我的盒子上运行了两个进程=> A和B.

每当因进程A将大文件写入磁盘而导致磁盘I / O活动繁重时,我发现进程B中的文件写入间歇性地停止。我注意到我的linux内核上有以下虚拟内存设置。

vm.dirty_background_ratio = 5  
vm.dirty_background_bytes = 0  
vm.dirty_ratio = 20  
vm.dirty_bytes = 0  
vm.dirty_writeback_centisecs = 500  
vm.dirty_expire_centisecs = 3000  

文档说明'dirty_background_ratio'是在内核后台刷新线程启动以将字节刷新到磁盘之前脏页占用的内存百分比。鉴于我有64 GB的内存,当脏页面缓存大小达到~3.2 GB时,这个后台刷新应该启动,我发现当进程A正在写入磁盘时确实如此。

但是,一旦此后台刷新开始,进程B中的文件写入就会间歇性地停止大约10-20秒的时间。 1)鉴于此磁盘刷新是在后台发生的,为什么来自进程B的写入停止,因为所有写入首先进入页面缓存而不是直接进入磁盘? 2)是否有任何系统级参数来防止这些缓冲的写停顿发生?

1 个答案:

答案 0 :(得分:0)

当达到脏比率时,进程 B 停止的原因很简单:进程 A B 竞争写缓冲区缓存。进程(除非执行Direct-I / O(O_DIRECT))永远不会直接写入磁盘。

BTW:如果不限制脏缓冲区,则存在类似的读取停顿:如果所有缓冲区都是脏的并且等待写出,则尝试读取的进程需要“非脏”缓冲区来获取数据,但是一旦提供了一个无法使用的缓冲区,它就可能被写入过程弄脏了。

使用相对较新的cgroup,您可以引入每个进程配额,但这是一个相当复杂的解决方案。这里有趣的一点是(除其他外)限制memory也限制了允许的缓冲区使用。