pat*_*lea 5 networking linux cache rtorrent performance-tuning
我正在使用 rtorrent 下载安装在树莓派上的 SD 卡上的文件,速度约为 6MB/s(带宽上限)。用户进程本身不会刷新数据,刷新磁盘缓存的时间间隔取决于 sysctl 值。
使用 iostat 和 nload 我可以看到网络带宽和磁盘写入配置文件:
磁盘:
20M/s .....x.....x....xx...
.....x....xx....xx...
....xx....xx....xx...
0M/s ....xx....xx....xx...
Run Code Online (Sandbox Code Playgroud)
网络:
5M/s ..xxx....x.. x.....x.
.xxxx...xx..xxx...xxx
0M/s xxxxx...xxx.xxx...xxx
Run Code Online (Sandbox Code Playgroud)
显然,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 秒刷新一次可能就足够了。
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/
| 归档时间: |
|
| 查看次数: |
6620 次 |
| 最近记录: |