Docker 性能监控-如何查询 I/O 繁忙时间和精确的块读/写?

Docker 性能监控-如何查询 I/O 繁忙时间和精确的块读/写?

“docker stats”命令提供了一些关于容器的基本信息。例如:

CONTAINER ID        NAME                                                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
2c73c2e10c53        container_name                                      0.46%               1.422GiB / 31.39GiB   4.53%               350MB / 227MB       534MB / 1.42GB      63

我正在用一个程序收集这些信息(https://github.com/nagylzs/pysysinfo_influxdb) 并将其发送到 InfluxDb 数据库。我需要使用此设置在多台服务器上运行性能测试并分析结果:查找所有服务器上可能的瓶颈(CPU/网络速度/内存/磁盘 IO 等)。“docker stats”提供的信息非常粗略。以下是问题:

  • 每 30 秒进行一次测量。块读/写和网络读/写值不断增加。一旦达到 1GB,它们就无法用于性能分析,因为它们太粗略了。例如,如果我现在测量的是 29.1GB,30 秒后测量的是 29.2GB,那么实际数量可能在 1MB 到 149MB 之间。
  • 我想知道 busy_time %(I/O 所用时间)值。除非我知道最大值,否则原始块读取/写入不会提供太多信息。但由于我需要监控多台服务器,并且它们的最大性能各不相同,因此无法(轻松地)使用原始块值来识别瓶颈。

我也尝试使用“docker inspect”获取信息,但没有看到任何可用的价值。

对于网络接口,我可以想象这是可以工作的(尽管很难实现):

  • 使用“docker inspect”列出每个容器的网络接口
  • 然后查看“ifconfig”的输出并收集“RX 字节”和“TX 字节”值
  • 每 30 分钟收集一次这些信息本身就是一个问题

如何对磁盘 I/O 执行相同操作?如何获取 I/O 繁忙时间?此信息必须可用,因为“docker stats”会显示它们。只是格式不是最好的。有什么想法吗?

答案1

Docker 容器基于 Linux cgroup,因此请从 cgroup 文件中读取指标。例如:请参阅 cgroup v1 文档中的 Block IO Controller -https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt

来自我的操作系统的示例:

[root@dockerhost c2241e5663e04cbf0154b06ecb4fe7f31f67918748c3123ea7104ac8db004dae]# ls
blkio.io_merged                   blkio.io_serviced_recursive      blkio.reset_stats                blkio.throttle.write_bps_device   cgroup.event_control
blkio.io_merged_recursive         blkio.io_service_time            blkio.sectors                    blkio.throttle.write_iops_device  cgroup.procs
blkio.io_queued                   blkio.io_service_time_recursive  blkio.sectors_recursive          blkio.time                        notify_on_release
blkio.io_queued_recursive         blkio.io_wait_time               blkio.throttle.io_service_bytes  blkio.time_recursive              tasks
blkio.io_service_bytes            blkio.io_wait_time_recursive     blkio.throttle.io_serviced       blkio.weight
blkio.io_service_bytes_recursive  blkio.leaf_weight                blkio.throttle.read_bps_device   blkio.weight_device
blkio.io_serviced                 blkio.leaf_weight_device         blkio.throttle.read_iops_device  cgroup.clone_children
[root@dockerhost c2241e5663e04cbf0154b06ecb4fe7f31f67918748c3123ea7104ac8db004dae]# cat blkio.throttle.io_service_bytes
253:4 Read 1540096
253:4 Write 0
253:4 Sync 0
253:4 Async 1540096
253:4 Total 1540096
Total 1540096

blkio.throttle.io_service_bytes 文件的文档:

- blkio.throttle.io_service_bytes
    - Number of bytes transferred to/from the disk by the group. These
      are further divided by the type of operation - read or write, sync
      or async. First two fields specify the major and minor number of the
      device, third field specifies the operation type and the fourth field
      specifies the number of bytes.

不要指望任何好的 % 指标值。它们只是计数器,所以您必须根据计数器值计算 % 。只需找到对您有用的计数器(我猜是 *等待* 指标),您就能检测到 IO 瓶颈。

您还可以应用类似的概念:

相关内容