如何使用Xperf堆栈审核来查明内核性能问题?

日期: 2012-01-05 作者:Bruce Mackenzie-Low翻译:Mark 来源:TechTarget中国 英文

监控Windows操作系统的内核来诊断性能问题可能是一次颇具挑战的尝试。Perfmon、PAL和Xperf当然可以显示这个操作系统在内核模式下花费了多少时间,但是我们如何决定内核的什么部分(函数调用)正在消耗大部分的时间呢?   在过去,有必要促使多次崩溃转储来试图找出内核中花费时间的地方。通过推动一次内存转储,调试程序可以显示现有线程的堆栈踪迹来确定该操作系统在哪里执行。这可以帮助识别哪个线程调用了什么函数,从而解决过量的内核模式时间。

一定还有更简单的方式!   堆栈审核   幸运的是,的确有更简单的方式:堆栈审核。该功能是Windows事件跟踪(ETW, Event Tracing for……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

监控Windows操作系统的内核来诊断性能问题可能是一次颇具挑战的尝试。Perfmon、PAL和Xperf当然可以显示这个操作系统在内核模式下花费了多少时间,但是我们如何决定内核的什么部分(函数调用)正在消耗大部分的时间呢?

  在过去,有必要促使多次崩溃转储来试图找出内核中花费时间的地方。通过推动一次内存转储,调试程序可以显示现有线程的堆栈踪迹来确定该操作系统在哪里执行。这可以帮助识别哪个线程调用了什么函数,从而解决过量的内核模式时间。一定还有更简单的方式!

  堆栈审核

  幸运的是,的确有更简单的方式:堆栈审核。该功能是Windows事件跟踪(ETW, Event Tracing for Windows)的一部分。这个Xperf工具用来启用堆栈审核功能,它内置在Windows中,为遭遇多种内核函数或事件的线程收集堆栈踪迹。这可以实现配置内核的哪个部分来为线程收集堆栈踪迹。堆栈审核可用于原始事件,如程序和线程创建、文件和注册操作,还有内存分配。发布命令Xperf,帮助堆栈审核查看支持堆栈审核的内核事件(标记)的列表。

  例如,试想该服务器正在经历高内核模式时间,这似乎是由过量的注册更新引起。Xperf可以显示哪个线程正在调用哪个注册函数。Xperf还会总结数据来显示执行一个特定函数的时间百分比,给它一个权重。权重越高,该函数执行的频率越高。这让管理员可以根据正在执行的线程及它们的频率来配置内核函数。

  例如,以下的Xperf标记在注册事件发生时可用于堆栈跟踪:

RegQueryKey RegEnumerateKey RegEnumerateValueKey

RegDeleteKey RegCreateKey RegOpenKey

RegSetValue RegDeleteValue RegQueryValue

RegQueryMultipleValue RegSetInformation RegFlush

RegKcbCreate RegKcbDelete RegVirtualize

RegCloseKeystackwalk

  跟踪注册事件的一个典型系列的Xperf命令可能如下所示:

  1.启动事件收集。

xperf -on SysProf+REGISTRY –stackwalk

RegQueryKey+RegEnumerateKey+RegDeleteKey+RegCreateKey+RegOpenKey+RegSetValue+

RegDeleteValue+RegQueryValue+RegQueryMultipleValue+RegSetInformation+RegFlush+

RegKcbCreate+RegVirtualize+RegCloseKey

  2.复制该问题。

  3.停止收集。

xperf –d stacks.etl

  结果会是一个叫做stacks.etl的文件,它通过Xperf命令可以查看:

    xperf stacks.etl

  配置和加载符号

  在调用堆栈信息可查看前,有必要建立符号路径。符号路径告诉Xperf要引用互联网上微软的符号服务器,所以该工具可以查阅模块和函数名称。这允许Xperf概述所有调用堆栈信息来显示哪个函数被哪个线程执行。

  有多种方式来完成它。SET命令或者控制面板中的系统程序都可以用来搭建系统环境变量_NT_SYMBOL_PATH.或者“配置符号路径”。不管是什么程序建立的这个符号路径,它都应该指向下面的URL:

  _NT_SYMBOL_PATH= srv*C:symbols*http://msdl.microsoft.com/downloads/symbols

建立符号路径之后,有必要“加载”这些符号。Xperf会到微软的符号服务器并下载所有需要的符号文件来解开模块和函数名称的引用。有多种方法来加载符号:使用跟踪下拉菜单,选择“加载符号”,或者如下所示右击一个图像然后选择“加载符号”:

Windows操作系统,性能问题,Xperf堆栈审核,内核性能
图1: Windows性能分析器

  查看结果

  配置符号路径并加载符号之后,查看堆栈审核数据来发现哪个程序调用了什么函数。其中一张图表会是“CPU采样”图,你可以右击该图表选择“概览表”。这会产生一张表,概括他们调用的程序和函数,在事件收集过程中,它们都与规定的ETW提供商及堆栈审核标记相关。

  在之前的例子中,我们使用Xperf在注册函数上收集数据,因为我们假设地怀疑是它导致了高内核模式时间。这不是Xperf能做的全部,对于其它支持堆栈审核标记的内核组件,收集数据都和文件系统、程序创建以及内存分配一样简单。在图2中,注意regedit.exe进程如何负责大部分注册访问。你可以确定被调用的实际注册函数,它们通过扩展“+”来显示调用堆栈。

Windows操作系统,性能问题,Xperf堆栈审核,内核性能
图2:显示调用函数

  虽然该工具运用起来相当直观,还是有很多可用的帮助。如需帮助,引用帮助文件:

  C:Program filesMicrosoft Windows Performance ToolkitWindowsPerformanceToolkit.chm

  解决内核模式性能问题从来不是一项简单的任务。但是有了Xperf和ETW等工具,很多推测工作可以通过使用内核堆栈审核隔离该问题来避免。

相关推荐