我的盒子上运行了两个进程=> 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)是否有任何系统级参数来防止这些缓冲的写停顿发生?
答案 0 :(得分:0)
当达到脏比率时,进程 B 停止的原因很简单:进程 A 和 B 竞争写缓冲区缓存。进程(除非执行Direct-I / O(O_DIRECT
))永远不会直接写入磁盘。
使用相对较新的cgroup,您可以引入每个进程配额,但这是一个相当复杂的解决方案。这里有趣的一点是(除其他外)限制memory
也限制了允许的缓冲区使用。