Что дают системные контейнеры в реальности? Где их стоит применять?
С момента появления технологии контейнерной виртуализации внимание пользователей к ней привлекали лучшая производительность и плотность размещения виртуальных сред по сравнению с традиционными гипервизорами. И сегодня, когда инфраструктура контейнеров уже доказала свою состоятельность для размещения даже критически важных нагрузок, имеет смысл поговорить о том, какие именно приложения могут получить самые значительные преимущества от работы в контейнерах.
Контейнеры, виртуальные машины, серверы — кто быстрее?
В маркетинговых листовках можно часто встретить заявления, что контейнеры могут быть «такими же быстрыми, как и физические серверы». С одной стороны, это близко к действительности, так как виртуализация и изоляция контейнеров требует минимум ресурсов физических серверов для работы — по крайней мере по сравнению с виртуальными машинами.
Однако это однобокое утверждение — рассматривающее только один фактор из множества. К примеру, в отдельных ситуациях контейнеры и виртуальные машины могут показать более высокую производительность, чем физические серверы, на которых они запущены. Мы видели ситуации, когда множественные копии одного и того же приложения, запущенные просто на физическом сервере, показывают меньшую производительность, чем при загрузке в несколько контейнеров или виртуальных машин, но с одним и только одним приложением внутри.
Подобные результаты связаны со многими факторами — такими как технологии де-дупликации одинаковых участков памяти в контейнерах или виртуальных машинах; лучшая эффективность дискового кэша и локальность NUMA (так называемой архитектуры с неравномерной памятью) — когда виртуализация может привязать контейнер к одному NUMA узлу и получив большую производительность в результате.
Кроме того, современные гипервизоры создают сравнительно небольшую нагрузку на процессор, в частности, благодаря аппаратной поддержке, реализованной на уровне процессора, количество дополнительных процедур, выполняемых гипервизоров для обслуживания ВМ, оказывается небольшим. Поэтому, если вы запустите какое-то приложение на отдельном компьютере и на виртуальной машине с правильно настроенным гипервизором отличия скорее будут незначительными по всем категориям — производительность ЦП, памяти, хранилища данных и сети.
Однако, мы говорим совсем не о реальной жизненной ситуации (поскольку запуск одной виртуальной машины на компьютере — это скорее сценарий для настольного компьютера, а не для сервера), и сравнивать таким образом работу виртуальных, контейнерных и физических нагрузок некорректно. Но рассмотренный пример показывает, что производительность виртуальных машин, так же, как и контейнеров, может быть очень близкой к производительности «чистого железа» — все зависит от условий. Но это, безусловно, не означает, что контейнеры и виртуальные машины одинаково хороши для любых задач. И вот несколько примеров которые это показывают.
Реальные условия
Перед вами график теста производительности, в котором создается несколько групп виртуальных серверов, в которых запускаются набор приложений, каждое со своей уникальной нагрузкой (т.н. Consolidation Stack Unit (CSU)). Каждый сервер в группе выдает свои результаты, такие как количество транзакций в секунду. Потом мы суммируем эти данные, чтобы получить общий результат для каждой технологии виртуализации, сравнивая ситуации, когда эти приложения запускаются на одном и том же «железе» —, но с использованием различных средств виртуализации. В данном случае мы сравниваем возможности виртуальных машин и системных контейнеров, а увеличение количества CSU дает нам возможность сравнить работу этих технологий при разных уровнях нагрузки.
Как вы можете видеть, до момента пиковой производительности контейнеры и виртуальные машины показывают очень близкие результаты, разница в производительности ограничивается единицами процентов. Однако, когда дело доходит до полной загрузки процессора, отличия становятся очевидными. Если у центрального процессора не остается свободных циклов, он не может выделить время для обслуживания гипервизора без ущерба приложению, и поэтому производительность экосистемы виртуальных машин перестает расти раньше, чем экосистемы контейнеров. Далее происходит следующее: виртуальные машины первыми исчерпывают системную память. Дело в том, что ВМ представляют собой «черный ящик» для гипервизора, в то время как в случае контейнеров содержимое прозрачно и операционная система может воспользоваться иначе неиспользуемой памятью, а также убрать дубликаты (копии файлов, загруженных в память многократно). Поэтому контейнеры в отличие от виртуальных машин не показывают снижения производительности с дальнейшим ростом количества CSU (безусловно, до определенного предела).
Вот еще один тест, на отличия еще более очевидны. Так называемый, сценарий «DVD-store» напоминает по характеру нагрузки vConsolidate, но работа идет с приложением электронного магазина.
Здесь мы видим еще более заметные отличия, которые объясняются особенностью конкретного приложения. Конечно, далеко не во всех случаях разница между контейнерами и виртуальными машинами будет столь разительной. К факторам, обеспечивающим лучшую производительность контейнеров по сравнению с виртуальными машинами, можно добавить еще несколько:
Во-первых, контейнеры обеспечивают максимально быстрый запуск системы — буквально за доли секунды. И это очень важно для микросервисов, которые постоянно запускаются, уничтожаются и создаются заново. Также этот фактор оказывает положительное влияние на любые гранулярные нагрузки, в рамках которых можно запускать нагрузки для решения небольших задач.
Во-вторых, системные контейнеры Virtuozzo OS обладают уникальной функцией «pfcache». Проще говоря система обеспечивает объединение идентичных файлов из разных контейнеров в момент их загрузки в память. В результате происходит одновременно снижение общего потребления оперативной памяти и повышение производительности ввода/вывода за счет лучшего кеширования — поскольку в кэше приходится держать меньше копий файлов, система может держать больше уникальных файлов — ускоряя доступ к ним.
Но не все контейнеры одинаковы. В частности, по данным тестов системные контейнеры Virtuozzo 7 демонстрируют максимальную плотность по сравнению с любым другим решением для виртуализации Linux — на несколько процентов выше чем предыдущая версия (Virtuozzo 6) и примерно в два раза выше чем виртуальные машины на основе KVM. Для нас это крайне важно — производительность платформы — это одна из основных причин почему наши клиенты выбирают Virtuozzo вместо других платформ. Несколько процентов может превратиться в серьезные суммы, когда речь идет о площадках в тысячи серверов — поэтому наша цель всегда показывать производительность лучше, чем аналоги, на всех приложениях и системах включая Windows.
Сценарии из реальной жизни
Можно выделить несколько сценариев где использование системных контейнеров, и в частности, наших новых контейнеров Virtuozzo 7 может показать максимальные преимущества:
Сценарий 1. Контейнеры крайне полезны, когда серверы работают на максимальной нагрузке, особенно если к 100% приближается не только утилизация ресурсов процессоров, но и оперативной памяти. На самом деле это очень типичный случай при запуске систем анализа данных или пакетной обработки информации. И если вы не оставляете резервной производительности для пиковых нагрузок, контейнеры помогут «выжать» максимум из имеющегося оборудования.
Сценарий 2. Вы запускаете множественные копии одного и того же или похожих приложений. В этом случае pfcache может значительно улучшить работу всей экосистемы, освобождая память и оптимизируя процессы ввода/вывода.
Сценарий 3. При запуске многопоточных веб-северов, а также при создании множества виртуальных процессоров (значительно превышающих количество физических) для разных виртуальных машин происходит постоянная смена контекста. Обработка мелких запросов пользователей и переключение процессора на обработку задач разных ВМ оказывается требовательной к ресурсам и снижению производительности в случае с традиционными ВМ.
Сценарий 4. Наличие мелких задач в большом количестве, работающих одновременно, и конкурирующих за ресурсы. В этом случае каждая виртуальная машина будет создавать свою дополнительную нагрузку на память (для загрузки ядра и структур гипервизора). И чем больше будет отдельных процессов, тем больше польза от применения контейнеров ОС.
Курс на эффективность
Не во всех случаях контейнеры дают принципиальные преимущества, но в своем спектре задач они действительно серьезно превосходят возможности гипервизоров с виртуальными машинами. Они полезны для микросервисов, многокомпонентных веб-приложений, задач анализа данных и других сфер применения с высокой гранулярностью и нагрузкой.
Более того, мы продолжаем улучшать характеристики Virtuozzo Containers, и версия 7 позволила улучшить как плотность размещения контейнеров, так и производительность на том же оборудовании. Обновление ядра Linux для решений Virtuozzo позволило изначально встроить в решение такие инструменты как CRIU для живой миграции контейнеров или Kpatch для обновления ядра без остановки работы сервисов. Так что к преимуществам системных контейнеров, как технологии в целом, сегодня добавляются новые, уникальные возможности, которые делают их еще более интересным решением для реальных бизнес-задач.