原理:
通过cgroup限制,相关cgroup项如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
-r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_merged -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_merged_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_queued -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_queued_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_service_bytes -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_service_bytes_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_serviced -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_serviced_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_service_time -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_service_time_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_wait_time -r--r--r-- 1 root root 0 9月 8 19:03 blkio.io_wait_time_recursive -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.leaf_weight -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.leaf_weight_device --w------- 1 root root 0 9月 8 19:03 blkio.reset_stats -r--r--r-- 1 root root 0 9月 8 19:03 blkio.sectors -r--r--r-- 1 root root 0 9月 8 19:03 blkio.sectors_recursive -r--r--r-- 1 root root 0 9月 8 19:03 blkio.throttle.io_service_bytes -r--r--r-- 1 root root 0 9月 8 19:03 blkio.throttle.io_serviced -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.throttle.read_bps_device -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.throttle.read_iops_device -rw-r--r-- 1 root root 0 9月 8 19:28 blkio.throttle.write_bps_device -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.throttle.write_iops_device -r--r--r-- 1 root root 0 9月 8 19:03 blkio.time -r--r--r-- 1 root root 0 9月 8 19:03 blkio.time_recursive -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.weight -rw-r--r-- 1 root root 0 9月 8 19:03 blkio.weight_device -rw-r--r-- 1 root root 0 9月 8 19:03 cgroup.clone_children --w--w--w- 1 root root 0 9月 8 19:03 cgroup.event_control -rw-r--r-- 1 root root 0 9月 8 19:28 cgroup.procs -rw-r--r-- 1 root root 0 9月 8 19:03 notify_on_release -rw-r--r-- 1 root root 0 9月 8 19:03 tasks |
这里暂且只讨论:
- blkio.throttle.read_bps_device
- blkio.throttle.read_iops_device
- blkio.throttle.write_bps_device
- blkio.throttle.write_iops_device
较旧的docker版本不支持设置这些,但是,只要你的内核支持上面这些,就可以直接修改cgroup实现。
我这里使用的是devicemapper,宿主机只有一个设备/dev/sda ,如下:
1 2 3 4 5 6 7 |
# ll /dev/sda* brw-rw---- 1 root disk 8, 0 7月 11 13:43 /dev/sda brw-rw---- 1 root disk 8, 1 7月 11 13:43 /dev/sda1 brw-rw---- 1 root disk 8, 2 7月 11 13:43 /dev/sda2 brw-rw---- 1 root disk 8, 3 7月 11 13:43 /dev/sda3 brw-rw---- 1 root disk 8, 4 7月 11 13:43 /dev/sda4 brw-rw---- 1 root disk 8, 5 7月 11 13:43 /dev/sda5 |
devicemapper信息如下:
1 2 3 4 5 |
# ll /dev/mapper/ 总用量 0 crw------- 1 root root 10, 236 7月 11 13:43 control lrwxrwxrwx 1 root root 7 9月 8 19:03 docker-8:3-1075755737-eb519f8a4930573e982fe8df6c62e1732fb295fca0fe64494157dccef4b52653 -> ../dm-1 lrwxrwxrwx 1 root root 7 8月 24 12:24 docker-8:3-1075755737-pool -> ../dm-0 |
1 2 3 |
# ll /dev/dm-* brw-rw---- 1 root disk 253, 0 8月 24 12:24 /dev/dm-0 brw-rw---- 1 root disk 253, 1 9月 8 19:03 /dev/dm-1 |
从上面可以看出:
- docker 使用的mapper-pool为 /dev/dm-0,设备号: 253,0
- 该机器上一个容器,该容器挂载的设备为 /dev/dm-1 , 设备号: 253,1
- 物理磁盘 /dev/sda 设备号: 8,0
容器不仅用到了devicemapper(这里是 /dev/dm-1),而且还挂载了外部的磁盘,下面是关于容器限速100mb的写法:
1 2 3 4 5 6 |
#cd /sys/fs/cgroup/blkio/system.slice/docker-eb519f8a4930573e982fe8df6c62e1732fb295fca0fe64494157dccef4b52653.scope #echo "8:0 102400000" >blkio.throttle.write_bps_device #echo "253:1 102400000" >blkio.throttle.write_bps_device # cat blkio.throttle.write_bps_device 8:0 102400000 253:1 10240000 |
关于读速度,这里先不举例了,还有iops都如法炮制