Как обойти кэширование памяти при использовании FIO внутри контейнера docker? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь оценить производительность ввода-вывода на моем хосте и docker контейнере, используя гибкий инструмент ввода-вывода с включенным O_direct, чтобы обойти кэширование памяти. Результат очень подозрительный. docker работает почти в 50 раз лучше, чем мой хост-компьютер, что невозможно. Похоже, docker вообще не обходит кеширование. даже если я запустил его в режиме --privileged. Это команда, которую я запускал внутри контейнера. Есть предложения?

fio --name=seqread --rw=read --direct=1 --ioengine=libaio --bs=4k --numjobs=1 --size=10G --runtime=600  --group_reporting --output-format=json >/home/docker/docker_seqread_4k.json

1 Ответ

2 голосов
/ 17 февраля 2020

(Обратите внимание, что на самом деле это не программный вопрос, поэтому Stackoverflow - неправильное место, чтобы задавать этот вопрос ... Может быть, Суперпользователь или Ошибка сервера будет лучшим выбором и будет быстрее ответы?)

Результат очень подозрительный. docker работает почти в 50 раз лучше, чем мой хост-компьютер, что невозможно. Похоже, что docker вообще не обходит кеширование.

Если задержки в вашем лучшем случае подозрительно малы по сравнению с задержками в худшем случае, весьма вероятно, что ваши подозрения обоснованы и что кэширование ядра все еще происходит. Запрос O_DIRECT является подсказкой, а не приказом, и файловая система может все равно игнорировать его и использовать кэш (см. Часть о «Вы запрашиваете прямой ввод-вывод файла в файловая система, но ... ").

Если у вас есть опция и вас интересует скорость диска, лучше провести любой такой тест вне контейнера (со всеми вытекающими отсюда предостережениями). Другой вариант, когда вы не можете / не хотите отключать кэширование, - это убедиться, что вы выполняете ввод-вывод, который по крайней мере в два-три раза больше (как с точки зрения количества, так и используемого региона) оперативной памяти, поэтому большинство I / O не может быть удовлетворен буферами / кешем (и если вы делаете write I / O, тогда сделайте что-то вроде end_fsync=1).

В итоге, файловая система, используемая docker, может сделать невозможным точное выполнение того, что вы запрашиваете (измеряйте скорость диска, обходя кэш, используя любую файловую систему по умолчанию docker).

...