调整linux磁盘刷新间隔以避免阻止用户进程


4

我正在使用rtorrent在安装在树莓派上的SD卡上下载文件,大约6MB / s(带宽上限)。用户进程不会刷新数据本身,刷新磁盘高速缓存的时间间隔取决于sysctl值。

使用iostat和nload我可以看到网络带宽和磁盘写入配置文件:

磁盘:

20M/s .....x.....x....xx...
      .....x....xx....xx...
      ....xx....xx....xx...
0M/s  ....xx....xx....xx...

网络:

5M/s  ..xxx....x.. x.....x.
      .xxxx...xx..xxx...xxx
0M/s  xxxxx...xxx.xxx...xxx

显然,IO编写器在刷新期间总是暂停。它是一个4核CPU,3个核心永久空闲,top表示在冲洗期间100%iowait。

如果我while true; do sync; sleep 1; done在下载时这样做,磁盘刷新是平滑的,每秒6MB。并且下载器进程不会被阻塞,因此带宽是恒定的。

我可以得到同样的效果:

/proc/sys/vm/dirty_writeback_centisecs: 磁盘缓存刷新的频率 - 单位是100秒; 默认值:500

并且/proc/sys/vm/dirty_expire_centisecs: 页面必须有多长时间才有资格在100秒内冲洗; 默认值:3000

将这些设置为100和200分别实现相同的均匀磁盘刷新配置文件和恒定的下载带宽。

有没有办法让这个调整自动,即尽可能经常刷新,以避免必须阻止编写过程?例如,如果下载速度为1MB / s,那么每5秒刷新一次就足够了。

Answers:


3

dirty_writeback_centisecs如果您的脏页较旧,则Linux内核会检查错误dirty_expire_centisecs。使用默认设置,它会每隔5秒检查一次超过30秒的脏页。

内核也有脏内存限制。当达到此限制时,它会阻止每个写入进程,以避免在RAM中有太多脏页。

你应该调整的是什么

  • vm.dirty_background_ratio :在内核开始在后台刷新到磁盘之前可以填充脏页的系统内存量。
  • vm.dirty_ratio:可以用脏页填充的最大系统内存。然后内核阻止每个I / O请求,直到所有内容都刷新到磁盘。

为了不得到这种行为,你需要告诉内核它应该至少保持30s * 6MB / s = 180MB。您还需要考虑Raspberry Pi的慢写速度,因为在刷新到磁盘所需的时间内,更多脏页将被写入RAM。

这可能代表Raspberry Pi的RAM太多,因此您可能需要降低dirty_expire_centisecs。请注意,使用较小的值可能会损害系统响应能力,因为您几乎可以获得同步I / O.

以下是有关其工作原理的更完整说明:https//lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.