為什麼 systemd-nspawn 比 docker、podman 和 qemu 慢?!如何提高 nspawn 性能?
為什麼
nspawn
比docker
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 等價於
--privileged
in ,如果我們使用docker/podman
,就不需要使用。--system-call-filter``SYSTEMD_SECCOMP
當然,這對安全性不利,因此僅在執行受信任的程式碼時在安全的環境中進行。
並且如果您想要最大性能來增加baremetal、nspawn、docker、podman 或您正在使用的任何東西的性能,那麼就像我在上面的問題中所做的那樣禁用所有的幽靈/熔毀緩解措施(但這也對安全性不利,如果您執行不受信任的程式碼,例如帶有廣告的瀏覽器)。