Назад | Перейти на главную страницу

Почему cgroups (обслуживаемые байты blkio) и iotop дают разные результаты

Я работаю с инструментами пользовательского пространства lxc в ubuntu 14.04, и я хочу выполнить некоторые стресс-тесты и тесты производительности внутри контейнера. Я знаю, что free и htop неправильно работают в контейнере.

Я использую dd и bonnie ++ в контейнере, чтобы подчеркнуть жесткий диск, это SSD.

Теперь на стороне хоста с помощью iotop я могу видеть используемую полосу пропускания io для чтения и записи, но в контрольных группах у меня разные результаты. Контрольные группы захватывают только небольшую часть обслуживаемых байтов, тогда как iotop показывает использование полосы пропускания в несколько сотен мегабайт.

В cgroups я фиксирую эту запись: /sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes

Есть идеи, почему значения не равны? Какой из них правильный?

В самом низу документация ядра на контроллере blkio включает примечание:

Что работает

  • В настоящее время поддерживаются только очереди синхронизации ввода-вывода. Все буферизованные записи по-прежнему относятся к системе, а не по группе. Следовательно, мы не увидим различий в обслуживании буферизованной записи между группами.

Фактически это означает, что операции записи появятся в 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

Дополнительно, эта тема вместе с инженером RedHat, который работает с cgroups, повторяет, что после того, как запись прошла в кэш записи внутри ядра: «Из-за этого дополнительного уровня кеша мы теряем контекстную информацию к тому времени, когда ввод-вывод достигает устройства». Таким образом, blkio не может вести учет.