Tro*_*son 6 linux hard-drive stress-testing lxc cgroup
我在 ubuntu 14.04 上使用 lxc 用户空间工具,我想在容器内执行一些压力测试和基准测试。我知道 free 和 htop 在容器中不能正常工作。
我在容器中使用 dd 和 bonnie++ 来强调它是 SSD 的硬盘。
现在在主机端,使用 iotop 我可以看到使用的读写 io 带宽,但在 cgroups 中我确实有不同的结果。cgroup 仅捕获一小部分服务字节,而 iotop 显示数百兆字节的带宽使用情况。
在 cgroups 中,我正在捕获此条目:/sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes
任何想法为什么值不相等?哪一个是正确的?
小智 8
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
Run Code Online (Sandbox Code Playgroud)
而使用相反的直接和缓冲选项,在 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
Run Code Online (Sandbox Code Playgroud)
此外,这个与从事 cgroups 工作的 RedHat 工程师的线程重申了一点,一旦写入传递到内核内部的写入缓存,“由于这个额外的缓存层,我们在 IO 到达设备时丢失了上下文信息.” 并且,因此 blkio 不能进行会计处理。