Answers:
这当然不是在用户空间中无法完成的琐碎任务。幸运的是,可以使用cgroup
mechanizm及其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
我不知道是否可以在其他操作系统上完成此操作。
dd ... oflag=direct
将按预期工作。如果文件系统支持,cgroup v2可以处理此问题。详细信息:使用cgroup限制I / O
ionice
从util-linux
做类似您想要的事情。
它不设置绝对IO限制,而是设置IO优先级和“ niceness”(类似于nice
进程的CPU优先级)。
从手册页:
ionice-设置或获取流程I / O调度类和优先级 描述 该程序设置或获取I / O调度类和优先级。 程序。如果未提供任何参数或仅给出-p,ionice将查询 当前I / O调度类和该进程的优先级。 当给出命令时,ionice将使用给定的命令运行该命令 论点。如果未指定类,则将执行命令 与“尽力而为”调度类。缺省优先级为4。
CFQ
I / O调度程序。许多现代系统deadline
默认情况下启用了一个。
fche的答案是一个很好的暗示,为此,尽管它并不能真正解决问题,因为问题是将进程限制为特定的带宽,这是一个很好的提示。
我建议这样的事情:
systemd-run -p "IOWriteBandwidthMax=/dev/sdX 1M" updatedb
或不推荐使用的版本:
systemd-run -p "BlockIOWriteBandwidth=/dev/sdX 1M" updatedb
但这仍然不适合这个问题,因为它不能用于已经运行的进程,但是在其他情况下可能会有所帮助。
链接:
echo "X:Y 1073741824" > /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
并通过ie 获得X和Yls -l /dev/sda