问题:
在做对container监控时,查看磁盘的大小情况,发现docker stats的BLOCK I/O与用dd if=/dev/zero命令测试的结果有出入。
docker stats解析:
一般来说,对于docker的监控,有三种最主要的方式去获取性能指标,分别是:cgroup、docker命令行(docker stats)以及docker的API。
对于cgroup方式,就是通过cgroup的文件来读取这些指标,一般来说在/sys/fs/cgroup目录下面,例如CPU相关的指标/sys/fs/cgroup/cpuacct/docker/$CONTAINER_ID/cpuacct.stat;这里的CONTAINER_ID就是容器的ID。
对于docker命令行,其实就是通过docker stats来获取.
如果跟踪docker stats实现的代码发现,它也是从linux的统计文件里去读取统计的值来实现的。
这里主要分析下block I/O的统计:
在目录/sys/fs/cgroup/blkio/docker/$CONTAINER_ID/下有IO相关的指标文件,由于系统的差异,下面大部分文件里面的值都是0,在这种情况下,通常还有两个文件可以工作:blkio.throttle.io_service_bytes和blkio.throttle.io_serviced,它们分别记录了总I/O字节和操作。
cat /sys/fs/cgroup/blkio/docker/766e69629047e70f008a9d29ded41e5b64ec340379ea9d122235c0960feb817e/blkio.throttle.io_service_bytes
253:0 Read 135536640
253:0 Write 2153077760
253:0 Sync 24894464
253:0 Async 2263719936
253:0 Total 2288614400
Total 2288614400
docker stats情况:
docker stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
766e69629047 0.19% 2.756 GiB / 7.638 GiB 36.08% 0 B / 0 B 135.5 MB / 2.153 GB 13
分析:
但是用dd 命令创建文件,查看此docker stats的结果时,发现与预期的有出入。具体地:
dd if=/dev/zero of=./test count=1000 bs=1M
但是docker stats block I/O没有改变。
后来分析发现/dev/zero 是一个特殊的字符设备,但是 BLOCK I/O统计的是块设备的操作,故docker stats 的BLOCK I/O的Output结果没有变。
下面模拟一个块文件的写操作,用dd创建块文件发现结果是与预期是一致的的。例如:
执行:
dd if=./test.txt of=./ttttt
其中test.txt大小为50MB的块文件
结果:
766e69629047 0.13% 2.754 GiB / 7.638 GiB 36.06% 0 B / 0 B 135.5 MB / 2.259 GB 13
766e69629047 34.18% 2.754 GiB / 7.638 GiB 36.06% 0 B / 0 B 135.5 MB / 2.311 GB 13