实验:
我在主机和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
3条答案
按热度按时间deikduxw1#
原来我的(定制内核)缺少
CONFIG_HYPERVISOR_GUEST=y
选项(和几个嵌套选项)。wlzqhblo2#
考虑到
strace
的实现方式(即通过ptrace(2)
系统调用),这是意料之中的:每次被跟踪进程执行系统调用或获得信号时,进程都会被强制 * 停止 *,并将控制权传递给跟踪进程,在strace
的情况下,跟踪进程会 * 同步 * 执行所有解包和打印,即同时保持被跟踪进程停止。这种路径会成倍地增加仿真开销。这对跟踪
strace
本身很有启发性--您将看到,在处理并写出与当前系统调用相关的所有内容之前,不会让跟踪的进程继续(使用ptrace(PTRACE_SYSCALL, ...)
)。请注意,为了运行一个“平凡的”
sleep 1
命令,动态链接器甚至在到达sleep
二进制文件的入口点之前,就要执行几十次系统调用。我认为优化
strace
不值得花时间;如果您计划将strace作为一个审计工具而不是调试工具运行(通过在strace
或类似环境下运行生产任务),您应该重新考虑您的设计;- )yftpprvb3#
在我的mac上运行qemu,我发现在 bash 命令行中“sleep 1”通常需要10秒,而“sleep 2”通常需要5秒。至少在6.0.8的archlinux上用 time 测量是这样的。奇怪的是,当 sleep 不工作时,time 似乎正确地测量了时间的流逝。
但我一直在跑
然后阅读了-icount参数,我发现下面的语句使睡眠非常准确。
我在这里提到它是因为我对 qemu 和 slow**sleep 1 的搜索首先把我引到了这里。