Docker

為什麼 systemd-nspawn 比 docker、podman 和 qemu 慢?!如何提高 nspawn 性能?

  • January 30, 2021

為什麼nspawndocker podman甚至慢qemu?!CPU 任務花費的時間是 docker、podman 或 qemu 的兩倍

這是我做的基準測試:

首先,我禁用了主機核心(以及 qemu 基準測試中的 qemu 來賓核心)中的所有幽靈/熔毀緩解措施:

GRUB_CMDLINE_LINUX_DEFAULT=noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off tsx=on tsx_async_abort=off mitigations=off spectre_v2_user=off spec_store_bypass_disable=off nx_huge_pages=off kvm.nx_huge_pages=off kvm-intel.vmentry_l1d_flush=never srbds=off

然後我使用了這個基準測試:

git clone https://github.com/tsuna/contextswitch
cd contextswitch
time make

nspawn以超全權限進行了測試:

export SYSTEMD_NSPAWN_USE_CGNS=0
systemd-nspawn  --keep-unit --register=no --boot --capability=all --private-users=false --system-call-filter="@default @aio @basic-io @chown @clock @cpu-emulation @debug @file-system @io-event @ipc @keyring @memlock @module @mount @network-io @obsolete @privileged @process @raw-io @reboot @resources @setuid @signal @swap @sync @system-service @timer" --bind=/sys/fs/cgroup  --machine=testtt -D busterdir

podman也用特權進行了測試:

podman run --rm -it --privileged debian:10 bash

docker也用特權進行了測試:

docker run --rm -it  --privileged  debian:10 bash

我測試qemu過:

qemu-system-x86_64 -name buster20210121210102 -m 2G -enable-kvm -cpu host -smp cores=4,threads=2,sockets=1 -object iothread,id=myio1 -device virtio-blk-pci,drive=mydisk0,iothread=myio1 -drive file=buster20210121210102.qcow2,if=none,id=mydisk0,format=qcow2,aio=native,cache=none

結果如下:

# baremetal
real    0m12.998s

# nspawn
real    0m30.777s  <==== :(

# docker
real    0m15.127s

#podman
real    0m15.207s

# qemu without mitigations
real    0m15.979s

在這裡,我填寫了一個改進 nspawn 性能的請求,其中包含完整的測試結果: https ://github.com/systemd/systemd/issues/18370

你知道為什麼 systemd-nspawn 比較慢嗎?我該如何改進它?

性能問題是因為我認為將 nspawn 的系統呼叫列入白名單--system-call-filter會提高性能,但正如他們在 systemd郵件列表中解釋我應該使用export SYSTEMD_SECCOMP=0的那樣,因為當我將它們列入白名單時 nspawn 仍將處理系統呼叫。

SYSTEMD_SECCOMP在 systemd v247 中添加(debian buster 有 v241,但 backport 儲存庫有 v247)。

所以要讓 nspawn 和裸機主機一樣快:

export SYSTEMD_SECCOMP=0
systemd-nspawn --capability=all -D ./bbusterboot --boot

this 等價於--privilegedin ,如果我們使用docker/podman,就不需要使用。--system-call-filter``SYSTEMD_SECCOMP

當然,這對安全性不利,因此僅在執行受信任的程式碼時在安全的環境中進行。

並且如果您想要最大性能來增加baremetal、nspawn、docker、podman 或您正在使用的任何東西的性能,那麼就像我在上面的問題中所做的那樣禁用所有的幽靈/熔毀緩解措施(但這也對安全性不利,如果您執行不受信任的程式碼,例如帶有廣告的瀏覽器)。


閱讀本文了解更多詳情:https ://github.com/systemd/systemd/issues/18370

引用自:https://unix.stackexchange.com/questions/630859