linux 在QEMU中,在平凡的'sleep 1'的情况下,是什么导致了开销?

xggvc2p6  于 2022-11-22  发布在  Linux
关注(0)|答案(3)|浏览(212)

实验:

我在主机和QEMU访客中的strace -tt(报告所有系统调用的时间戳)下运行sleep 1,注意到到达某个系统调用(clock_nanosleep)所需的时间几乎是访客的两倍:

*主机上为1.813毫秒,而
*3.396ms在客。

这里是full host strace -tt sleep 1,这里是full QEMU strace -tt sleep 1 .
下面是一些摘录,您可以从中看到不同之处:
主持人:

Time    diff      timestamp (as reported by strace)
0.000 / 0.653 ms: 13:13:56.452820 execve("/usr/bin/sleep", ["sleep", "1"], 0x7ffded01ecb0 /* 53 vars */) = 0
0.653 / 0.023 ms: 13:13:56.453473 brk(NULL)               = 0x5617efdea000
0.676 / 0.063 ms: 13:13:56.453496 arch_prctl(0x3001 /* ARCH_??? */, 0x7fffeb7041b0) = -1 EINVAL (Invalid argument)

QEMU:

Time    diff      timestamp (as reported by strace)
0.000 / 1.008 ms: 12:12:03.164063 execve("/usr/bin/sleep", ["sleep", "1"], 0x7ffd0bd93e50 /* 13 vars */) = 0
1.008 / 0.119 ms: 12:12:03.165071 brk(NULL)               = 0x55b78c484000
1.127 / 0.102 ms: 12:12:03.165190 arch_prctl(0x3001 /* ARCH_??? */, 0x7ffcb5dfd850) = -1 EINVAL (Invalid argument)

问题:

  • 是什么导致速度变慢和开销?它没有使用任何硬件(如GPU,磁盘等),所以没有转换层。我还尝试运行了几次命令,以确保可以缓存的所有内容都缓存在guest虚拟机中。
  • 有没有办法加快速度?

更新:

  • 对于cpupower frequency-set --governor performance,时序为:
  • 主机:0.922毫秒
  • 访客:1.412毫秒
  • 使用/dev/shm-drive file=/dev/shm/root)格式的图像:
  • 主机:0.922毫秒
  • 访客:1.280毫秒

PS版

为了便于理解,我修改了strace的“bare”输出,使其包含(1)从0开始的第一次系统调用的时间,后跟(2)系统调用的持续时间。
我是这样开始qemu的:

qemu-system-x86_64 -enable-kvm -cpu host -smp 4 -m 4G -nodefaults -no-user-config -nographic -no-reboot \
   -kernel $HOME/devel/vmlinuz-5.13.0-20-generic \
   -append 'earlyprintk=hvc0 console=hvc0 root=/dev/sda rw' \
   -drive file=$HOME/devel/images/root,if=ide,index=0,media=disk,format=raw \
   -device virtio-serial,id=virtio-serial0 -chardev stdio,mux=on,id=host-io,signal=off -device virtconsole,chardev=host-io,id=console0
deikduxw

deikduxw1#

原来我的(定制内核)缺少CONFIG_HYPERVISOR_GUEST=y选项(和几个嵌套选项)。

wlzqhblo

wlzqhblo2#

考虑到strace的实现方式(即通过ptrace(2)系统调用),这是意料之中的:每次被跟踪进程执行系统调用或获得信号时,进程都会被强制 * 停止 *,并将控制权传递给跟踪进程,在strace的情况下,跟踪进程会 * 同步 * 执行所有解包和打印,即同时保持被跟踪进程停止。这种路径会成倍地增加仿真开销。
这对跟踪strace本身很有启发性--您将看到,在处理并写出与当前系统调用相关的所有内容之前,不会让跟踪的进程继续(使用ptrace(PTRACE_SYSCALL, ...))。
请注意,为了运行一个“平凡的”sleep 1命令,动态链接器甚至在到达sleep二进制文件的入口点之前,就要执行几十次系统调用。
我认为优化strace不值得花时间;如果您计划将strace作为一个审计工具而不是调试工具运行(通过在strace或类似环境下运行生产任务),您应该重新考虑您的设计;- )

yftpprvb

yftpprvb3#

在我的mac上运行qemu,我发现在 bash 命令行中“sleep 1”通常需要10秒,而“sleep 2”通常需要5秒。至少在6.0.8的archlinux上用 time 测量是这样的。奇怪的是,当 sleep 不工作时,time 似乎正确地测量了时间的流逝。
但我一直在跑

qemu-system-x86_64 \
    -m 1G \
    -nic user,hostfwd=tcp::10022-:22 \
    img1.cow

然后阅读了-icount参数,我发现下面的语句使睡眠非常准确。

qemu-system-x86_64 \
    -icount shift=auto,sleep=on \
    -m 1G \
    -nic user,hostfwd=tcp::10022-:22 \
    img1.cow

我在这里提到它是因为我对 qemuslow**sleep 1 的搜索首先把我引到了这里。

相关问题