1

我的盒子上有两个进程在运行 => 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) 是否有任何系统级参数来防止这些缓冲写入停顿的发生?

4

1 回答 1

1

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

顺便说一句:如果您不限制脏缓冲区,则会出现类似的读取停滞:如果所有缓冲区都是脏的并等待写出,则尝试读取数据的进程需要“未脏”缓冲区来存储数据,但只要undirty 缓冲区可用,它可能被写入过程“弄脏”(变得“脏”)。

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

于 2017-05-09T14:00:03.090 回答