我们正在运行带有 Linux 内核 4.15.0-36-generic 的 Xenial (16.04),并运行一个循环执行以下操作的脚本
- 将文件从磁盘上的一个位置复制到另一个位置。
- 将上述文件通过 SFTP 传输到外部服务器
Ubuntu rootfs 运行的是 btrfs,并且复制的文件大小通常在 2GB 左右。
我们看到,当脚本在系统上处于活动状态时,用户级线程的延迟很高。延迟在 1 秒到 3 秒的范围内。如果文件大小增加到 10GB,线程延迟在 10 到 20 秒的范围内
更多细节:
磁盘类型为 SSD,系统具有 64GB RAM。使用以下选项安装 Btrfs 文件系统:
rw,noatime,compress=lzo,ssd,space_cache
VM sysctl 选项包括
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
我们希望磁盘活动不要冻结用户线程,因为它们对我们来说至关重要。
更新更多信息:
添加更多信息。当我们将 sysctl VM 选项修改为更激进的选项(如下)时,情况会变得更好。
sysctl -w vm.dirty_background_ratio=1
sysctl -w vm.dirty_ratio=2
sysctl -w vm.dirty_expire_centisecs=1000
sysctl -w vm.dirty_writeback_centisecs=100
上述设置有意义吗?或者我们需要将 IO 调度程序更改为默认的 [CFQ] 以外的其他程序?