如何使用systemd限制IO带宽?

如何使用systemd限制IO带宽?

我试图限制服务(或进程/命令)的 IO 使用。 (硬件设备上的 IO 读/写限制,而不是网络。)

我从 systemd 找到了 IOAccounting:

systemd-run --scope --user -p "IOReadBandwidthMax=/dev/zero 1M" -p "IOAccounting=true" \
    time dd if=/dev/zero count=1 bs=100M of=/tmp/foo conv=fdatasync

systemd-run --scope --user -p "IOWriteBandwidthMax=/dev/sdd 1M" -p "IOAccounting=true" \
    time dd if=/dev/zero count=1 bs=100M of=/tmp/foo conv=fdatasync

该命令很快结束并报告 200/300 MB/s。当我运行命令时,结果完全相同,没有 systemd-run 包装器。

我还尝试编写 systemd 服务,而不使用 systemd-run: IO 带宽限制不起作用。

你有什么建议吗?

答案1

运行系统测试systemd(需要 root 身份验证)显示 IO 限制正在起作用,需要 10 秒:

systemd-run --scope -p IOWriteBandwidthMax='/dev/sda 10M' time dd if=/dev/zero count=1 bs=100M of=/tmp/foo conv=fdatasync

为用户运行systemd限制不起作用,因为默认情况下用户无法控制 IO。 Arch wiki对此有一个有用的信息:

https://wiki.archlinux.org/title/cgroups#As_unprivileged_user

有人建议对用户服务使用委托。同样对于任何过程,都可以使用控制组(就像这样邮政)并且用户无法直接控制 IO 和设置限制。

相关内容