我试图限制服务(或进程/命令)的 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 和设置限制。