Второй подход к снаряду, iSula.
В продолжение нашей предыдущей статьи с которой вы могли уже ранее ознакомиться “Тестирование производительности решений контейнерной виртуализации на OpenScaler 22.03 SP1” со сравнением фирменной системы контейнерной виртуализации openEuler/OpenScaler именуемой iSula с Docker и Podman на архитектуре X86, предлагаем вашему вниманию ее продолжение, на сей раз аналогичное тестирование было проведено также для архитектуры ARM.
Надеемся результаты наших тестов окажутся полезными для всех пользователей контейнерной виртуализации и заинтересуют сообщество попробовать наше решение iSula.
Характеристики стенда для тестирования
Сервер x86
-
Сервер 1288H V5
-
CPU: Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz – 2шт, 20 ядер
-
RAM: 128 Гб
-
SSD: INTEL SSDPE2KE016T8 – 2 шт (NVMe)
-
OS: openScaler 22.03 LTS SP2
-
kernel: 5.10.0-153.12.0.92.os2203sp2.x86_64
Сервер aarch64
-
Сервер TaiShan 200 (Model 2280)
-
CPU: Kunpeng 920-4826 – 2шт, 96 ядер
-
RAM: 512 Гб
-
SSD: HUAWEI HWE52P433T2M005N – 4 шт (NVMe)
-
OS: openScaler 22.03 LTS SP2
-
kernel: 5.10.0-153.12.0.92.os2203sp2.aarch64
Используемые системы контейнеризации для сравнения
Для проведения тестов отобраны следующие системы контейнеризации:
-
Docker (версия 18.09.0) из репозитория OpenScaler 22.03 SP2
-
Docker (версия 24) с сайта docker.com
-
iSulad (версия 2.1.2) из репозитория OpenScaler 22.03 SP2
-
podman (версия 3.4.4) из репозитория OpenScaler 22.03 SP2
Используемая утилита для тестирования
Для проведения тестирования будем использовать утилиту — ptcr (https://gitee.com/openeuler/ptcr), которую применяли и в прошлом тестировании.
ptcr – это инструмент тестирования скорости выполнения операций над контейнерами.
При каждом тестировании будут проводится измерения времени (в миллисекундах) выполнения операций над контейнерами в двух режимах:
-
последовательный запуск (по 10 раз) команд create, start, stop, rm, run
-
параллельный запуск (по 100 одновременно) команд create, start, stop, rm, run
Для теста, в качестве контейнера выбран образ busybox:1.36.0 в котором будет запускаться команда echo и sleep в цикле.
Общая команда запуска тестов:
ptcr -c конфигурация_тестирования.yml > результат_теста.log
Для каждой системы контейнеризации мы готовим конфигурационный файл ptcr и запускаем тесты двух видов:
-
операции выполняются последовательно
-
операции выполняются параллельно
Типовой файл конфигурации ptcr для тестирования
Это шаблонный файл для утилиты ptcr. При выбранном типе тестирования мы проставляем нужное нам количество проходов, при этом у оставшегося типа ставим 0.
log_level : 9
image_name : busybox:1.36.0
mixed_cmd : 0
measure_count :
serially : <количество последовательных запусков - 10>
parallerlly : <количество параллельных запусков - 100>
runtime_names :
- <система контейнеризации. Сюда подставляем docker, затем isula, потом podman>
runtime_endpoint:
start_cmd :
- /bin/sh
- -c
- while true; do echo hello world; sleep 1; done
Пример запуска тестирования:
ptcr -c test_docker18.yaml
Инструкции по установке выбранных систем контейнеризации
Установка Docker (версия 18.09.0-325)
Ставим из официального репозитория OpenScaler:
dnf install docker-engine
Конфигурация docker — по умолчанию (файл /etc/docker/daemon.json отсутствует)
Вывод команды «docker info» для x86_64:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 18.09.0
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Hugetlb Pagesize: 2MB, 1GB, 2MB, 1GB (default is 2MB)
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d2dfb1444fe48c86b6bbb291358d5b3f581d3b82
runc version: N/A
init version: N/A (expected: )
Security Options:
seccomp
Profile: default
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.x86_64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: linux
Architecture: x86_64
CPUs: 40
Total Memory: 124.2GiB
Name: test-cont-x86
ID: BQT3:YGVD:KCLP:B44S:RUNH:6QUY:AHV3:JHOG:VJKT:2ZUJ:HPRD:2A2M
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: true
Вывод команды «docker info» для aarch64:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 18.09.0
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Hugetlb Pagesize: 2MB, 64KB, 32MB, 1GB, 64KB, 32MB, 2MB, 1GB (default is 2MB)
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d2dfb1444fe48c86b6bbb291358d5b3f581d3b82
runc version: N/A
init version: N/A (expected: )
Security Options:
seccomp
Profile: default
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.aarch64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: linux
Architecture: aarch64
CPUs: 96
Total Memory: 502.4GiB
Name: test-cont-arm
ID: V2SK:PICC:L7SA:RLOT:GMAB:2LQB:GRBI:DPKQ:HPNS:66DE:XGL5:QYCC
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: true
Установка Docker (версия 24.0.6)
Установку docker производим при помощи скаченного архива с официального сайта docker (https://docs.docker.com/engine/install/binaries/)
Качаем и распаковываем в /usr/local/bin версию 24.0.6
Для запуска выполняем в screen (или отдельном терминале):
/usr/local/bin/dockerd
Конфигурация docker — по умолчанию (файл /etc/docker/daemon.json отсутствует)
Вывод команды «docker info» для x86_64:
Client:
Version: 24.0.6
Context: default
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 24.0.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version: 7880925980b188f4c97b462f709d0db8e8962aff
runc version: v1.1.9-0-gccaecfc
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.x86_64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: linux
Architecture: x86_64
CPUs: 40
Total Memory: 124.2GiB
Name: test-cont-x86
ID: f736083f-0d3f-41d7-ab1b-f5761fd5eed4
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
Вывод команды «docker info» для aarch64:
Client:
Version: 24.0.6
Context: default
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 24.0.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7880925980b188f4c97b462f709d0db8e8962aff
runc version: v1.1.9-0-gccaecfc
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.aarch64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: linux
Architecture: aarch64
CPUs: 96
Total Memory: 502.4GiB
Name: test-cont-arm
ID: e357c9a5-3b10-4d70-aba8-44c2200eccf2
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
Установка iSulad (версия 2.1.2-4)
Ставим из официального репозитория:
dnf install iSulad
В дефолтный файл конфигурации «/etc/isulad/daemon.json» мы только добавляем строку с адресом общедоступного «registry: docker.io», чтобы мы имели возможность скачать образ, на котором происходит тестирование.
Содержимое конфигурационного файла /etc/isulad/daemon.json: { "group": "isula", "default-runtime": "lcr", "graph": "/var/lib/isulad", "state": "/var/run/isulad", "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": "gcr.io/google_containers/pause-amd64:3.0", "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" } }
Вывод команды «isula info» для x86_64:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 3
Server Version: 2.1.2
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Hugetlb Pagesize: 2MB
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.x86_64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: Linux
Architecture: x86_64
CPUs: 40
Total Memory: 124 GB
Name: test-cont-x86
iSulad Root Dir: /var/lib/isulad
Вывод команды «isula info» для aarch64:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 2.1.2
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Hugetlb Pagesize: 2MB
Kernel Version: 5.10.0-153.12.0.92.os2203sp2.aarch64
Operating System: openScaler 22.03 (LTS-SP2)
OSType: Linux
Architecture: aarch64
CPUs: 96
Total Memory: 502 GB
Name: test-cont-arm
iSulad Root Dir: /var/lib/isulad
Установка podman (версия 3.4.4-1)
Ставим из официального репозитория:
dnf install podman
Конфигурация podman — по умолчанию
Вывод команды «podman info» для x86_64:
host:
arch: amd64
buildahVersion: 1.23.1
cgroupControllers:
- cpuset
- cpu
- cpuacct
- blkio
- memory
- devices
- freezer
- net_cls
- perf_event
- net_prio
- hugetlb
- pids
- rdma
cgroupManager: cgroupfs
cgroupVersion: v1
conmon:
package: conmon-2.1.0-1.os2203sp2.x86_64
path: /usr/bin/conmon
version: 'conmon version 2.1.0, commit: unknown'
cpus: 40
distribution:
distribution: '"openScaler"'
version: "22.03"
eventLogger: file
hostname: test-cont-x86
idMappings:
gidmap: null
uidmap: null
kernel: 5.10.0-153.12.0.92.os2203sp2.x86_64
linkmode: dynamic
logDriver: k8s-file
memFree: 128389836800
memTotal: 133311049728
ociRuntime:
name: crun
package: crun-1.4.5-1.os2203sp2.x86_64
path: /usr/bin/crun
version: |-
crun version 1.4.5
commit: c381048530aa750495cf502ddb7181f2ded5b400
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL
os: linux
remoteSocket:
path: /run/podman/podman.sock
security:
apparmorEnabled: false
capabilities: CAP_AUDIT_WRITE,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_MKNOD,CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
rootless: false
seccompEnabled: true
seccompProfilePath: ""
selinuxEnabled: true
serviceIsRemote: false
slirp4netns:
executable: ""
package: ""
version: ""
swapFree: 4294963200
swapTotal: 4294963200
uptime: 337h 39m 58.08s (Approximately 14.04 days)
plugins:
log:
- k8s-file
- none
network:
- bridge
- macvlan
volume:
- local
registries:
search:
- docker.io
store:
configFile: /etc/containers/storage.conf
containerStore:
number: 1
paused: 0
running: 0
stopped: 1
graphDriverName: overlay
graphOptions: {}
graphRoot: /var/lib/containers/storage
graphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
Using metacopy: "false"
imageStore:
number: 1
runRoot: /run/containers/storage
volumePath: /var/lib/containers/storage/volumes
version:
APIVersion: 3.4.4
Built: 1688699448
BuiltTime: Fri Jul 7 06:10:48 2023
GitCommit: ""
GoVersion: go1.17.3
OsArch: linux/amd64
Version: 3.4.4
Вывод команды «podman info» для aarch64:
host:
arch: arm64
buildahVersion: 1.23.1
cgroupControllers:
- cpuset
- cpu
- cpuacct
- blkio
- memory
- devices
- freezer
- net_cls
- perf_event
- net_prio
- hugetlb
- pids
- rdma
cgroupManager: cgroupfs
cgroupVersion: v1
conmon:
package: conmon-2.1.0-1.os2203sp2.aarch64
path: /usr/bin/conmon
version: 'conmon version 2.1.0, commit: unknown'
cpus: 96
distribution:
distribution: '"openScaler"'
version: "22.03"
eventLogger: file
hostname: test-cont-arm
idMappings:
gidmap: null
uidmap: null
kernel: 5.10.0-153.12.0.92.os2203sp2.aarch64
linkmode: dynamic
logDriver: k8s-file
memFree: 536282198016
memTotal: 539410370560
ociRuntime:
name: crun
package: crun-1.4.5-1.os2203sp2.aarch64
path: /usr/bin/crun
version: |-
crun version 1.4.5
commit: c381048530aa750495cf502ddb7181f2ded5b400
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL
os: linux
remoteSocket:
path: /run/podman/podman.sock
security:
apparmorEnabled: false
capabilities: CAP_AUDIT_WRITE,CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_MKNOD,CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT
rootless: false
seccompEnabled: true
seccompProfilePath: ""
selinuxEnabled: true
serviceIsRemote: false
slirp4netns:
executable: ""
package: ""
version: ""
swapFree: 4294963200
swapTotal: 4294963200
uptime: 3h 2m 33.62s (Approximately 0.12 days)
plugins:
log:
- k8s-file
- none
network:
- bridge
- macvlan
volume:
- local
registries:
search:
- docker.io
store:
configFile: /etc/containers/storage.conf
containerStore:
number: 0
paused: 0
running: 0
stopped: 0
graphDriverName: overlay
graphOptions: {}
graphRoot: /var/lib/containers/storage
graphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
Using metacopy: "false"
imageStore:
number: 1
runRoot: /run/containers/storage
volumePath: /var/lib/containers/storage/volumes
version:
APIVersion: 3.4.4
Built: 1688704391
BuiltTime: Fri Jul 7 07:33:11 2023
GitCommit: ""
GoVersion: go1.17.3
OsArch: linux/arm64
Version: 3.4.4
Результаты тестирования
Для начала продемонстрируем цифры, которые мы получили выполнив тестирование в последовательном режиме выполнения команд. Напоминаем, что все приведённые в таблице времена — в миллисекундах.
Сначала для платформы x86_64:
Docker 18
action |
count |
total spent |
average spent |
Create |
10 |
340 |
33 |
Start |
10 |
2923 |
293 |
Stop |
10 |
276 |
27 |
Remove |
10 |
294 |
29 |
Run |
10 |
2570 |
255 |
Docker 24
action |
count |
total spent |
average spent |
Create |
10 |
162 |
16 |
Start |
10 |
2768 |
282 |
Stop |
10 |
128 |
11 |
Remove |
10 |
125 |
12 |
Run |
10 |
1849 |
184 |
iSula
action |
count |
total spent |
average spent |
Create |
10 |
275 |
27 |
Start |
10 |
666 |
66 |
Stop |
10 |
189 |
19 |
Remove |
10 |
202 |
20 |
Run |
10 |
814 |
81 |
Podman
action |
count |
total spent |
average spent |
Create |
10 |
1293 |
129 |
Start |
10 |
2385 |
237 |
Stop |
10 |
1320 |
132 |
Remove |
10 |
1298 |
129 |
Run |
10 |
2301 |
230 |
Сведём все результаты средних времён исполнения команд на график:
И тоже самое проделаем для платформы aarch64:
Docker 18
action |
count |
total spent |
average spent |
Create |
10 |
476 |
47 |
Start |
10 |
5170 |
522 |
Stop |
10 |
396 |
39 |
Remove |
10 |
415 |
41 |
Run |
10 |
4098 |
411 |
Docker 24
action |
count |
total spent |
average spent |
Create |
10 |
210 |
21 |
Start |
10 |
4382 |
452 |
Stop |
10 |
360 |
14 |
Remove |
10 |
164 |
16 |
Run |
10 |
2940 |
296 |
iSula
action |
count |
total spent |
average spent |
Create |
10 |
313 |
31 |
Start |
10 |
742 |
75 |
Stop |
10 |
260 |
26 |
Remove |
10 |
265 |
26 |
Run |
10 |
855 |
83 |
podman
action |
count |
total spent |
average spent |
Create |
10 |
1405 |
140 |
Start |
10 |
2899 |
287 |
Stop |
10 |
1413 |
141 |
Remove |
10 |
1408 |
140 |
Run |
10 |
2545 |
244 |
Опять строим график:
Теперь покажем цифры, которые мы получили выполнив тестирование в параллельном режиме выполнения команд.
Сначала для платформы x86_64:
Docker 18
action |
count |
total spent |
average spent |
Create |
100 |
29848 |
298 |
Start |
100 |
929666 |
9299 |
Stop |
100 |
17580 |
173 |
Remove |
100 |
14578 |
145 |
Run |
100 |
508926 |
5091 |
Docker 24
action |
count |
total spent |
average spent |
Create |
100 |
7904 |
78 |
Start |
100 |
922778 |
9226 |
Stop |
100 |
8679 |
86 |
Remove |
100 |
7735 |
77 |
Run |
100 |
510300 |
5104 |
iSula
action |
count |
total spent |
average spent |
Create |
100 |
15931 |
159 |
Start |
100 |
56085 |
561 |
Stop |
100 |
13326 |
133 |
Remove |
100 |
8480 |
84 |
Run |
100 |
73895 |
739 |
podman
action |
count |
total spent |
average spent |
Create |
100 |
72423 |
726 |
Start |
100 |
540928 |
5434 |
Stop |
100 |
137177 |
1376 |
Remove |
100 |
92813 |
928 |
Run |
100 |
460135 |
4628 |
Так же строим график для всех тестируемых систем контейнеризации, отобразив на нём средние времена исполнения операций:
Для платформы aarch64:
Docker 18
action |
count |
total spent |
average spent |
Create |
100 |
27587 |
276 |
Start |
100 |
1887944 |
18922 |
Stop |
100 |
133297 |
1303 |
Remove |
100 |
16055 |
160 |
Run |
100 |
978317 |
9791 |
Docker 24
action |
count |
total spent |
average spent |
Create |
100 |
9260 |
92 |
Start |
100 |
1914956 |
19143 |
Stop |
100 |
10775 |
105 |
Remove |
100 |
10614 |
106 |
Run |
100 |
812521 |
8122 |
iSula
action |
count |
total spent |
average spent |
Create |
100 |
18355 |
183 |
Start |
100 |
78823 |
789 |
Stop |
100 |
12154 |
121 |
Remove |
100 |
11452 |
114 |
Run |
100 |
87489 |
874 |
podman
action |
count |
total spent |
average spent |
Create |
100 |
104077 |
1042 |
Start |
100 |
457883 |
4591 |
Stop |
100 |
152524 |
1526 |
Remove |
100 |
99193 |
993 |
Run |
100 |
216471 |
2171 |
График выполнения команд:
Итог проведённых тестов
Давайте сведём в единую таблицу результаты средних времён полученных в результате тестирования.
Сначала рассмотрим для платформы x86_64.
При сравнении мы получаем следующую картину:
Из результатов таблицы (в таблице приведены средние значения времени в миллисекундах, затраченных на операции при тестировании) видно, что iSula быстрее docker (версии 18.09) как в последовательном, так и в параллельном режиме выполнения команд.
В сравнении с docker (версии 24.0.6) iSulad показал себя быстрее на операциях start, run.
В противостоянии же с podman, видно подавляющее преимущество iSula по всем командам сравнения.
Теперь рассмотрим результаты тестирования для платформы aarch64.
Мы видим приблизительно такую же картину, что и на платформе x86_64, но отставание iSulad от docker (версии 24) в выполнении команд create, stop, remove незначительно сократилось, а преимущество в выполнении команд start и run значительно выше.
И напоследок можно привести общий график сравнения средних времён выполнения операций create, start, stop, remove, run на платформах x86_64 и aarch64: