如何将每个进程 I/O 限制到最大限制?

如何将每个进程 I/O 限制到最大限制?

我正在寻找一种方法将进程磁盘 io 限制为设定的速度限制。理想情况下,该程序的工作方式与此类似:

$ limitio --pid 32423 --write-limit 1M

将进程 32423 的硬盘写入速度限制为每秒 1 兆字节。

答案1

这当然不是不能在用户空间中完成的微不足道的任务。幸运的是,可以在 Linux 上使用cgroupmechanizm 及其块控制器

设置 cgroup 在某种程度上是特定于发行版的,因为它可能已经在某处安装甚至使用。不过,这是一般想法(假设您有正确的内核配置):

mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir -p /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio

现在您已经blkio设置了控制器,您可以使用它:

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 

现在你有了一个cgrouplimit1M,它限制具有主要/次要数字的设备上的写入速度X:Y至 1MB/秒。如您所见,此限制是针对每个设备的。您现在要做的就是在该组中放置一些进程,并且它应该受到限制:

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks

我不知道是否/如何在其他操作系统上完成此操作。

答案2

ioniceutil-linux做一些与你想要的类似的事情。

它不设置绝对 IO 限制,而是设置 IO 优先级和“良好性”——类似于nice进程的 CPU 优先级。

从手册页:

ionice - 设置或获取进程 I/O 调度类别和优先级

描述
该程序设置或获取 I/O 调度类别和优先级
程序。如果没有给出参数或只给出 -p,ionice 将查询
该进程的当前 I/O 调度类别和优先级。

当给出命令时, ionice 将使用给定的命令运行该命令
论据。如果没有指定类,则将执行命令
与“尽力而为”调度类。默认优先级为 4。

答案3

的答案是法切是一个非常好的提示,谢谢您,尽管它并没有真正解决问题,因为问题是将进程限制为特定带宽。

我会建议这样的事情:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb

或已弃用的版本:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb

这仍然不适合问题,因为它不能用于已经运行的进程,但也许在其他情况下很有帮助。

链接:

答案4

systemd 为 cgroup 操作的进程调用提供了一个包装器。从 systemd-run(1) 手册页:

以下命令调用 Updatedb(8) 工具,但将其块 IO 权重降低到 10。有关 BlockIOWeight= 属性的更多信息,请参阅 systemd.resource-control(5)。
systemd-run -p BlockIOWeight=10 updatedb

考虑使用该--scope选项使systemd-run程序在前台运行。

相关内容