Тестирование производительности решений контейнерной виртуализации на OpenScaler 22.03 SP1

Наше сообщество всегда стремиться апробировать все технологические нововведения появляющиеся в нашем дистрибутиве-родителе под названием openEuler. Ведь всегда необходимо понимать какие технологические решения наиболее “совершенны” и готовы к применению в крупных ИТ инфраструктурах и будут наиболее востребованы для наших корпоративных пользователей.

Так было с системой централизованной настройки серверов на основе AI модели, именуемой ATune, обзорную статью по которой вы можете прочесть на сайте нашего сообщества по ссылке 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. В качестве объектов тестирования были отобраны следующие системы контейнеризации:

  1. Docker (версия 18) из репозитория OpenScaler 22.03 SP1

  2. Docker (версия 23) с сайта docker.com

  3. iSulad (lcr) из репозитория OpenScaler 22.03 SP1

  4. 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 будет наиболее интересен тем корпоративным пользователям чья ИТ инфраструктура насчитывает сотни контейнеров и более.