Второй подход к снаряду, 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

Используемые системы контейнеризации для сравнения

Для проведения тестов отобраны следующие системы контейнеризации:

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

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

  3. iSulad (версия 2.1.2) из репозитория OpenScaler 22.03 SP2

  4. 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: