在Xen進行測試或調優的時候,需要進行比較底層的細節分析(比如統計VMExit的頻率、VMExit的類型、VMExit消耗了多少CPU時間),這時就可以使用xentrace這個工具了。
xentrace是在xen原始碼中內建的一個工具,在“make tools”編譯時間就會預設產生。xentrace產生的資料是二進位的格式,人的肉眼不能直接讀取,可以使用xentrace_format轉換為凡人能夠直接讀取的資訊,xentrace_format解析後的資料資訊量一般也比較大,可能還需要自己編寫解析工具來提取自己需要的資料。
使用xentrace/xentrace_format來分析HVM的VMExit的情況,可以有如下操作:
| 代碼如下 |
複製代碼 |
# # start Xen HVM guest before this tracing # xentrace -D -e 0x81000 -T 30 trace.data # cat trace.data | xentrace_format xen.git/tools/xentrace/formats | ./my-xentrace-analyzer.pl |
其中-e 0×81000 是指“TRC_HVM_ENTRYEXIT”這類event的trace資訊,包括VMEntry和VMExit,關於其他各種event的代號是多少,可以參考文末的參考文檔;-T 30表示trace執行時間為30s。
使用xentrace_format時,需要一個格式檔案作為參數,一般可以選擇xen原始碼中的tools/xentrace/formats這個檔案。
另外,這裡我還有一個自己的指令碼提取自己感興趣的資料,得到結果樣本如下:
| 代碼如下 |
複製代碼 |
VMExit Count: 1117671 Type Total TSC TSC Ratio Total Count Count Ratio Avg TSC External Interrupt 2427891244 0.17 347544 0.31 6985 Interrupt window 20988 0.00 10 0.00 2098 HLT 9750387024 0.66 437459 0.39 22288 VMCALL 178912 0.00 10 0.00 17891 CR access 402600 0.00 72 0.00 5591 I/O Instruction 1041358192 0.07 30747 0.03 33868 PAUSE 35244752 0.00 8067 0.01 4369 Virtualized EOI 39250184 0.00 14425 0.01 2720 EPT violation 44358300 0.00 3179 0.00 13953 APIC write 1333734836 0.09 276158 0.25 4829 |
對於各種VMExit類型,可以參考Intel SDM 3C 中的附錄 Appendix C “VMX Basic Exit Reasons” 中的介紹。
xen社區中也做了一個解析xentrace資料的工具,叫做xenalyze(沒有在xen原始碼中,是offline維護著的一個repository),我就使用過一下,對其還不是很熟悉。
xenalyze的原始碼可以從http://xenbits.xen.org/ext/xenalyze/下載(使用hg clone命令)。
在使用時,注意的是,xenalyze中用到了CPU的頻率,需要根據自己CPU實際頻率進行修改,否則計算出來每秒鐘多少事件這樣的資訊就不準了。修改 xenalyze.c檔案中的“#define DEFAULT_CPU_HZ 2400000000LL”這一行(已經表示2.4GHz了)。