SMB 服务器上的 CPU 使用率过高问题

本文讨论如何排查 SMB 服务器上的 CPU 使用率过高问题。

由于存储性能问题,CPU 使用率过高

存储性能问题可能会导致 SMB 服务器上的 CPU 使用率过高。 在进行故障排除之前,请确保在 SMB 服务器上安装了最新的更新汇总,以消除 srv2.sys中的任何已知问题。

在大多数情况下,你会注意到系统进程中 CPU 使用率过高的问题。 在继续之前,请使用进程资源管理器来确保 srv2.sysntfs.sys 消耗过多的 CPU 资源。

存储区域网络 (SAN) 方案

在聚合级别上,总体 SAN 性能可能看起来不错。 但是,处理 SMB 问题时,单个请求响应时间最为重要。

通常,此问题可能是由 SAN 中的某种形式的命令队列引起的。 可以使用 Perfmon 捕获 Microsoft-Windows-StorPort 跟踪,并对其进行分析以准确确定存储响应能力。

磁盘 IO 延迟

磁盘 IO 延迟是衡量创建磁盘 IO 请求和完成磁盘 IO 请求之间的延迟的度量值。

Perfmon 中测量的 IO 延迟包括硬件层上花费的所有时间,以及用于 SCSI) 的 Microsoft 端口驱动程序队列 (Storport.sys 花费的时间。 如果正在运行的进程生成大型 StorPort 队列,则测量延迟会增加。 这是因为 IO 在调度到硬件层之前必须等待。

在 Perfmon 中,以下计数器显示物理磁盘延迟:

  • “物理磁盘性能对象” -> “Avg. Disk sec/Read counter” - 这显示了平均读取延迟。
  • “物理磁盘性能对象” -> “Avg. Disk sec/Write counter” - 这显示了平均写入延迟。
  • “物理磁盘性能对象” -> “平均磁盘秒/传输计数器” - 这显示了读取和写入的总平均值。

“_Total”实例是计算机中所有物理磁盘的平均延迟。 其他每个实例表示单个物理磁盘。

注意

不要将这些计数器与 Avg.Disk Transfers/sec 混淆。这些是完全不同的计数器。

Windows 存储堆栈

本部分简要介绍 Windows 存储堆栈。

应用程序创建 IO 请求时,会将请求发送到堆栈顶部的 Windows IO 子系统。 然后,IO 会一路从堆栈向下传播到硬件“磁盘”子系统。 然后,响应将一路传回。 在此过程中,每个层执行其功能,然后将 IO 交给下一层。

显示存储堆栈流的示意图。

Perfmon 每秒不会创建任何性能数据。 相反,它使用由 Windows 中的其他子系统提供的数据。

对于“物理磁盘性能对象”,数据在存储堆栈中的“分区管理器”级别捕获。

当我们测量上一部分中提到的计数器时,我们将测量请求在“分区管理器”级别以下花费的所有时间。 当 IO 请求由分区管理器向下发送堆栈时,我们会标记它。 当它返回时,我们再次标记它并计算时差。 时差是延迟。

通过执行此操作,我们将考虑在以下组件中花费的时间:

  • 类驱动程序 - 它管理设备类型,例如磁盘、磁带等。
  • 端口驱动程序 - 它管理传输协议,例如 SCSI、FC、SATA 等。
  • 设备微型端口驱动程序 - 这是存储适配器的设备驱动程序。 它由设备制造商提供,例如 Raid 控制器和 FC HBA。
  • 磁盘子系统 - 这包括设备微型端口驱动程序下的所有内容。 这可以像连接到单个物理硬盘的电缆一样简单,也可以像存储区域网络一样复杂。 如果确定问题是由此组件引起的,可以联系硬件供应商了解有关故障排除的详细信息。

磁盘队列

磁盘子系统在给定时间可以接受的 IO 量有限。 多余的 IO 将排队,直到磁盘可以再次接受 IO。 Perfmon 物理磁盘延迟度量中考虑到 IO 在低于“分区管理器”级别的队列中花费的时间。 随着队列的增长和 IO 必须等待更长时间,测量延迟也会增加。

“分区管理器”级别以下有多个队列,如下所示:

  • Microsoft 端口驱动程序队列 - SCSIport 或 Storport 队列
  • 制造商提供的设备驱动程序队列 - OEM 设备驱动程序
  • 硬件队列 - 例如磁盘控制器队列、SAN 交换机队列、阵列控制器队列和硬盘队列

我们还考虑了硬盘为 IO 提供主动服务所花费的时间,以及请求返回到标记为已完成的“分区管理器”级别所花费的行程时间。

最后,我们必须特别注意 SCSI Storport.sys) 的端口驱动程序队列 (。 端口驱动程序是最后一个 Microsoft 组件,在我们将其移交给制造商提供的 Device Miniport Driver 之前触摸 IO。

如果设备微型端口驱动程序由于其队列或下面的硬件队列已饱和而无法再接受任何 IO,我们将开始在端口驱动程序队列上累积 IO。 Microsoft 端口驱动程序队列的大小仅受可用系统内存 (RAM) 的限制,并且可能会增长非常大。 这会导致较大的测量延迟。

枚举文件夹导致 CPU 使用率过高

若要解决此问题,请禁用基于访问的枚举 (ABE) 功能。

若要确定哪些 SMB 共享已启用 ABE,请运行以下 PowerShell cmdlet:

Get-SmbShare | Select Name, FolderEnumerationMode

Unrestricted = ABE 已禁用。
AccessBase = 已启用 ABE。

可以在 服务器管理器 中启用 ABE。 导航到 “文件和存储服务>共享”,右键单击共享,选择“ 属性”,转到 “设置” ,然后选择“ 启用基于访问的枚举”。

显示“服务器管理器的设置”下的“启用基于访问的枚举”选项的屏幕截图。

此外,还可以将 ABELevel 降低到较低级别 (1 或 2) 以提高性能。

当枚举速度缓慢时,可以通过控制台或 RDP 会话在本地打开文件夹来检查磁盘性能。