實驗:
我跑sleep 1下strace -tt(所報道的所有系統呼叫的時間戳)在主機和QEMU客人,并注意到時間需要達到一定的系統呼叫(clock_nanosleep)是在客戶的情況下,幾乎兩倍:
- 主機上1.813 毫秒vs
- 來賓中為3.396 毫秒。
這是完整的主機 strace -tt sleep 1和完整的 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)
動車組:
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、磁盤等),因此沒有轉換層。我還嘗試多次運行該命令以確保可以快取的所有內容都快取在來賓中。
- 有沒有辦法加快速度?
更新:
- 隨著
cpupower frequency-set --governor performance時序為:- 主機:0.922ms
- 客人:1.412ms
- 影像在
/dev/shm(-drive file=/dev/shm/root) 中:- 主機:0.922ms
- 客人:1.280ms
聚苯乙烯
我修改了 strace 的“裸”輸出,以便它包括 (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
uj5u.com熱心網友回復:
這是預期的,考慮的方式strace來實作,即通過ptrace(2)系統呼叫:每次跟蹤行程執行系統呼叫或得到一個信號,該程序被強行時間停止,并且控制傳遞給跟蹤程序,這在案件strace做所有拆包和列印同步,即同時保持跟蹤程序停止。這種路徑會以指數方式增加任何仿真開銷。
strace跟蹤自身會很有啟發性——您將看到,在被跟蹤行程ptrace(PTRACE_SYSCALL, ...)處理并寫出與當前系統呼叫相關的所有內容之前,它不會讓被跟蹤行程繼續(使用)。
請注意,為了運行“瑣碎”sleep 1命令,動態聯結器甚至會在到達sleep二進制檔案的入口點之前執行幾十個系統呼叫。
我不認為優化strace值得花時間;如果您打算將 strace 作為審計而不是除錯工具運行(通過在下strace或類似下運行生產任務),您應該重新考慮您的設計;-)
uj5u.com熱心網友回復:
事實證明,我的(定制內核)缺少CONFIG_HYPERVISOR_GUEST=y選項(以及幾個嵌套選項)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353647.html
下一篇:為什么我的資料讀取器只回傳一行?
