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

我在Ubuntu 14.04上使用lxc用户空间工具,我想在容器中执行一些压力testing和基准testing。 我知道free和htop在容器中工作不正常。

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

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

在cgroups中,我正在捕获这个条目:/sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes

任何想法,为什么值不相等? 哪一个是正确的?

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中没有任何报告,因为写入通过内核缓冲区caching并在稍后调度。

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

此外,与RedHat工程师在cgroup上工作的这个线程重申,一旦写入已经传递到内核中的写入caching,“由于这个额外的caching层,当IO到达设备时,我们丢失了上下文信息“。 而且,blkio也不会发生会计。