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

Sep*_*ero 37 io process-management hard-disk limit ulimit

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

$ limitio --pid 32423 --write-limit 1M
Run Code Online (Sandbox Code Playgroud)

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

Krz*_*ski 40

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

设置 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
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p /sys/fs/cgroup/blkio/limit1M/
echo "X:Y  1048576" > /sys/fs/cgroup/blkio/limit1M/blkio.throttle.write_bps_device 
Run Code Online (Sandbox Code Playgroud)

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

echo $PID > /sys/fs/cgroup/blkio/limit1M/tasks
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,您首先需要设置设备范围的总策略,以便通过 ie `echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device` 创建子组,然后您获得 X和 Y 由即`ls -l /dev/sda` (4认同)

cas*_*cas 24

ionicefromutil-linux做一些类似于你想要的事情。

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

从手册页:

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

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

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

  • 应该记住,它仅适用于“CFQ”I/O 调度程序。许多现代系统默认启用了“截止日期”。 (7认同)

fch*_*che 12

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

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

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


Ben*_*ibr 8

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

我会建议这样的事情:

systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
Run Code Online (Sandbox Code Playgroud)

或弃用的版本:

systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
Run Code Online (Sandbox Code Playgroud)

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

链接: