docker stats show a wrong value of block I/O when using dd if=/dev/zero in a container

问题:

在做对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

猜你喜欢

转载自blog.csdn.net/yunlilang/article/details/81542050
今日推荐