为什么 cgroups(blkio 服务字节)和 iotop 产生不同的结果

为什么 cgroups(blkio 服务字节)和 iotop 产生不同的结果

我在 ubuntu 14.04 上使用 lxc 用户空间工具,我想在容器内执行一些压力测试和基准测试。我知道 free 和 htop 在容器中无法正常工作。

我在容器中使用 dd 和 bonnie++ 来强调硬盘,它是一个 SSD。

现在在主机端,使用 iotop 我可以看到使用的读写 io 带宽,但在 cgroups 中我得到了不同的结果。cgroups 只捕获了一小部分服务字节,而 iotop 显示几百兆字节的带宽使用情况。

在 cgroups 中,我捕获了以下条目:/sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes

知道为什么这些值不相等吗?哪一个是正确的?

答案1

最底层blkio 控制器上的内核文档包括以下说明:

什么有效

  • 目前仅支持同步 IO 队列。所有缓冲写入仍是系统范围的,而不是每个组的。因此,我们不会看到组间缓冲写入之间的服务差异。

实际上,这意味着只有绕过内核缓冲,写入操作才会出现在 blkio.throttle.io_service_bytes 中。

该工具fio可以非常轻松地说明这一点。直接、无缓冲的写入应在 blkio.throttle.io_service_bytes 中报告:

fio --name wxyz --direct=1 --buffered=0 --size=1g --time_based --runtime=120s --bs=4k --rw=write --ioengine=sync --numjobs=1 

而使用相反的直接和缓冲选项时,blkio.throttle.io_service_bytes 中不会报告任何内容,因为写入会经过内核缓冲区缓存并在稍后进行安排。

fio --name wxyz --direct=0 --buffered=1 --size=1g --time_based --runtime=120s --bs=4k --rw=write --ioengine=sync --numjobs=1

此外,此主题一位从事 cgroups 工作的 RedHat 工程师重申了这一观点,即一旦写入传递到内核中的写入缓存,“由于这一额外的缓存层,当 IO 到达设备时,我们会丢失上下文信息。” 因此 blkio 无法进行任何记帐。

相关内容