为什么nspawn比docker podman甚至qemu慢呢?!CPU任务所需时间是停靠、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=offthen我使用了这个基准测试:
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
你知道为什么系统-n产卵速度慢吗?我该如何改进呢?
发布于 2021-01-28 13:50:25
性能方面的问题是,我认为用--system-call-filter白化syscalls en with将提高性能,但是正如他们在systemd 邮件列表中解释的那样,我应该使用export SYSTEMD_SECCOMP=0,因为nspawn在白名单中仍然会处理syscalls。
SYSTEMD_SECCOMP是在systemd v247中添加的(debian有v241,后端存储库有v247)。
因此,要像裸金属主机一样快速地进行产卵:
export SYSTEMD_SECCOMP=0
systemd-nspawn --capability=all -D ./bbusterboot --boot这相当于docker/podman中的--system-call-filter,如果我们使用SYSTEMD_SECCOMP,则不需要使用D7。
当然,这对安全性不好,所以只在安全的环境中运行受信任的代码。
如果您想要最大的性能,这将增加性能的裸金属,nspawn,码头,podman或任何您正在使用,然后禁用所有幽灵/熔毁缓解,正如我在上面的问题(但这也不利于安全,如果你运行不受信任的代码,例如,广告的浏览器)。
有关更多详细信息,请阅读以下内容:https://github.com/systemd/systemd/issues/18370
https://unix.stackexchange.com/questions/630859
复制相似问题