Linux下如何限制程序对磁盘的读写速度

Linux下可以使用IO限制工具来限制程序对磁盘的读写速度,常用的工具包括:

  1. ionice:可以设置程序的IO调度优先级,优先级越高的程序会优先获取磁盘IO资源。
  2. iotop:可以监控系统中每个进程的IO使用情况,包括读写速度、IO请求等待时间等。
  3. tc:可以基于网络接口、IP地址、端口号等限制网络流量,也可以用来限制磁盘IO速度。
  4. cgroup:可以将进程分组并限制各组的资源使用,包括CPU、内存、磁盘IO等。

其中,cgroup是最常用的工具之一,可以使用以下步骤限制程序对磁盘的读写速度:

  1. 安装cgroup工具包,例如CentOS系统可以使用yum安装:
   sudo yum install libcgroup-tools
  1. 创建一个cgroup组:
   sudo cgcreate -g blkio:/mygroup
  1. 设置组的磁盘IO限制(单位为字节),例如限制读写速度为1MB/s:
echo "8:0 1048576" | sudo tee /sys/fs/cgroup/blkio/mygroup/blkio.throttle.write_bps_device
echo "8:0 1048576" | sudo tee /sys/fs/cgroup/blkio/mygroup/blkio.throttle.read_bps_device

其中,8:0 表示主设备号和分区号,1048576 表示限制速度为 1MB/s。

注:

使用 df 命令来查看磁盘挂载情况

使用 ls -l /dev/<设备文件名> 来查看设备号和分区块

# ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 May 6 13:46 /dev/sda

如上,8, 0 用设备号表示为 8:0

  1. 通过组命令将程序启动:
   sudo cgexec -g blkio:/mygroup myprogram

这样,myprogram程序就被限制在1MB/s的读写速度内。

注意:cgroup限制的是组内所有进程的磁盘IO,如果需要限制单个进程的磁盘IO,可以将该进程单独放在一个组中。

该功能通过 blkio 子系统实现。

blkio 子系统里东西很多。不过大部分都是只读的状态报告,可写的参数就只有下面这几个:

代码如下:

blkio.throttle.read_bps_device

blkio.throttle.read_iops_device

blkio.throttle.write_bps_device

blkio.throttle.write_iops_device

blkio.weight

blkio.weight_device

补充:

echo: write error: No such device

cgroup 的 blkio 子系统可以用于限制块设备的IO(输入输出)操作,包括读写操作和IO调度。但是,blkio子系统仅能对整个块设备进行限速,而无法对其分区进行限速

这是因为blkio子系统是基于块设备的,而不是基于分区的。块设备是指可以按照块(block)大小进行读写的设备,比如硬盘、SSD、U盘等。而分区则是在块设备上划分出来的逻辑区域,不是一个独立的块设备。因此,blkio子系统无法对分区进行限速。

如果需要对分区进行限速,可以考虑使用其他的限速工具,比如 tc(Traffic Control)。tc可以对网络接口、队列、类别等进行限速,也可以对块设备进行限速。使用tc可以针对分区进行限速,但需要进行一定的配置和调试。

参考:https://developer.aliyun.com/article/59069

Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注