Почему cgroups (blkio обслуживаемые байты) и iotop дают разные результаты
Я работаю с инструментами пользовательского пространства lxc в Ubuntu 14.04 и хочу провести несколько стресс-тестов и тестирование производительности в контейнере. Я знаю, что free и htop не работают должным образом в контейнере.
Я использую dd и bonnie++ внутри контейнера, чтобы подчеркнуть, что жесткий диск - это SSD.
Теперь на стороне хоста, с iotop я могу видеть используемую пропускную способность для чтения и записи, но в cgroups у меня действительно расходящиеся результаты. Cgroups захватывает только небольшую часть обслуживаемых байтов, тогда как iotop показывает использование полосы пропускания в несколько сотен мегабайт.
В cgroups я собираю эту запись: /sys/fs/cgroup/lxc/disk_stress/blkio.throttle.io_service_bytes
Есть идеи, почему значения не равны? Какие из них правильные?
1 ответ
В самой, самой нижней части документации ядра на контроллере 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
Принимая во внимание, что с противоположными опциями direct & buffered, в 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, повторяет мысль о том, что как только запись передается в кэш записи в ядре: "Из-за этого дополнительного уровня кеша мы теряем контекстную информацию к тому времени, когда IO достигает устройства ". И, таким образом, blkio не может вести учет.