Тестирование производительности решений контейнерной виртуализации на OpenScaler 22.03 SP1
Наше сообщество всегда стремиться апробировать все технологические нововведения появляющиеся в нашем дистрибутиве-родителе под названием openEuler. Ведь всегда необходимо понимать какие технологические решения наиболее “совершенны” и готовы к применению в крупных ИТ инфраструктурах и будут наиболее востребованы для наших корпоративных пользователей.
Так было с системой централизованной настройки серверов на основе AI модели, именуемой A–Tune, обзорную статью по которой вы можете прочесть на сайте нашего сообщества по ссылке https://openscaler.ru/2023/04/03/a-tune_overview/ .
На сей раз предлагаем вам ознакомиться с результатами тестирования решений контейнерной виртуализации доступными в нашем дистрибутиве OpenScaler, в том числе с фирменным решением под названием iSula.
iSula — это фирменное контейнерное решение от сообщества OpenEuler. Название решения происходит от вида муравьев «исула». Этого муравья также называют «муравей-пуля» за его стремительный и очень болезненный укус, который сравнивают с попаданием пули. В нашем дистрибутиве OpenScaler поддерживаются как классический движок Docker так и облегченный контейнерный движок iSulad.
Кроме того, в зависимости от сценария применяются следующие форматы контейнера:
-
Стандартные контейнеры, применяемые в большинстве распространенных сценариев.
-
Безопасные контейнеры, применимые к строгой изоляции и многопользовательским сценариям.
-
Системные контейнеры, применяемые в сценариях, в которых службы управляются с помощью systemd.
В сравнении с Docker, iSulad представляет собой новое контейнерное решение с унифицированной архитектурой. Облегченные контейнеры реализованы посредством языка C/C++.
Архитектурная схема решения представлена на рисунке 1.
Рисунок 1 – Архитектура решения iSula
iSulad это OCI-совместимый механизм выполнения контейнеров, отличающийся простотой, надежностью, производительностью и малым весом.
Как daemon процесс, он управляет всем жизненным циклом контейнера хост-системы, включая передачу и хранение образов, выполнение контейнера и управление мониторингом, управление ресурсами контейнера и управление сетью.
iSulad предоставляет пользователям интерфейс командной строки, похожий на Docker.
iSulad предоставляет API-интерфейс gRPC, соответствующиq стандарту CRI для Kubernetes.
iSulad поддерживает несколько сред выполнения (runtime) контейнеров, включая lxc, runc и kata.
-
lxc — среда выполнения контейнера с открытым исходным кодом, написанная на C, является средой выполнения iSulad по умолчанию.
-
runc — среда совместимая с OCI, написанная на GO. При использовании runc, версия спецификации среды выполнения OCI должна быть не ниже 1.0.0.
-
kata-runtime запускает безопасные контейнеры с облегченными виртуальными машинами.
iSulad предоставляет два разных интерфейса для операций управления образами и контейнерами: CLI и CRI.
-
CLI – стандартная модель архитектуры C/S. iSula работает как независимый клиент командной строки, взаимодействующий с демоном iSulad.
-
CRI (Container Runtime Interface) реализующий взаимодействие с K8s.
Интерфейс CRI реализован на базе gRPC. iSulad внедрил CRI gRPC Server в соответствии со стандартами интерфейса CRI. CRI gRPC Server включает в себя службу runtime и службу images, которые используются для предоставления runtime интерфейса контейнера и интерфейса работы с images соответственно. Сервер CRI gRPC прослушивает локальный сокет unix, а kubelet компонента K8s работает как клиент gRPC.
Но вернемся к тестированию.
Характеристики стенда тестирования
Тестирование решений контейнерной виртуализации проводилось на физических серверах следующей конфигурации:
-
Сервер Huawei 2288H V5
-
CPU: Intel(R) Xeon(R) Gold 6240R CPU @ 2.40GHz – 2шт, 96 ядер
-
RAM: 384 Гб
-
SSD: INTEL SSDPE2KE016T8 – 2 шт (NVMe)
-
OS: openScaler 22.03 LTS SP1
-
kernel: 5.10.0-136.22.0.98.os2203sp1.x86_64
Для проведения тестов использовалась последняя на текущий момент LTS версия дистрибутива OpenScaler – 22.03 LTS SP-1. В качестве объектов тестирования были отобраны следующие системы контейнеризации:
-
Docker (версия 18) из репозитория OpenScaler 22.03 SP1
-
Docker (версия 23) с сайта docker.com
-
iSulad (lcr) из репозитория OpenScaler 22.03 SP1
-
podman (runc) из репозитория OpenScaler 22.03 SP1
Три системы являются официально поддерживаемыми операционной системой OpenScaler и входят в состав официальных репозиториев. Docker версии 23 был загружен непосредственно с сайта сообщества с целью сравнения с наиболее актуальной (последней) версией продукта.
Используемый инструментарий тестирования
Для проведения тестирования использовалась утилита тестирования решений контейнерной виртуализации – ptcr
ptcr – это инструмент тестирования скорости выполнения операций над контейнерами как в последовательном, так и в параллельном режиме исполнения команд.
Утилита предназначена для тестирования скорости выполнения типовых команд над контейнером, в том числе включающих:
-
create
-
start
-
stop
-
rm
-
run
При тестировании проводились измерения времени выполнения этих команд в двух режимах:
-
последовательный запуск 10 контейнеров
-
параллельный запуск 100 контейнеров
Для теста, в качестве контейнера выбран образ busybox:1.36.0 в котором будет запускаться команда sleep в цикле.
Сам процесс тестирования запускается представленной ниже командой
ptcr -c конфиг_теста.yml > результат_теста.log
Для каждой системы контейнеризации запускались тесты двух видов:
-
операции выполняются последовательно
-
операции выполняются параллельно
После проведения тестирования каждой системы физический сервер в обязательном порядке перезагружался
Типовой конфигурационный файл для тестирования
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : <количество последовательных запусков>
parallerlly : <количество параллельных запусков>
runtime_names :
- <система контейнеризации>
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Инструкции по установке и тестированию выбранных систем контейнерной виртуализации
Установка и тестирование Docker (Версия 18)
Установка производится штатным образом из официального репозитория:
dnf install docker-engine
rpm -qa | grep docker
docker-engine-18.09.0-316.os2203sp1.x86_64
Конфигурационный файл /etc/docker/daemon.json:
{
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"]
}
Запуск тестов
Последовательный запуск
Конфигурационный файл теста 01-01-ptcr-docker18-ser.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 10
parallerlly : 0
runtime_names :
- docker
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 01-ptcr-docker18-ser.yml > 01-ptcr-docker18-ser.log
Результаты теста:
Fri Apr 21 11:12:14 2023
unit: msec
------------------------------------------------------------------
TargetName:docker Type: searially
------------------------------------------------------------------
action |count |total spent |average spent
Create |10 |282 |28
Start |10 |2503 |253
Stop |10 |242 |24
Remove |10 |242 |24
Run |10 |2325 |232
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: docker
count: 10
Total shim mem: 120028kb
------------------------------------------------------------------
Параллельный запуск
Конфигурационный файл теста 01-02-ptcr-docker18-par.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 0
parallerlly : 100
runtime_names :
- docker
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 02-ptcr-docker18-par.yml > 02-ptcr-docker18-par.log
Результаты теста:
Fri Apr 21 11:13:35 2023
unit: msec
------------------------------------------------------------------
TargetName:docker Type: parallerlly
------------------------------------------------------------------
action |count |total spent |average spent
Create |100 |16629 |166
Start |100 |870560 |8704
Stop |100 |11046 |109
Remove |100 |10381 |103
Run |100 |485748 |4858
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: docker
count: 10
Total shim mem: 119676kb
------------------------------------------------------------------
Установка и тестирование Docker (Версия 23)
Установка производится с официального сайта docker (бинарный вариант)
Загружаем и распаковываем в /usr/local/bin версию 23.0.4
Для запуска выполняем в screen (или отдельном терминале):
/usr/local/bin/dockerd
Конфигурационный файл /etc/docker/daemon.json:
{
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"]
}
Запуск тестов
Последовательный запуск
Конфигурационный файл теста 02-01-ptcr-docker23-ser.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 10
parallerlly : 0
runtime_names :
- docker
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 02-01-ptcr-docker23-ser.yml > 02-01-ptcr-docker23-ser.log
Результаты теста:
Fri Apr 21 11:42:44 2023
unit: msec
------------------------------------------------------------------
TargetName:docker Type: searially
------------------------------------------------------------------
action |count |total spent |average spent
Create |10 |144 |14
Start |10 |2491 |250
Stop |10 |120 |11
Remove |10 |111 |11
Run |10 |1995 |198
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: docker
count: 10
Total shim mem: 107480kb
------------------------------------------------------------------
Параллельный запуск
Конфигурационный файл теста 02-02-ptcr-docker23-par.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 0
parallerlly : 100
runtime_names :
- docker
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
ptcr -c 02-02-ptcr-docker23-par.yml > 02-02-ptcr-docker23-par.log
Результаты теста:
Fri Apr 21 11:43:58 2023
unit: msec
------------------------------------------------------------------
TargetName:docker Type: parallerlly
------------------------------------------------------------------
action |count |total spent |average spent
Create |100 |4148 |41
Start |100 |888984 |8889
Stop |100 |5579 |55
Remove |100 |4766 |47
Run |100 |521767 |5219
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: docker
count: 10
Total shim mem: 101780kb
------------------------------------------------------------------
Установка и тестирование iSulad (lcr)
Установка производится штатным образом из официального репозитория:
dnf install iSulad
rpm -qa | grep iSula
iSulad-2.0.18-1.os2203sp1.x86_64
Конфигурационный файл /etc/isulad/daemon.json:
{
"group": "isula",
"default-runtime": "lcr",
"graph": "/var/lib/isulad",
"state": "/var/run/isulad",
"engine": "lcr",
"log-level": "ERROR",
"pidfile": "/var/run/isulad.pid",
"log-opts": {
"log-file-mode": "0600",
"log-path": "/var/lib/isulad",
"max-file": "1",
"max-size": "30KB"
},
"log-driver": "stdout",
"container-log": {
"driver": "json-file"
},
"hook-spec": "/etc/default/isulad/hooks/default.json",
"start-timeout": "2m",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": [
"docker.io"
],
"insecure-registries": [
],
"pod-sandbox-image": "",
"native.umask": "normal",
"network-plugin": "",
"cni-bin-dir": "",
"cni-conf-dir": "",
"image-layer-check": false,
"use-decrypted-key": true,
"insecure-skip-verify-enforce": false,
"cri-runtimes": {
"kata": "io.containerd.kata.v2"
}
}
Запуск тестов
Последовательный запуск
Конфигурационный файл теста 03-01-ptcr-isula-lcr-ser.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 10
parallerlly : 0
runtime_names :
- isula
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 03-01-ptcr-isula-lcr-ser.yml > 03-01-ptcr-isula-lcr-ser.log
Результаты теста:
Fri Apr 21 12:28:23 2023
unit: msec
------------------------------------------------------------------
TargetName:isula Type: searially
------------------------------------------------------------------
action |count |total spent |average spent
Create |10 |199 |19
Start |10 |509 |50
Stop |10 |153 |15
Remove |10 |158 |15
Run |10 |578 |57
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: isula
count: 10
Total shim mem: 28272kb
------------------------------------------------------------------
Параллельный запуск
Конфигурационный файл теста 03-02-ptcr-isula-lcr-par.yml:
log_level : 3
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 0
parallerlly : 100
runtime_names :
- isula
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 03-02-ptcr-isula-lcr-par.yml > 03-02-ptcr-isula-lcr-par.log
Результаты теста:
Fri Apr 21 12:28:59 2023
unit: msec
------------------------------------------------------------------
TargetName:isula Type: parallerlly
------------------------------------------------------------------
action |count |total spent |average spent
Create |100 |6049 |60
Start |100 |36399 |364
Stop |100 |6370 |63
Remove |100 |5866 |58
Run |100 |45126 |451
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: isula
count: 10
Total shim mem: 28348kb
------------------------------------------------------------------
Установка и тестирование Podman (runc)
Установка производится штатным образом из официального репозитория:
dnf install podman
rpm -qa | egrep ‘podman|runc|cont’
containers-common-1.5.2-1.os2203sp1.x86_64
container-selinux-2.138-4.os2203sp1.noarch
docker-runc-1.1.3-9.os2203sp1.x86_64
containernetworking-plugins-1.1.1-1.os2203sp1.x86_64
podman-0.10.1-12.os2203sp1.x86_64
Запуск тестов
Последовательный запуск
Конфиг теста 04-01-ptcr-podman-ser.yml:
log_level : 3
image_name : docker.io/library/busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 10
parallerlly : 0
runtime_names :
- podman
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 04-01-ptcr-podman-ser.yml > 04-01-ptcr-podman-ser.log
Результаты теста:
Fri Apr 21 16:07:07 2023
unit: msec
------------------------------------------------------------------
TargetName:podman Type: searially
------------------------------------------------------------------
action |count |total spent |average spent
Create |10 |446 |44
Start |10 |1904 |191
Stop |10 |239 |24
Remove |10 |1105 |111
Run |10 |1763 |177
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: podman
count: 10
Total shim mem: 20176kb
------------------------------------------------------------------
Параллельный запуск
Конфигурационный файл теста 04-02-ptcr-podman-par.yml:
log_level : 3
image_name : docker.io/library/busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : 0
parallerlly : 100
runtime_names :
- podman
runtime_endpoint:
#- unix:///var/run/isulad.sock
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Сам запуск теста:
ptcr -c 04-02-ptcr-podman-par.yml > 04-02-ptcr-podman-par.log
Результаты теста:
Fri Apr 21 16:28:33 2023
unit: msec
------------------------------------------------------------------
TargetName:podman Type: parallerlly
------------------------------------------------------------------
action |count |total spent |average spent
Create |100 |970263 |9752
Start |100 |696223 |6968
Stop |100 |16836 |167
Remove |100 |436423 |4365
Run |100 |876185 |8764
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
TargetName: podman
count: 10
Total shim mem: 20144kb
------------------------------------------------------------------
Итоги проведенных сравнительных тестирований
Таблица сравнения: насколько процентов iSulad быстрее (зелёное поле) или медленнее (красное поле).
Из результатов таблицы (в таблице приведены средние значения времени в миллисекундах, затраченных на операции при тестировании) видно, что iSula быстрее docker (версии 18.09.0) как в последовательном, так и в параллельном режиме выполнения команд.
В сравнении с docker (версии 23.0.4) iSulad показал себя быстрее на операциях start, run. В противостоянии же с podman, видно подавляющее преимущество iSula по всем командам сравнения.
Для удобства восприятия приведём диаграммы:
1. последовательного выполнения команд
2. и параллельного выполнения команд
Таким образом стоит отметить успешность тестирования решения iSula и ее объективные преимущества при выполнении штатных операций над контейнерами становящиеся очевидными при возрастащем количестве контейнеров. Инструмент iSula будет наиболее интересен тем корпоративным пользователям чья ИТ инфраструктура насчитывает сотни контейнеров и более.