Производительность программ при запуске в Docker-контейнерах: одинаковая или медленная? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую образ Docker, созданный на основе Ubuntu, который содержит стандартные программы, которые мне понадобятся в моей работе в ближайшие месяцы.

Предположим, у меня есть трудоемкая программа для сортировки миллиарда чисел, написанных на C ++.Скажем, я хочу сравнить производительность исполняемой программы на моем ноутбуке с тем, когда исполняемый файл запускается внутри контейнера ubuntu на том же ноутбуке .

В целом, будет ли разница в производительности?Для некоторых грубых экспериментов, которые я пробовал, в отношении сортировки миллиона чисел, похоже, нет разницы в производительности.Верно ли это для других более общих вычислений, связанных, скажем, с обработкой чисел или обработкой строк?

Я знаю, что Docker-контейнеры должны быть «легкими» в том смысле, что они запускаются быстро (в отличие от виртуальных машин), но я не знаю, накладывает ли каждый контейнер какой-то «барьер» междуметалл и код, бегущий внутри контейнера.Извините, если последнее предложение не имело особого смысла, я не очень хорошо разбираюсь в контейнерах и виртуальных машинах.

1 Ответ

0 голосов
/ 12 декабря 2018

ObDisclaimer: единственный верный ответ на вопросы производительности - это написать, запустить и измерить эталонный тест.

ObDisclaimer 2: на современном оборудовании не думайте о производительности, если у вас нет абсолютно никакой причины,Люди постоянно работают с рабочими нагрузками промышленного уровня, написанными на интерпретируемых языках, на виртуальных машинах на оборудовании с общей арендой, и они не замечают, что он на 100-200 раз медленнее, чем оптимизированный C на голом металле.


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

Попытки DockerТрудно быть довольно легким, и в значительной степени полагается на поддержку уровня ядра для своей магии.Если вы выполняете файловый ввод / вывод, в ядре будет еще один уровень косвенного обращения;если вы выполняете сетевой ввод / вывод, Docker вводит уровень NAT.(Когда вы говорите «read /foo/bar в Docker, ядро ​​делает некоторую внутреннюю косвенность, говоря:« о, вы имеете в виду этот файл вместо /var/lib/docker ».) Если вы можете измерить эту разницу, и она действительно имеет значение для вас, тогда вам нужно запустить приложение на голом железе, вероятно, вы получите больший выигрыш в коде приложения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...