为什么比 和甚至nspawn
慢?! CPU 任务花费的时间是 docker、podman 或 qemu 的两倍docker
podman
qemu
这是我所做的基准测试:
首先,我使用以下命令禁用了主机内核(以及 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
这相当于--privileged
in ,如果使用则docker/podman
无需使用。--system-call-filter
SYSTEMD_SECCOMP
当然,这对安全性不利,因此仅在运行受信任的代码时在安全的环境中执行此操作。
如果你想要最大的性能,这将增加 baremetal、nspawn、docker、podman 或你正在使用的任何东西的性能,那么禁用所有 spectre/meltdown 缓解措施,就像我在上面的问题中所做的那样(但这对安全性也不好,如果例如,您运行不受信任的代码,例如带有广告的浏览器)。
阅读此内容了解更多详细信息:https://github.com/systemd/systemd/issues/18370