Несмотря на то, что контейнеры используются уже много лет, не у всех есть понимание, какие накладные расходы они в себе несут. Просматривал сегодня ленту Хабр Q&A и увидел пару вопросов на тему производительности БД (
1,
2). Написавшие вопрос заметили, что в контейнере производительность базы данных заметно ниже, чем на железе или в виртуальной машине.
Дело тут может быть вот в чем. Основные накладные расходы в данной ситуации - в работе сети. И конечная производительность будет зависеть именно от нее. По работе CPU никаких накладных расходов в работе БД нет. Это подтверждают
исследования от Percona, где один из разработчиков протестировал работу базы в разных режимах и выяснил, что основной ovehead добавляет сеть. Если вы запустите контейнер с параметром
--net=host, то получите сопоставимую производительность с работой на железе.
Кому лень читать всю статью на английском, приведу сразу результаты:
1. Железо - 7100 транзакций в секунду. Это максимум.
2. БД в контейнере, подключение с хоста через замапленный tcp порт - 2200 транз/c. Самый слабый результат, так как подключение идет через проброс порта в iptables.
3. БД в контейнере, который подключен напрямую в сеть хоста через net=host, подключение с хоста. Результат - те же самые 7100 транз/c.
4. БД в контейнере, подключение из другого контейнера. Контейнеры соединены между собой через docker bridge. Результат - 6300 транз/c.
Так что делайте выводы сами, как вы будете работать с базой данных в докере. Кстати, на эту тему рекомендую хоть и немного устаревший, но очень крутой доклад -
https://www.youtube.com/watch?v=7CR5eH6a8Fo