如何找到高延迟过程调用的根本原因?

Ben*_*jol 41 troubleshooting windows-vista dpc

我有一个双核处理器,两者之一始终为 100%。在 ProcessExplorer 中查看显示它是延迟过程调用。在网上阅读似乎给了我很多不同的答案。

是否可以制定几个步骤来尝试缩小我的情况下可能出现的问题?

更新 1: FWIW,即使在安全模式下问题仍然存在。

更新 2:我从 PC 背面拔掉了所有我能用的东西,这让我多了 40% 的免费处理器。我还下载了RATTV3 工具,但由于某种原因,在我的机器上它没有给我一个驱动程序故障。此处对 DPCLatencyChecker 和 RATTV3 都有很好的描述。

更新 3:LatencyMon(见下面我的回答)告诉我它是nvstor32.sys- 这是 NVidia 的 SATA 驱动程序 - 时间约为 5300 微秒。

更新 4:情节变厚,在考虑是否尝试启动恢复磁盘(看看它是否真的是驱动程序,而不是硬件问题)时,我注意到 DVD/CD 播放器不工作(即甚至没有打开当我按下按钮时门)。考虑到机器刚刚更换了主板,我想他们可能忘记插上电源了。我打开盒子,一切看起来都很好,但我拔掉了电源,然后又重新插上了。重新启动时,一切都很好 - 不再有 DPC(现在最高 300 微秒)!

更新 5:第二天,问题又回来了,CD 播放器无法再次工作,甚至密码文本框中的光标也在慢动作闪烁......尝试拔掉我能想到的所有东西,并在第二次重新启动时再次工作(如更新 2 )。下次我要尝试完全拔掉 CD 播放器...

更新 6:刚刚注意到系统事件日志nvstor32.sys给出了一个错误,说Parity error detected in \Device\RaidPort0,然后是关于发送重新初始化的警告。现在只需要确定哪个RaidPort0是......(注意,我没有设置 RAID,它只是一个沼泽标准 Acer)。哦,我的 Avast 设置在我执行系统回滚(或其他任何调用)时显然被杀死了,因为它无法启动(RPC 错误),也无法卸载(发生了 setiface 错误)。

更新 7:终于有时间在拔掉 DVD 的情况下重新启动。没有更多的 DPC 问题!(虽然有很多页面错误,但那是以后的事)。下一步:确定是电缆还是 DVD 播放器。

更新 8:借用 SATA 电缆,用它启动,没问题。CD/DVD 播放器工作正常,没有 DPC 问题nvstor32.sys,没有处理器阻塞。快乐的结局......几乎:我仍然遇到 Avast 问题storport.sys,启动时明显的 DPC 问题(对于 USB 来说可能是正常的?),以及许多硬页面错误。但这些将成为其他问题的主题。

后记:我最近开始遇到同样的问题,并使用相同的方法,设法将其追踪到正在拍摄的 U 盘(我用于 ReadyBoost 的 U 盘)。

Ian*_*oyd 44

这是我如何找到高 DPC 延迟原因的故事。


我的系统在声音播放过程中遇到咔嗒声和砰砰声。我知道这意味着内核模式中的某些东西正在占用 CPU。我的第一个想法是浏览 Process Explorer,看看是否有任何不合适的地方。唯一引起我注意的是执行延迟过程调用(DPC) 所花费的过多时间:

显示高 DPC 时间的 Process Explorer 的屏幕截图

我知道 DPC 是在驱动程序中运行的代码;挑战在于找出哪个驱动程序。我求助于DPC Latency Checker,它向我展示了延迟有多严重:

DPC 延迟检查器的屏幕截图

DPC Latency Checker建议在设备管理器查看设备,将非必要硬件(如网卡、声卡)一一禁用,希望能隔离有问题的驱动。(如果您禁用设备,并且 DPC 延迟突然下降:您已经找到了罪魁祸首!)

禁用设备的屏幕截图

不幸的是,在禁用了所有可能的功能之后(同时仍然可以使用计算机——不要禁用您的硬盘驱动器、视频卡、鼠标或插入鼠标的 USB 集线器!),延迟仍然很高。接下来,我转向了Windows Performance ToolkitWindows SDK 的一部分),以及 Peter Weiland 的一篇出色的博客文章“测量 DPC 时间”。安装 Windows 性能工具包后:

Windows SDK 安装程序的屏幕截图,其中选择了 Windows Performance Toolkit

我打开了一个提升的命令提示符并运行:

>xperf -on Latency
Run Code Online (Sandbox Code Playgroud)

注意:该Latency 是一预定义的事件,可以从内核组 提供程序进行跟踪:

>xperf -providers kg
   Base           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+PROFILE+MEMINFO
   Diag           : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER+COMPACT_CSWITCH
   DiagEasy       : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PERF_COUNTER
   Latency        : PROC_THREAD+LOADER+DISK_IO+HARD_FAULTS+DPC+INTERRUPT+CSWITCH+PROFILE
   ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下Latency对应于内核标志:

  • PROC_THREAD进程和线程创建/删除
  • LOADER内核和用户模式图像加载/卸载事件
  • PROFILE CPU 样本配置文件
  • CSWITCH上下文切换
  • DPC DPC 事件
  • INTERRUPT中断事件
  • DISK_IO磁盘输入/输出
  • HARD_FAULTS硬页面错误

让它运行一分钟后,我停止了跟踪,并将其保存到一个文件中:

C:\Users\Ian\Desktop\xperf -d thingy1.etl
Run Code Online (Sandbox Code Playgroud)

然后我使用以下命令查看了跟踪结果:

C:\Users\Ian\Desktop\xperf thingy1.etl
Run Code Online (Sandbox Code Playgroud)

这将加载图形化的Windows 性能分析器。右键单击DPC CPU Usage图,我选择了Summary Table。这显示了驱动程序在 DPC 上花费的时间细分:

XPerf 输出的屏幕截图

我马上就可以看到一个驱动程序 ( tsvp.sys) 每次 DPC 执行平均需要 2.8 毫秒,这比任何其他驱动程序慢一个数量级:

截屏

谷歌搜索tsvp.sys给了我答案:CommView,我最近安装了它。

现在的问题是如何禁用此驱动程序。使用AutoRuns,我可以看到它已安装为驱动程序服务:

自动运行截图

使用设备管理器,我可以禁用承载此驱动程序的服务。首先你必须显示隐藏的设备,然后展开Non-Plug and Play Drivers节点:

设备管理器截图

最后,我可以停止驱动程序服务,并将其启动模式从System(意味着驱动程序是 Windows 的重要组成部分,没有它 Windows 无法启动)更改为Demand(意味着我可以在需要时启动驱动程序):

设备管理器截图

停止驱动程序服务立即修复了我的 DPC 延迟:

截屏

我可能会也可能不会完全卸载 CommView,但现在我已经解决了高 DPC 延迟的情况。


更新:从 Windows 8 开始,您将无法再在设备管理中看到非即插即用驱动程序

注意从 Windows 8 和 Windows Server 2012 开始,即插即用管理器不再为非 PnP(传统)设备创建设备表示。因此,在设备管理器中没有可查看的此类设备。要在设备管理器显示中包含隐藏设备,请单击查看并选择显示隐藏设备。

微软取消了该功能并用任何东西替换它。做得好。

在典型的书呆子愤怒中,一些无用的答案

  • 设备管理器从未显示非 pnp 驱动程序
  • 你为什么需要这个?

幸运的是,NirSoft 创建了一个替代品。ServiWin可让您查看、停止和启动所有服务(即使是 Microsoft 决定不允许管理员查看的服务):

ServiWin 的屏幕截图


Ben*_*jol 13

进度报告

迄今为止我发现的最好的工具是LatencyMon,它基本上可以完成前两个工具所做的一切,而不会让您思考。下载页面要求您通过电子邮件注册 - 但我这样做时什么也没发生 - 但您仍然可以滚动到页面底部进行下载。

替代文字


Chu*_*uim 6

在我的例子中,我使用了LatencyMon(来自 Benjol 的回答)并发现驱动程序冻结了生命、宇宙和一切(也)storport.sys它是“高性能总线”的 Microsoft 驱动程序。这证实了我的怀疑,该问题与 IO 相关。

我还继续查看了我的Windows 7 Event Viewer文件夹Windows Logs -> Application,并发现每 30 分钟到 2 小时发生一次来自卷影复制 (VSS) 的几批错误。他们的细节是这样的:

Volume Shadow Copy Service error: Error calling a routine on the Shadow Copy Provider {b5946137-7b9f-4925-af80-51abd60b20d5}. Routine returned E_INVALIDARG. Routine details GetSnapshot({00000000-0000-0000-0000-000000000000},000000000023C850). 

Operation:
   Get Shadow Copy Properties

Context:
   Execution Context: Coordinator
Run Code Online (Sandbox Code Playgroud)

然后我开始研究什么是 VSS以及它的用途。我去了几个--关于- VSS故障排除。通过所有这些,我有一个很大的嫌疑:我的备份软件CrashPlan

跟随那条线索,我很快找到了一个与 VSS 错误相关的页面。按照那里的说明禁用使用 VSS 的打开文件备份,冻结、高内核 CPU 使用率等完全消失。不要误会我的意思:CrashPlan 很棒!只是这个功能在我的机器上不起作用。

顺便说一句,这里的这个页面给了我最初的线索,帮助我找到了问题的根本原因。非常感谢@Benjol 和之前回答过的所有其他人!我希望我的回答也能帮助其他人...