![systemd-nspawn이 docker, podman 및 qemu보다 느린 이유는 무엇입니까? ! nspawn 성능을 향상시키는 방법은 무엇입니까?](https://linux55.com/image/186908/systemd-nspawn%EC%9D%B4%20docker%2C%20podman%20%EB%B0%8F%20qemu%EB%B3%B4%EB%8B%A4%20%EB%8A%90%EB%A6%B0%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20!%20nspawn%20%EC%84%B1%EB%8A%A5%EC%9D%84%20%ED%96%A5%EC%83%81%EC%8B%9C%ED%82%A4%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
왜 더 느리고 더 느린가요 nspawn
? ! CPU 작업은 docker, podman 또는 qemu보다 두 배 더 오래 걸립니다.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이 왜 느린지 아시나요? 어떻게 개선할 수 있나요?
답변1
성능 문제는 nspawn의 시스템 호출을 화이트리스트에 추가하면 --system-call-filter
성능이 향상될 것이라고 생각했기 때문입니다. 하지만 systemd에서 설명했듯이우편목록을 사용해야 합니다. 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
이는 in 과 동일하며 --privileged
사용되는 경우에는 docker/podman
필요하지 않습니다 .--system-call-filter
SYSTEMD_SECCOMP
물론 이는 보안에 좋지 않으므로 신뢰할 수 있는 코드를 실행할 때 안전한 환경에서만 수행하십시오.
baremetal, nspawn, docker, podman 또는 사용 중인 모든 항목의 성능을 향상시키는 최대 성능을 원한다면 위의 질문에서 했던 것처럼 모든 스펙터/멜트다운 완화를 비활성화하십시오(그러나 다음과 같은 경우 보안에도 좋지 않습니다. 예를 들어 광고가 포함된 브라우저와 같이 신뢰할 수 없는 코드를 실행하는 경우입니다.
자세한 내용은 다음을 읽어보세요.https://github.com/systemd/systemd/issues/18370