每个人的机器配置不一样,所以会出现有的机器iowait不明显,有的机器被打爆。解决办法是用docker cgroup选项对 block io做限制。假设硬盘设备为 /dev/nvme0n1,测试如下:
1. 限制块设备的读写 iops 为 3: `docker run --privileged --name=app9 --device /dev/nvme0n1:/dev/nvme0n1 --device-write-iops /dev/nvme0n1:3 --device-read-iops /dev/nvme0n1:3 -itd feisky/app:iowait-new2`
2. 可以查看host机器 cgroup 已为对应 docker container 添加了相关限制:
```
cat /sys/fs/cgroup/blkio/docker/"docker-container-id"/blkio.throttle.write_iops_device
259:0 3
cat /sys/fs/cgroup/blkio/docker/"docker-container-id"/blkio.throttle.read_iops_device
259:0 3
```
3.
```
docker exec -it "docker-container-id" /bin/bash
root@4cc5e6c74cc0:/# dd iflag=direct if=/dev/nvme0n1 of=/dev/null bs=1k count=1000
1000+0 records in
1000+0 records out
1024000 bytes (1.0 MB, 1000 KiB) copied, 340.004 s, 3.0 kB/s
```
`dd` 每次从 /dev/nvme0n1 设备读取数据写到 /dev/null 设备,每次读取 1kB,一共1000次,必须为 direct 选项。可以观测到拷贝速度为 3 kB/s,即 1kB * 3,说明cgroup 限制 `blkio.throttle.read_iops_device` 生效。
4. 观察host机器 iowait 已经上去。
```
top - 12:10:22 up 1:25, 1 user, load average: 0.88, 0.81, 0.83
任务: 780 total, 1 running, 227 sleeping, 0 stopped, 552 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 s
%Cpu1 : 2.7 us, 0.0 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 s
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni, 0.0 id,100.0 wa, 0.0 hi, 0.0 si, 0.0 s
%Cpu3 : 5.3 us, 7.9 sy, 0.0 ni, 84.2 id, 0.0 wa, 0.0 hi, 2.6 si, 0.0 s
MiB Mem : 7863.3 total, 230.4 free, 3847.2 used, 3785.8 buff/cache
MiB Swap: 8192.0 total, 8191.5 free, 0.5 used. 3191.1 avail Mem
```
zombie数那么高是因为这个 docker container 已经运行20多分钟了。
供大家参考:)
展开
作者回复: 谢谢分享,见到Docker高手了😊。 这样的确可以达到IO限制的目的,不过使用系统级工具分析的时候,会有很大不同,比如iostat看看磁盘使用率可能还是很空闲;或者看看内核调用栈也有些不同。
不过这倒是不错的性能隔离方案👍