监控Windows操作系统的内核来诊断性能问题可能是一次颇具挑战的尝试。Perfmon、PAL和Xperf当然可以显示这个操作系统在内核模式下花费了多少时间,但是我们如何决定内核的什么部分(函数调用)正在消耗大部分的时间呢? 在过去,有必要促使多次崩溃转储来试图找出内核中花费时间的地方。通过推动一次内存转储,调试程序可以显示现有线程的堆栈踪迹来确定该操作系统在哪里执行。这可以帮助识别哪个线程调用了什么函数,从而解决过量的内核模式时间。
一定还有更简单的方式! 堆栈审核 幸运的是,的确有更简单的方式:堆栈审核。该功能是Windows事件跟踪(ETW, Event Tracing for……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
在过去,有必要促使多次崩溃转储来试图找出内核中花费时间的地方。通过推动一次内存转储,调试程序可以显示现有线程的堆栈踪迹来确定该操作系统在哪里执行。这可以帮助识别哪个线程调用了什么函数,从而解决过量的内核模式时间。一定还有更简单的方式!
堆栈审核
幸运的是,的确有更简单的方式:堆栈审核。该功能是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会到微软的符号服务器并下载所有需要的符号文件来解开模块和函数名称的引用。有多种方法来加载符号:使用跟踪下拉菜单,选择“加载符号”,或者如下所示右击一个图像然后选择“加载符号”:
图1: Windows性能分析器
查看结果
配置符号路径并加载符号之后,查看堆栈审核数据来发现哪个程序调用了什么函数。其中一张图表会是“CPU采样”图,你可以右击该图表选择“概览表”。这会产生一张表,概括他们调用的程序和函数,在事件收集过程中,它们都与规定的ETW提供商及堆栈审核标记相关。
在之前的例子中,我们使用Xperf在注册函数上收集数据,因为我们假设地怀疑是它导致了高内核模式时间。这不是Xperf能做的全部,对于其它支持堆栈审核标记的内核组件,收集数据都和文件系统、程序创建以及内存分配一样简单。在图2中,注意regedit.exe进程如何负责大部分注册访问。你可以确定被调用的实际注册函数,它们通过扩展“+”来显示调用堆栈。
图2:显示调用函数
虽然该工具运用起来相当直观,还是有很多可用的帮助。如需帮助,引用帮助文件:
C:Program filesMicrosoft Windows Performance ToolkitWindowsPerformanceToolkit.chm
解决内核模式性能问题从来不是一项简单的任务。但是有了Xperf和ETW等工具,很多推测工作可以通过使用内核堆栈审核隔离该问题来避免。
相关推荐
-
微软非Windows操作系统Midori有望2014年推出
微软公司曾经开发的非Windows操作系统Midori操作系统项目的开发工作进入了实质性阶段,在为最终的面世做准备。
-
高效存储非难题:Server 8中的重复数据删除功能
重复数据删除不是什么新鲜事。虽然如此,但在Windows操作系统中一直没有自己的重复数据删除功能。但是这种情况随着Windows Server 8的发布就要改变了。
-
微软Windows 8客户端及服务器端OS首发在即
微软本周将在BUILD大会上展示Windows的最产品,届时,微软将让开发者们首次见到下一代的Windows 8客户端和服务器端操作系统软件平台。
-
Windows 8测试版面市临近 你准备好了吗?
一直有消息泄露微软Windows 8操作系统的开发进程,昨天,Windows部门主管Steven Sinofsky终于通过其MSDN博客透露了Windows 8 Beta版发布的时间。