如何找到延迟过程调用 (Deferred Procedure Call) 较高的根本原因?

如何找到延迟过程调用 (Deferred Procedure Call) 较高的根本原因?

我有一个双核处理器,其中一个处理器一直处于 100% 状态。查看 ProcessExplorer 后我发现这是延迟过程调用。在网上查阅资料后我发现有很多不同的答案。

是否可以制定几个步骤来尝试缩小我的问题范围?

更新 1:值得一提的是,即使在安全模式下,问题仍然存在。

更新 2:我拔掉了电脑背面所有能拔掉的插头,这样我就能多获得 40% 的免费处理器。我还下载了RATTV3 工具,但出于某种原因,我的电脑上没有提供驱动程序的细分信息。DPCLatencyChecker 和 RATTV3 都有很好的描述这里

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

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

更新 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 来说可能很正常?)以及大量硬页面错误。但这些将是其他问题的主题。

后记:我最近也遇到了同样的问题,并使用了同样的方法,成功追踪到 USB 记忆棒(我用于 ReadyBoost 的那个)被击中了。

答案1

以下是我如何找到导致 DPC 延迟过高的原因的故事。


我的系统在播放声音时会发出咔嗒声和爆音。我知道这意味着内核模式中的某些东西占用了 CPU。我的第一个想法是四处寻找进程探索器,看看是否有任何不妥之处。唯一引起我注意的是,表演时间过长延迟过程调用(DPC):

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

我知道 DPC 是在驱动程序内部运行的代码;挑战在于弄清楚哪个司机。我转向DPC 延迟检查器,它向我展示了延迟有多严重:

DPC 延迟检查器的屏幕截图

DPC 延迟检查器建议通过设备装置经理并逐个禁用非必要硬件(例如网卡、声卡),希望隔离有问题的驱动程序。(如果您禁用某个设备,DPC 延迟突然下降:您就找到了罪魁祸首!)

禁用设备的屏幕截图

不幸的是,在我禁用了所有我能禁用的东西之后(但仍然能够使用计算机(不要禁用硬盘、显卡、鼠标或鼠标插入的 USB 集线器!),延迟仍然很高。接下来我转向Windows 性能工具包(的一部分Windows SDK),以及 Peter Weiland 的精彩博客文章,“测量 DPC 时间”. 安装 Windows 性能工具包后:

Windows SDK 安装程序的屏幕截图,其中已选择 Windows 性能工具包

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

>xperf -on Latency

笔记: 这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
   ...

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

  • 进程线程进程和线程的创建/删除
  • 加载器内核和用户模式图像加载/卸载事件
  • 轮廓CPU 样本配置文件
  • 开关上下文切换
  • 磷酸二酯酶DPC活动
  • 打断中断事件
  • 磁盘输入输出磁盘 I/O
  • 硬故障硬页面错误

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

C:\Users\Ian\Desktop\xperf -d thingy1.etl

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

C:\Users\Ian\Desktop\xperf thingy1.etl

这将加载图形Windows 性能分析器. 右击DPC CPU 使用率图表,我选择了汇总表。以下显示了驾驶员在 DPC 上花费的时间明细:

XPerf 输出的屏幕截图

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

截屏

谷歌搜索tsvp.sys给了我答案:通讯视窗,我最近刚刚安装。

现在的问题是如何禁用该驱动程序。使用自动运行,我可以看到它被安装为驱动程序服务:

自动运行的屏幕截图

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

设备管理器的屏幕截图

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

设备管理器的屏幕截图

立即停止驱动程序服务可以解决我的 DPC 延迟问题:

截屏

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


更新:从 Windows 8 开始你再也看不到非即插即用驱动程序在设备管理器中

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

微软取消了该功能,并用...空无一物取而代之。干得好。

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

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

幸运的是,NirSoft 已经创建了替代品。服务网让您查看、停止和启动所有服务(甚至是 Microsoft 决定不允许管理员查看的服务):

ServiWin 的屏幕截图

答案2

进度报告

到目前为止我发现的最好的工具是LatencyMon,它基本上可以完成前面两个工具的所有功能,而且无需您思考。下载页面要求您通过电子邮件注册 - 但我这样做时什么也没发生 - 但您可以滚动到页面底部进行下载。

替代文本

答案3

就我而言,我使用LatencyMon(来自 Benjol 的回答)并发现冻结生命、宇宙和一切的驱动程序(也是)storport.sys这是微软的驱动程序“高性能巴士“。这证实了我的怀疑,即问题与 IO 有关。

我也继续看我的Windows 7 事件查看器, 文件夹Windows 日志 -> 应用程序,发现每隔 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

然后我开始调查VSS 到底是什么以及它的用途。我看过了一些-页面-关于-VSS 疑难解答. 仔细检查了所有这些,我发现一个很大的怀疑:我的备份软件崩溃计划

顺着这个线索,我很快发现与 VSS 错误相关的页面。按照那里的说明禁用使用 VSS 的打开文件备份,冻结、内核 CPU 使用率高等问题就完全消失了。别误会我的意思:CrashPlan 很棒!只是这个功能在我的计算机上不起作用。

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

答案4

我觉得我应该在这里添加我的答案,因为这个问题很难解决,而且并不总是由于坏的驱动程序或 IRQ 冲突。

我的 RPC 延迟很高,导致我的专业级 USB 声卡出现爆音/噼啪声。已接受答案中描述的工具无法帮助识别导致问题的特定驱动程序。延迟发生在多个进程中:HAL、USBPORT.SYS 和 Windows 内核。深入研究这些进程并没有发现明显的罪魁祸首。

事实证明,在我的情况下,该问题属于较低级别的问题,并且特定于具有某些芯片组和 BIOS 版本的 GigaByte 主板。解决方案是禁用 Intel SpeedStep 和所有其他主板特定功能,这些功能会动态调整 CPU 速度和电压。关闭这些选项后,我的 RPC 延迟立即得到解决。

相关内容