systemd-nspawn이 docker, podman 및 qemu보다 느린 이유는 무엇입니까? ! nspawn 성능을 향상시키는 방법은 무엇입니까?

systemd-nspawn이 docker, podman 및 qemu보다 느린 이유는 무엇입니까? ! nspawn 성능을 향상시키는 방법은 무엇입니까?

왜 더 느리고 더 느린가요 nspawn? ! CPU 작업은 docker, podman 또는 qemu보다 두 배 더 오래 걸립니다.docker podmanqemu

제가 수행한 벤치마크는 다음과 같습니다.

먼저 다음 명령을 사용하여 호스트 커널(및 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이 왜 느린지 아시나요? 어떻게 개선할 수 있나요?

답변1

성능 문제는 nspawn의 시스템 호출을 화이트리스트에 추가하면 --system-call-filter성능이 향상될 것이라고 생각했기 때문입니다. 하지만 systemd에서 설명했듯이우편목록을 사용해야 합니다. export SYSTEMD_SECCOMP=0왜냐하면 nspawn이 화이트리스트에 등록할 때 시스템 호출을 계속 처리하기 때문입니다.

SYSTEMD_SECCOMPsystemd v247에 추가되었습니다(debian Buster에는 v241이 있지만 백포트 저장소에는 v247이 있습니다).

따라서 nspawn을 베어메탈 콘솔만큼 빠르게 만들려면:

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

이는 in 과 동일하며 --privileged사용되는 경우에는 docker/podman필요하지 않습니다 .--system-call-filterSYSTEMD_SECCOMP

물론 이는 보안에 좋지 않으므로 신뢰할 수 있는 코드를 실행할 때 안전한 환경에서만 수행하십시오.

baremetal, nspawn, docker, podman 또는 사용 중인 모든 항목의 성능을 향상시키는 최대 성능을 원한다면 위의 질문에서 했던 것처럼 모든 스펙터/멜트다운 완화를 비활성화하십시오(그러나 다음과 같은 경우 보안에도 좋지 않습니다. 예를 들어 광고가 포함된 브라우저와 같이 신뢰할 수 없는 코드를 실행하는 경우입니다.


자세한 내용은 다음을 읽어보세요.https://github.com/systemd/systemd/issues/18370

관련 정보