Яка вартість виконання контейнера Docker?


511

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

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

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



1
@GoloRoden це питання схоже, але не зовсім те саме. Я шукаю витрати на затримку з таких причин, як "передача мережі через додатковий рівень", тоді як прийнята відповідь на це питання стосується більше вимірювання витрат на контейнер + додаток.
Люк Хорстен

1
Гаразд, саме так. Я відмовився від свого закритого голосу.
Голо Роден

8
Я радий, що ти опублікував це. Це запитання не з’явилося в моєму пошуку. Стаття про вимірювання / метрику надзвичайно корисна: blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics
Люк Хоерстен

1
Це хороший сеанс під назвою "Контейнери Linux - віртуалізація NextGen для хмари", який розповідає про показники продуктивності, порівнюючи докер, KVM VM та голий метал: youtube.com/watch?v=a4oOAVhNLjU
shawmzhu

Відповіді:


449

Чудовий дослідницький документ IBM 2014 « Оновлене порівняння продуктивності віртуальних машин та контейнерів Linux » від Felter et al. забезпечує порівняння між голими металами, KVM та контейнерами Docker. Загальний результат такий: Docker майже ідентичний рідній продуктивності та швидший за KVM у кожній категорії.

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

Docker NAT накладні

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

Затримка докер Редіс накладні

Тільки тому, що це справді корисний папір, ось деякі інші цифри. Завантажте його для повного доступу.

Перегляд дискового вводу / виводу:

Докер проти KVM проти Native I / O Performance

Зараз дивимось на центральний процесор:

Докер CPU накладні

Тепер кілька прикладів пам’яті (детально прочитайте папір, пам'ять може бути дуже складною):

Порівняння пам'яті Докера


20
Що стосується номерів linpack, наведених у роботі ... відверто кажучи, мені важко повірити (не те, що я не вірю, що вони випромінювали linpack, але що я не вірю, що тест справді не вимірював нічого, окрім показників з плаваючою комою, як виконується). Основні накладні витрати від KVM - це компоненти емуляції апаратних засобів емуляції простору користувачів (які стосуються лише апаратних засобів, які не є процесором ); є значні накладні витрати під час пейджингу пам’яті… але сира плаваюча точка? Я хотів би поглянути на те, що там насправді відбувається - можливо, надмірна зміна контексту.
Чарльз Даффі

2
Виправлення для синтаксису поточного CLI Docker: --net=host(дві тире) та -p 8080:8080(нижній регістр 'p') для NAT.
bk0

6
Цитований документ IBM здається занадто орієнтованим на мережевий IO. Він ніколи не стосується контекстних комутаторів. Ми розглядали LXC і мусили швидко відмовитися від нього через збільшення добровільних контекстних комутаторів, що призводить до погіршення обробки додатків.
Ерік

3
Мені також цікаво діяти над файловою системою - наприклад, пошук у каталозі - це місце, де я б очікував побачити накладні витрати; блоковим читає, пише і намагається (що дані діаграми зосереджені в основному на) НЕ .
Чарльз Даффі

12
Я люблю діаграми одного кольору відтінку. Це так просто відрізнити
Віктор

104

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


Вибір Докера з точки зору того, як він налаштовує простори імен для своїх контейнерів, має витрати, але всі ці витрати безпосередньо пов’язані з вигодами - ви можете їх відмовитись, але при цьому ви також відмовитеся від супутньої вигоди:

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

І так далі. Наскільки ці фактично впливають на вас у вашому оточенні - з моделями доступу до мережі, обмеженнями пам’яті тощо - предмет, на який важко дати загальну відповідь.


2
Це хороша відповідь, але я шукаю більш конкретні цифри та орієнтири. Мені знайома вартість груп, але Докер - це більше, ніж ви вказали. Дякую за відповідь.
Люк Хорстен

6
Звичайно. Моя думка полягає в тому, що будь-які узагальнені орієнтири, які ви знайдете, будуть дуже обмеженими в застосуванні до будь-якого конкретного застосування - але це не означає, що я не згоден з людьми, які намагаються їх надати, а лише з тим, що їх слід приймати з обробкою столової ложки солі.
Чарльз Даффі

1
Таким чином, ви можете сказати, що KVM "не є віртуалізацією, це просто абстракція поверх викликів віртуальної технології x86".
Вад

10
@ Vad, існує угода про консенсус, яка повертається десятиліттями (до раннього впровадження IBM не-x86!), Що надання абстракції безпосередньо на апаратному рівні однозначно віртуалізація. Консенсус щодо термінології навколо простору імен на рівні ядра значно фрагментованіший - ми могли б вказувати на джерела, що сприяють нашим індивідуальним поглядам, - але, чесно кажучи, є корисні технічні розрізнення (як щодо характеристик безпеки, так і для продуктивності), що перехід на один термін затьмарює , тому я займаю свою позицію до тих пір, поки не буде досягнуто протилежного галузевого консенсусу.
Чарльз Даффі

@LukeHoersten, ... так, це не ті групи, які мають значну вартість, це набагато більше вмісту просторів імен мережі та файлової системи. Але скільки ці витрати залежать майже повністю від того, як налаштовано Docker - які конкретні програмні засоби ви використовуєте. З'єднання мостів набагато, значно дешевше, ніж NAT за замовчуванням, наприклад; а ефективність наборів різних файлових систем також значно відрізняється (а в деяких випадках кількість накладних витрат залежить від моделей використання; варіанти накладень можуть бути набагато дорожчі, якщо великі каталоги змінюються через кілька шарів f / e).
Чарльз Даффі

20

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

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

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

Ось орієнтири, що використовують інструмент меморіального орієнтиру

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

1
Вони порівнюють дві різні конструкції запам’ятовування, а також одну з них у докер, іншу поза докером, чи не так?
сень

4
Це результати з мережею хостів або мостовими мережами в докер?
akaHuman

13
З такими великими stddevs ці вимірювання не показують ніяких репрезентативних данихavg 200.5 min 0.6 max 263.2 stddev 73.85
Сергій Жуков
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.