Какова стоимость исполнения для контейнера Docker

Я хотел бы всесторонне понять стоимость исполнения во время выполнения контейнера Docker. Я нашел ссылки на сеть, а не менее 100 мкс.

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

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

Ответ 1

Здесь - отличный исследовательский документ 2014 года IBM под названием "Обновленное сравнение производительности виртуальных машин и контейнеров для Linux" от Felter et al. что обеспечивает сравнение между голыми металлами, KVM и контейнерами Docker. Общий результат: Docker почти идентичен производительности Native и быстрее, чем KVM в каждой категории.

Исключением является Docker NAT - если вы используете сопоставление портов (например, docker run -p 8080:8080), вы можете ожидать незначительного попадания в латентность, как показано ниже. Тем не менее теперь вы можете использовать сетевой стек хоста (например, docker run --net=host) при запуске контейнера Docker, который будет работать идентично столбцу Native (как показано в результатах латентности Redis ниже).

Docker NAT overhead

Они также провели тесты на задержку в нескольких конкретных сервисах, таких как Redis. Вы можете видеть, что выше 20 клиентских потоков, накладные расходы с наивысшей задержкой - Docker NAT, затем KVM, а затем приблизительный привязку к хосту Docker/native.

docker redis latency overhead

Просто потому, что это действительно полезная статья, вот некоторые другие цифры. Загрузите его для полного доступа.

Взглянув на Disk IO:

IO docker vs kvm vs native

Теперь посмотрим на издержки процессора:

docker cpu overhead

Теперь некоторые примеры памяти (прочитайте статью для деталей, память может быть сложной)

docker memory comparison

Ответ 2

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


Выбор докеров в терминах того, как он настраивает пространства имен для своих контейнеров, имеет затраты, но эти затраты напрямую связаны с преимуществами - вы можете отказаться от них, но при этом вы также отказываетесь от связанной выгоды:

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

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

Ответ 3

Вот еще тесты для Docker based memcached server по сравнению с host native memcached server с использованием инструмента сравнения Twemperf https://github.com/twitter/twemperf с 5000 соединениями и скоростью соединения 20 тыс.

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

Twemperf Docker Memcached

Connection rate: 9817.9 conn/s
Connection time [ms]: avg 341.1 min 73.7 max 396.2 stddev 52.11
Connect time [ms]: avg 55.0 min 1.1 max 103.1 stddev 28.14
Request rate: 83942.7 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 83942.7 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 28.6 min 1.2 max 65.0 stddev 0.01
Response time [ms]: p25 24.0 p50 27.0 p75 29.0
Response time [ms]: p95 58.0 p99 62.0 p999 65.0

Twemperf Centmin Mod Memcached

Connection rate: 11419.3 conn/s
Connection time [ms]: avg 200.5 min 0.6 max 263.2 stddev 73.85
Connect time [ms]: avg 26.2 min 0.0 max 53.5 stddev 14.59
Request rate: 114192.6 req/s (0.0 ms/req)
Request size [B]: avg 129.0 min 129.0 max 129.0 stddev 0.00
Response rate: 114192.6 rsp/s (0.0 ms/rsp)
Response size [B]: avg 8.0 min 8.0 max 8.0 stddev 0.00
Response time [ms]: avg 17.4 min 0.0 max 28.8 stddev 0.01
Response time [ms]: p25 12.0 p50 20.0 p75 23.0
Response time [ms]: p95 28.0 p99 28.0 p999 29.0

Здесь bencmarks с использованием тест-теста memtier

memtier_benchmark docker Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       16821.99          ---          ---      1.12600      2271.79
Gets      168035.07    159636.00      8399.07      1.12000     23884.00
Totals    184857.06    159636.00      8399.07      1.12100     26155.79

memtier_benchmark Centmin Mod Memcached

4         Threads
50        Connections per thread
10000     Requests per thread
Type        Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec
------------------------------------------------------------------------
Sets       28468.13          ---          ---      0.62300      3844.59
Gets      284368.51    266547.14     17821.36      0.62200     39964.31
Totals    312836.64    266547.14     17821.36      0.62200     43808.90