需要进行跟踪分析 - 当鼠标指针位于桌面上时系统会变慢

需要进行跟踪分析 - 当鼠标指针位于桌面上时系统会变慢

我们遇到了一个奇怪的问题。它出现在 Windows Server 2016 上,但在“普通”的 Windows 10 上也可以重现。我们在系统上运行了大约 160 个进程。总 CPU 占 10-16%。现在的问题是:每次鼠标指针位于干净的桌面上(而不是图标或任何窗口上)时,系统都会变得非常慢。不仅是我们的进程,而且所有其他进程(甚至是 processhacker 窗口)都表现得非常慢。如果鼠标指针位于任何窗口或任务栏上 - 一切都会恢复正常。

我和布鲁斯道森有一些话要谈他的博客但他没有时间(当然)分析我的 ETL-Trace。他建议将其发布到网上并寻求帮助。

我制作了 WPA 的屏幕截图以便简单解释一下:

在此处输入图片描述

我已经对屏幕截图进行了注释,以便人们可以看到鼠标在桌面或窗口上的位置。在堆栈视图中,可以看到鼠标在桌面上时上下文切换的数量正在减少,在 CPU 使用率(采样)视图中,有正好此时的 RtlUserThreadStart 条目,但我不知道它们来自哪里。

我们的第一个进程是“ProcessController.exe”,它启动所有其他进程,如“GpioController.exe”、“DCIIF_Simulation”或“RouterIF_Simulation.exe”等。它们都与一个名为“StatusController.exe”的进程进行通信,但在跟踪中,它们只在它们之间进行心跳传输。

布鲁斯告诉我要找到我们的进程正在等待某件事的点,但我找不到锁或任何类似的东西。

如果有人接受挑战,我已经上传了压缩的 etl-trace。

压缩的 etl-trace

答案1

在我们设法将调试符号添加到某些进程后,我们在 Delphi-VCL/Forms.pas 中发现了问题。在新的跟踪中,使用调试符号,我们发现 Application.DoMouseIdle 方法花费大量时间查找 VCLWindows、获取这些 VCLWindows 的父级等等。速度变慢的根源是“FindDragTarget”方法。我们的进程不需要拖放功能,也不需要显示提示。所以我们从代码中删除了这个函数调用,这并不容易。现在一切都运行得很快,与鼠标位置无关。

相关内容