なぜ遅くて遅いのですnspawn
か? ! CPU 操作は docker、podman、または qemu より 2 倍長くなります。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