在Xen进行测试或调优的时候,需要进行比较底层的细节分析(比如统计VMExit的频率、VMExit的类型、VMExit消耗了多少CPU时间),这时就可以使用xentrace这个工具了。
xentrace是在xen源代码中自带的一个工具,在“make tools”编译时就会默认生成。xentrace生成的数据是二进制的格式,人的肉眼不能直接读取,可以使用xentrace_format转换为凡人能够直接读取的信息,xentrace_format解析后的数据信息量一般也比较大,可能还需要自己编写解析工具来提取自己需要的数据。
使用xentrace/xentrace_format来分析HVM的VMExit的情况,可以有如下操作:
1 2 3 |
# # 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 0x81000 是指“TRC_HVM_ENTRYEXIT”这类event的trace信息,包括VMEntry和VMExit,关于其他各种event的代号是多少,可以参考文末的参考文档;-T 30表示trace执行时间为30s。
使用xentrace_format时,需要一个格式文件作为参数,一般可以选择xen源代码中的tools/xentrace/formats这个文件。
另外,这里我还有一个自己的脚本提取自己感兴趣的数据,得到结果示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
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了)。
参考资料:
xentrace和xen_format:http://support.citrix.com/article/CTX121583
xentrace和xenalyze:http://blog.xen.org/index.php/2012/09/27/tracing-with-xentrace-and-xenalyze/
xenalyze的设计:http://www.slideshare.net/xen_com_mgr/5-xs-asia11gdunlapxenalyze
博主您好,请教个问题
我在学习xen的调试技术,参考了
http://zhigang.org/wiki/XenDebugging#send-debug-keys-to-xen-by-xm-debug-http://docs.huihoo.com/xen/summit/2012/aug27/7a-from-printk-to-qemu.pdf
我想用gdb对hypervisor进行调试,
现在用minicom连接串口输出正常,输入3次ctrl+a后也正确显示了
(XEN) *** Serial input -> Xen (type 'CTRL-a' three times to switch input to DOM0)
但是按照zhigang介绍的,输入ctrl+\ 却没有进入kdb
按照summit2012介绍的,输入%,确实显示
(XEN) '%' pressed -> trapping into debugger
但是在gdb中,设置
(gdb)target remote /dev/ttyS2
gdb的响应却是:
Remote debugging using /dev/ttyS2
Ignoring packet error, continuing...
warning: unrecognized item "SBFTBLt" in "qSupported" response
Ignoring packet error, continuing...
等等
Malformed response to offset query, timeout
请问您尝试过类似的方法吗,知道是怎么回事吗
我调试的版本是xen-4.1.2
先谢过啦
不好意思,我没用gdb调试xen,不清楚哦。