我在ubuntu 14.04上使用lxc用户空间工具,我想在容器内执行一些压力测试和基准测试.我知道free和htop在容器中不能正常工作.
我在容器内使用dd和bonnie来强调它是SSD的硬盘.
现在在主机端,使用iotop我可以看到所使用的读写带宽,但在cgroup中我确实有不同的结果. cgroup仅捕获服务字节的一小部分,而iotop显示几百兆字节的带宽使用.
在cgroups中,我正在捕获此条目:/sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes
任何想法为什么价值观不平等?哪一个是正确的?
解决方法
kernel documentation on blkio controller的最底部包括注释:
What works
- Currently only sync IO queues are support. All the buffered writes are
still system wide and not per group. Hence we will not see service
differentiation between buffered writes between groups.
实际上,这意味着只有在绕过内核缓冲时,写操作才会出现在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
此外,this thread与一名在cgroup上工作的RedHat工程师重申,一旦写入已经传递到内核中的写缓存,“由于这个额外的缓存层,我们会在IO到达设备时丢失上下文信息. “因此,blkio不会发生会计处理.