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

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

我正在使用 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 秒刷新一次可能就足够了。

答案1

Linux 内核会检查dirty_writeback_centisecs是否有超过 的脏页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/

相关内容