方案指南:排查 Windows 中的性能问题

本方案指南介绍如何使用性能监视器收集数据,以及如何使用数据缩小导致计算机速度缓慢的瓶颈。 它引入了一般方法,并尝试解释故障排除概念。

使用性能监视器记录性能数据

每个完整版本的 Windows 附带一个名为性能监视器的收件箱工具。 可以使用此工具通过内置于 Windows 中的性能计数器来跟踪 Windows 系统的各个方面的性能相关信息,该计数器提供了有关中央处理单元(CPU)使用情况或内存使用情况的详细信息。

每个计数器都以相同的简单方式构造:
[Performance counter object]\<Instance>\<Counter Name>

例如:
[Processor Information]\<CPU 0\>\% Processor Time

若要存储计数器提供的性能数据,可以在性能监视器中使用数据收集器集。 请参阅下面的屏幕截图:

性能监视器和数据收集器集的屏幕截图。

若要创建这些 数据收集器集,可以使用图形用户界面(GUI)或 logman.exe 命令。

若要创建数据收集器集,请在提升的命令提示符窗口中运行以下命令:

logman.exe create counter PerfLog-15Sec-Contoso -o "c:\perflogs\Contoso_PerfLog-15sec.blg" -f bincirc -v mmddhhmm -max 800 -c "Hyper-V Dynamic Memory Balancer (*)\*" "Hyper-V Hypervisor Virtual Processor(*)\*" "Hyper-V Hypervisor Logical Processor(*)\*" "\LogicalDisk(*)\*" "\Memory\*" "\Cache\*" "\Network Interface(*)\*" "\Paging File(*)\*" "\PhysicalDisk(*)\*" "\Processor(*)\*" "\Processor Information(*)\*" "\Processor Performance(*)\*" "\Process(*)\*" "\Process V2(*)\*" "\Redirector\*" "\Server\*" "\System\*" "\Server Work Queues(*)\*" "\Terminal Services\*" -si 00:00:15

若要启动计数器,请在提升的命令提示符窗口中运行以下命令:

logman.exe start PerfLog-15Sec-Contoso

此命令在系统上生成类似“飞行盒记录器”的监视器。 监视器每隔 15 秒记录一次性能数据(请参阅 -si 00:00:15 间隔)。 每次启动收集器集时,对系统的影响应小于 1%,并且不会在本地硬盘上使用超过 800 兆字节(MB)的空间。 如果重新启动计算机,则需要运行该命令以再次启动监视器。

若要停止计数器,请在提升的命令提示符窗口中运行以下命令:

logman.exe stop PerfLog-15Sec-Contoso

数据收集器集也遵循以下原则 [Performance counter object]\<Instance>\<Counter Name>。 计数器对象称为“内存”,因为此对象没有实例。 原因是 Windows 中有一个内存,但可能有多个硬盘或 CPU。

现在,你有一个数据收集器集,每 15 秒记录一次数据。 选择 15 秒是因为用于分析数据的工具的限制:性能监视器。

最多可以在图形中显示 1,000 个数据点。 如果数据收集器配置为每秒记录数据,则图形只能在 16 分 40 秒内显示数据。 如果日志中有更多数据,它将开始“汇总并合并”这些数据点。 捕获称为高密度捕获。

这可能会导致图形不显示准确数字的情况。 可以通过查看图形并将其与 “最小值 ”或 “最大值 ”进行比较来发现它。

在此示例中,查看计数器对象处理器_Total实例的计数器空闲时间百分比。 根据最小值,图形应命中蓝线(32%),但事实并非如此。 由于数字和图形不匹配,需要验证显示的时间段内有多少个样本(22 分 01 秒)。 悬停在上方时,“浮出”会显示此数据点中有多少个样本。 如你所看到的,有 10 个示例,因此,该工具被迫汇总和合并它们,因为这是一个捕获与一秒间隔。

性能监视器最小值的屏幕截图。

简化 Windows

有了性能计数器日志后,让我们尝试以有助于分析的方式简化 Windows。 为此,将系统分解为其逻辑组件:内存、存储、CPU 和网络。

系统逻辑组件的屏幕截图。

除了将某些性能监视器对象映射到物理资源之外,请务必记住 Windows 分为两个主要领域: 内核用户 模式。

内核 是指操作系统(OS)和驱动程序(这还包括防病毒筛选器驱动程序)。 内核由名为 系统进程的逻辑构造(始终具有进程 ID 4)在 Windows 中表示。 出于安全原因,此区域受到强烈保护。 即使使用收件箱工具(如性能监视器),也可以从中获取一些信息。 例如,可以看到正在使用的非分页池量,但没有有关谁正在使用该池的信息。

用户 模式是运行所有应用程序(新式 Appx、服务和可执行文件)的位置。 使用性能监视器,可以获取有关每个进程的信息。

介绍 18 个最重要的计数器

为了简化,以下各节介绍了 18 个最重要的计数器及其阈值,这些计数器按它们相关的物理资源细分。

存储

主计数器 正常 警告 严重
\LogicalDisk\\Avg. Disk sec/Read < 15 毫秒 > 25 毫秒 > 50 毫秒
\LogicalDisk\\Avg. Disk sec/Write < 15 毫秒 > 25 毫秒 > 50 毫秒
\PhysicalDisk\\Avg. Disk sec/Read < 15 毫秒 > 25 毫秒 > 50 毫秒
\PhysicalDisk\\Avg. Disk sec/Write < 15 毫秒 > 25 毫秒 > 50 毫秒

注意

可以容忍短峰值。 应调查更长的延迟期(超过一分钟或更长时间)。

这些计数器表示延迟。 延迟由获取信息所花费的时间定义。 从磁盘性能的角度来看,需要更仔细地了解设置。 对于普通硬盘(SSD),磁盘通常每分钟旋转速度为 5,400 次(RPM)。 这意味着磁盘将轴(其中信息存储为块)每分钟 5,400 次。 应该能够计算从磁盘读取任何块所需的时间:

一个块 / (RPM / 60) = 一个块的延迟

一个块 / 5400 RPM / 60 = 0.011111 秒 = 11 毫秒

因此,从理论上讲,磁盘应该能够在 11 毫秒内读取任何块。 如果存在延迟 ~100 ms,磁盘应该能够读取块至少八次,那么为什么会有延迟? 磁盘是否不知所措,如果是这样,谁正在使用它?

若要标识正在使用它的人员,现在可以检查 Process 计数器对象。

与磁盘操作相关的进程 计数器:

  • \Process\\IO 读取操作数/秒 (进程特定的磁盘读取时间)
  • \Process\\IO Write Operations/sec (进程特定的磁盘写入时间)

可以使用这些计数器,并尝试将延迟或磁盘使用情况与进程使用情况相关联。

让我们转到下一个物理组件。

内存

虚拟内存和物理内存计数器 正常 警告 严重
\Memory\Pool 分页字节 | 池非分页字节数 0–50% 60–80% 80–100%
\Memory\Available MBytes > 10% 或至少 4 GB(GB) 免费 < 10% < 1% 或小于 500 MB
\Memory\% 已提交的字节正在使用 0–50% 60–80% 80–100%

本部分介绍以下计数器:

  • 池分页字节数
  • 池非分页字节数

这些计数器表示整个系统共享的内核资源。 尽管进程可以声明分页池和非分页池,但这主要是由驱动程序完成的;因此,对于性能监视器,数据不可见。 虽然分页池可以分页到页面文件,但非分页池不能。 请记住,这些内核资源依赖于系统中的内存(随机访问内存(RAM)大小。 非分页池的限制是 RAM 的 75%,它们直接影响可用 MBytes可用 MBytes 是所有程序可用的 RAM 量,包括内核。

若要了解进程对 RAM 利用率的影响,可以使用以下计数器:

进程计数器 注释
\Process\\Working Set 尝试将可用 MBytes 关联,以识别 RAM 的顶级使用者。 工作集 定义为进程在任何时间点使用的 RAM 量(而不是页面文件)。

请记住, 内存\% 已提交的使用 字节数表示你在 Windows 中的虚拟内存。 这是页面文件和 RAM 的组合,选择“内存”后,可以在“性能”选项卡上的“任务管理器”中查看:

任务管理器中显示的内存的屏幕截图。

此系统具有 128 GB RAM 和 128 GB 的页面文件,因此 提交的 内存为 256 GB。 还可以概览 分页池 和非 分页池 内存。

调查内存问题时,请记住,这两个区域(内核和用户)实际上共享相同的物理资源。 因此,如果计算机内存不足,请尝试找出正在使用它的人员。

让我们转到下一个物理资源。

CPU

排查 CPU 性能问题时,需要再次将 OS 拆分为 内核用户 模式。 但是,拆分更易于理解。 用户模式由任何应用程序或服务表示,包括以用户模式运行的应用程序,这些应用程序使用 CPU 周期,并且不涉及除 CPU 以外的硬件。 如果需要访问硬件,则会导致内核模式,因为该工具需要与驱动程序通信以访问 GPU、存储或网络。

以下是一些示例:

  • 执行计算的 SQL Server = 用户模式
  • 将日志文件写入磁盘的 SQL Server = 内核模式
  • 访问网络共享的文件服务器 = 内核模式

然后,让我们看看主要计数器:

主计数器 正常 警告 严重
\Processor Information\\% User Time (用户模式) < 50% 50–80% > 80%
\Processor Information\\% Privileged Time (内核模式) < 30% 30–50% > 50%
\Processor Information\\% Idle Time >20% >10% <10%

同样,短峰值是可以接受的,但如果看到它超过一分钟,开始调查。

每次使用 CPU 时,CPU 都会消耗 %用户时间 (用户模式) 或 % 特权时间 (内核模式)。 如果遇到高 CPU 情况(= 低 百分比空闲时间),则需要通过查看以下辅助计数器来了解正在使用该情况的人员:

辅助计数器 注释
\Process\\% User Time 请记住,你可能有多个活动进程。
*\Process()\% Privileged Time** 请记住,系统进程仅存在有限的信息。 系统进程通常是 %Privileged Time 的主要驱动程序,因为进程托管此逻辑构造中的驱动器。 但是,这并不限于此。

100% 进程\% 用户时间 = 一个 CPU。 如果有 16 个 CPU,则进程可以达到的最大使用率为 1600 %。 请参阅下面的屏幕截图:

四个 CPU 的进程监视器图的屏幕截图。

在此示例中,你已使用工具来模拟 CPU 使用率(占用户时间百分比)。 你只限制该工具在四个 CPU 上运行(CPU 12、13、14 和 15)。 一旦四个线程处于活动状态,很明显,所有 CPU 如何达到 100%,而应用程序本身(CPU 压力)达到 400%。 此示例演示 CPU 压力的 CPU 使用率与应用程序限制到的 CPU 上的 CPU 负载之间的关系。 建立这种关系有助于充分了解基础进程。

这让我们转到最后一个物理对象。

网络

由于性能监视器是本地工具,因此只能从网络获取基本信息。 不过,以下计数器仍然有用:

主计数器 正常 警告 严重
\Network Interface\\Bytes Total/sec < 50% 50–80% > 80%
\Network Interface\\Bytes Sent/sec * * *
\Network Interface\\Bytes Received/sec * * *

注意

标记有星号的单元格的详细信息 •:\Network Interface\\Bytes Sent/sec\Network Interface\\Bytes Received/sec工作负荷应取决于服务器的角色。 例如,每秒发送的字节数通常高于流式处理服务器上每秒接收的字节数。 相比之下,每秒接收的字节数通常高于执行备份的备份服务器上每秒发送的字节数。

这些值与网卡的速度相关,需要执行计算。 执行此操作时,请记住网络速度以位为单位,8 位 = 1 字节。 因此,如果有 1 GB 的网卡,吞吐量可以达到 125 MB/秒。

虽然 Bytes Total/sec 计数器可帮助你了解网卡的总体利用率,但其他两个计数器可以帮助你知道你是否接收或发送更多数据。 如果有此信息,则可以将其与预期行为进行比较。 如果要调查网络,则需要一个不同的工具集,因为需要双方的端到端跟踪才能完全了解网络行为。

结束语

本方案指南总结了 Windows 系统的细分和物理组件。 物理组件遇到瓶颈时,系统就会出现问题。 应用程序也会受到影响。

我们希望本方案指南可以帮助你基本了解性能监视器以及如何为“黑盒”捕获(如飞行记录器)准备系统。 如果需要进一步帮助分析数据,请通过开具支持票证与我们联系。