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

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

为什么比 和甚至nspawn慢?! CPU 任务花费的时间是 docker、podman 或 qemu 的两倍docker podmanqemu

这是我所做的基准测试:

首先,我使用以下命令禁用了主机内核(以及 qemu 基准测试中的 qemu 来宾内核)中的所有 spectre/meltdown 缓解措施:

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 速度较慢吗?我该如何改进它?

答案1

性能问题是因为我认为将 nspawn 的系统调用列入白名单--system-call-filter会提高性能,但正如他们在 systemd 中向我解释的那样邮件list 我应该使用export SYSTEMD_SECCOMP=0,因为当我将它们列入白名单时,nspawn 仍然会处理系统调用。

SYSTEMD_SECCOMP已添加到 systemd v247 中(debian buster 有 v241,但向后移植存储库有 v247)。

因此,要使 nspawn 与裸机主机一样快:

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

这相当于--privilegedin ,如果使用则docker/podman无需使用。--system-call-filterSYSTEMD_SECCOMP

当然,这对安全性不利,因此仅在运行受信任的代码时在安全的环境中执行此操作。

如果你想要最大的性能,这将增加 baremetal、nspawn、docker、podman 或你正在使用的任何东西的性能,那么禁用所有 spectre/meltdown 缓解措施,就像我在上面的问题中所做的那样(但这对安全性也不好,如果例如,您运行不受信任的代码,例如带有广告的浏览器)。


阅读此内容了解更多详细信息:https://github.com/systemd/systemd/issues/18370

相关内容