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


32

我正在寻找一种将进程磁盘io限制为设置的速度限制的方法。理想情况下,程序应类似于以下工作:

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

将进程32423限制为每秒1 MB的硬盘驱动器写入速度。

Answers:


33

这当然不是在用户空间中无法完成的琐碎任务。幸运的是,可以使用cgroupmechanizm及其blkio控制器在Linux上进行操作

设置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 

现在,您有了一个cgroup limit1M,可以将X / Y大/小数字的设备上的写入速度限制为1MB / s。如您所见,此限制是针对每个设备的。您现在要做的就是将某些过程放入该组中,并且应该加以限制:

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

我不知道是否可以在其他操作系统上完成此操作。


3
请注意,您首先需要设置设备范围的总体策略,以便通过ie创建子组,echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device并通过ie 获得X和Yls -l /dev/sda
dothebart

cgroup v1不支持以下缓存的写回。这意味着测试简单的dd命令写入文件系统中的标准文件(而不是设备)可能不会显示任何限制。不使用任何写回将起作用:dd ... oflag=direct将按预期工作。如果文件系统支持,cgroup v2可以处理此问题。详细信息:使用cgroup限制I / O
AB

22

ioniceutil-linux做类似您想要的事情。

它不设置绝对IO限制,而是设置IO优先级和“ niceness”(类似于nice进程的CPU优先级)。

从手册页:

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

描述
该程序设置或获取I / O调度类和优先级。
程序。如果未提供任何参数或仅给出-p,ionice将查询
当前I / O调度类和该进程的优先级。

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

5
应该记住,它仅适用于CFQI / O调度程序。许多现代系统deadline默认情况下启用了一个。
海斯特克

8

systemd为cgroup操纵的进程的调用提供了包装器。在systemd-run(1)手册页中:

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

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


7

fche的答案是一个很好的暗示,为此,尽管它并不能真正解决问题,因为问题是将进程限制为特定的带宽,这是一个很好的提示。

我建议这样的事情:

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

或不推荐使用的版本:

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

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

链接:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.