使用性能计数器来诊断远程桌面会话主机上的应用性能问题

适用范围:Windows Server 2022、Windows Server 2019、Windows 10

应用程序性能不佳是最难诊断的问题之一,尤其是对于运行缓慢或无响应的应用程序。 传统上,可以通过收集 CPU、内存、磁盘输入/输出和其他指标来开始诊断。 然后,使用 Windows 性能分析器等工具尝试找出导致问题的原因。 遗憾的是,在大多数情况下,此数据无法帮助你确定根本原因,因为资源消耗计数器具有频繁且较大的变化。 这种情况使得难以读取数据并将其与报告的问题相关联。

注意

“用户输入延迟”计数器仅与以下操作系统版本兼容:

  • Windows Server 2019 或更高版本
  • Windows 10 版本 1809 或更高版本

用户输入延迟计数器可以帮助你快速确定最终用户远程桌面性能体验不佳的根本原因。 此计数器测量任何用户输入(如鼠标或键盘使用情况)在进程提取之前在队列中停留的时间。 此计数器在本地和远程会话中很有效。

下图大致表示了从客户端到应用程序的用户输入流。

Diagram of user input flows from the users Remote Desktop client to the application.

用户输入延迟计数器可测量正在排队的输入和传统消息循环中的应用提取的输入之间的最大增量(在一个时间间隔内)。 传统消息循环如下面的流程图中所示:

Diagram of user input Delay performance counter flow.

此计数器的一个重要细节是它在可配置的时间间隔内报告最大用户输入延迟。 此延迟是输入到达应用程序所需的最长时间,可能会影响重要的可见操作(例如键入)的速度。

例如,在下表中,用户输入延迟在此时间间隔内会被报告为 1000 毫秒。 计数器报告该时间间隔内最慢的用户输入延迟。 计数器报告该延迟是因为用户对“慢”的感知由体验到的最慢输入时间(最大值),而不是所有总输入的平均速度确定。

数量 0 1 2
延迟 16 毫秒 20 毫秒 1,000 毫秒

启用和使用新性能计数器

若要使用这些新性能计数器,必须首先通过运行以下命令来启用注册表项:

reg add "HKLM\System\CurrentControlSet\Control\Terminal Server" /v "EnableLagCounter" /t REG_DWORD /d 0x1 /f

注意

如果使用的是 Windows 10 版本 1809 或更高版本或 Windows Server 2019 或更高版本,则无需启用注册表项。

接下来,重新启动该服务器。 然后打开性能监视器并选择加号 (+),如以下屏幕截图中所示:

Screenshot showing how to add the User input Delay performance counter.

接下来,应看到“添加计数器”对话框,你可以在其中选择“每个进程的用户输入延迟”或“每个会话的用户输入延迟”。

Screenshot showing how to add the User input Delay per session.

Screenshot showing how to add the User input Delay per process.

选择“每个进程的用户输入延迟”时,你将看到采用 SessionID:ProcessID <Process Image> 格式的“选定对象的实例”(换而言之,进程)。

例如,如果计算器应用正在会话 ID 1 中运行,你将看到 1:4232 <Calculator.exe>

注意

并非包含所有进程。 不会看到以系统身份运行的任何进程。

添加该计数器后,就会立即开始报告用户输入延迟。 默认情况下,最大标度设置为 100 (ms)。

Screenshot of an example of activity for the User Input Delay per process in the Performance Monitor.

接下来,请查看“每个会话的用户输入延迟”。 每个会话 ID 都有实例,并且其计数器显示指定会话中的任何进程的用户输入延迟。 此外,还有两个称为“Max”(所有会话中的最大用户输入延迟)和“Average”(所有会话中的平均延迟)的实例。

此表显示了这些实例的可视示例。 可以通过切换到报表图表类型来获取 Perfmon 中的相同信息。

计数器的类型 实例名 报告的延迟(毫秒)
每个进程的用户输入延迟 1:4232 <Calculator.exe> 200
每个进程的用户输入延迟 2:1000 <Calculator.exe> 16
每个进程的用户输入延迟 1:2000 <Calculator.exe> 32
每个会话的用户输入延迟 1 200
每个会话的用户输入延迟 2 16
每个会话的用户输入延迟 平均值 108
每个会话的用户输入延迟 最大值 200

重载系统中使用的计数器

现在,让我们看看在应用性能下降时看到的报表内容。 下图显示了用户在 Microsoft Word 中远程工作的读数。 在这种情况下,当更多用户远程登录时,性能会随着时间的推移而下降。

Screenshot of an example performance graph for the RDSH server running Microsoft Word.

下面介绍了如何解读图表的线:

  • 粉红色的线表示服务器上登录的会话数。
  • 红色的线表示 CPU 使用率。
  • 绿色的线表示所有会话中的最大用户输入延迟。
  • 蓝色的线(在此图表中显示为黑色)表示所有会话中的平均用户输入延迟。

CPU 峰值与用户输入延迟之间存在关联。 随着 CPU 使用率的增加,用户输入延迟也会增加。 此外,随着更多的用户添加到系统中, CPU 使用率更接近于 100%,从而导致更频繁的用户输入延迟峰值。 虽然此计数器在服务器耗尽资源的情况下很有用,它也可以跟踪与特定应用程序相关的用户输入延迟。

配置选项

使用此性能计数器时需要记住的重要一点是,它在默认情况下以 1000 毫秒的时间间隔报告用户输入延迟。 如果将性能计数器示例间隔属性(如以下屏幕截图中所示)设置为其他属性,则报告的值将不正确。

Screenshot of the Performance Monitor Properties dialog.

若要解决此问题,可以设置以下注册表项以匹配你想要使用的间隔(以毫秒为单位)。 例如,如果将每 1 秒示例更改为 5 秒示例,则需要将此项设置为 5000 毫秒。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]

"LagCounterInterval"=dword:00005000

注意

如果使用的是 Windows 10 版本 1809 或更高版本或 Windows Server 2019 或更高版本,则无需设置 LagCounterInterval 即可修复性能计数器。

我们还在同一注册表项下添加了几个可能会有所帮助的项:

LagCounterImageNameFirst - 将此项设置为 DWORD 1(默认值 0 或项不存在)。 此项将计数器名称更改为“映像名称 <SessionID:ProcessId>”,例如“explorer <1:7964>”。 如果希望按映像名称进行排序,此更改将很有用。

LagCounterShowUnknown - 将此项设置为 DWORD 1(默认值 0 或项不存在)。 此项将显示作为服务或系统运行的任何进程。 某些进程会显示设置为“?”的会话。

下图是启用两个项时的显示情况:

Screenshot of the performance monitor with both keys on.

将新计数器与非 Microsoft 工具结合使用

监视工具可以通过使用性能计数器来使用此计数器。

分享反馈

可以通过反馈中心提交此功能的反馈。 选择“应用”>“所有其他应用”,并在帖子标题中包括“RDS 性能计数器 - 性能监视器”。