练习 1 - 确定具有大型工作集的进程

用于分析数据的方法学可以采用多种方法,并且根据开始调查的情况而有所不同。 本练习讨论并演示了一些示例方法,以及各种列排列方式呈现的不同视图。

称为“驻留集”的数据是当前驻留在物理内存 (RAM) 中的页面集。 “驻留集”是使用“Windows Performance Recorder (WPR)”或评估工具包内存评估进行的一次跟踪捕获结束时的当前内存状态的快照。 无法收集单个跟踪中的多个快照。

“驻留集”提供系统上内存构成的整体即时快照。 通常出于以下原因对“驻留集”分析进行调查:

  • 了解物理内存使用情况,尤其是在物理内存使用率高于预期时。

  • 了解进程专用工作集的来源,尤其是在进程专用工作集大于预期时。

  • 分页活动导致系统响应能力问题。

步骤 1:使用评估工具包收集数据

“Windows 评估工具包”包含一个用于测量启动后的内存占用情况的测试。 你可以使用“内存占用”评估结果来收集图像软件预加载的基线。 许多进程和服务始终处于使用状态并占用内存。 此评估有助于了解始终运行的驱动程序和应用程序如何影响启动过程。

  1. 从“开始”菜单打开“Windows 评估控制台 (WAC)”。

  2. 打开“选项”菜单,然后选择“新作业...”

    1. 输入“MemoryTest”作为作业名称。

    2. 选择“创建自定义作业”。

  3. 单击“添加评估”。

    • 通过单击“+”号添加“内存占用”评估
  4. 单击新添加的“内存占用”评估进入测试配置。

  5. 取消选择“使用建议设置”并为配置选择“快速运行”。

    • “快速运行”可使测试在更短的时间内完成,但会牺牲数据的准确性。

    Windows 评估控制台的屏幕截图。

  6. 选择“快速运行”后,你有两个选择:

    1. “打包”打包作业以创建包含所有测试资源的文件夹并将其复制到另一个测试系统。 (单击右下角的“打包...”按钮以选择此选项。)

    2. “运行”直接在系统上运行作业。 (单击右下角的“运行...”按钮以选择此选项。)

      • 这会重启系统以收集跟踪。

      • 此测试可能需要大约 15-20 分钟完成。

    我们需要的是“运行”选项。

步骤 2:使用 WAC 可视化内存占用评估结果

评估完成后,可以打开包含系统内存使用情况摘要的结果 XML 文件。

步骤 2.1:打开内存报告

  1. 在“WAC”中,打开“选项”菜单并选择“打开结果...”

    • 你也可以在键盘上按 CTRL+R。
  2. 单击“浏览…”按钮。

  3. 导航到存储在步骤 1 中创建的评估的文件夹。

  4. 打开在步骤 1 中创建的评估。

    内存报告包含不同的类别,可帮助你了解驱动程序和进程对总体内存占用量的贡献。

    报告应类似于:

    来自 Windows 评估控制台的显示内存使用情况的示例报告。

  5. 花点时间通过查看“驱动程序”和“进程专用页面”类别来熟悉报告。

在上一示例中,使用了 4 GB 物理 RAM 中的 1487 MB 内存。

  • 使用中的内存 = 进程工作集 + 非分页内存 + 修改页

  • 可用内存 = 备用内存 + 闲置内存

在上一示例中,内存使用量最大的使用者是驱动程序分配,其中 267 MB 用于非分页分配,613 MB 用于进程专用页分配(专用工作集)。

有关指标的详细信息,请参阅 MSDN 上的内存占用评估结果主题。

步骤 2.2:查看驱动程序非分页分配

此指标类似于分页分配,但这些分配使用的物理内存无法分页。这反映了固定的物理内存,因此无法用于分页内存或其他进程和服务使用。 获取过多的非分页内存会减少支持内存可使用的内存量。

  1. 单击左侧箭头展开“驱动程序非分页分配”类别。

  2. 展开“DriverLockedSystemPages”类别。

    • 这是从分页内存加载并由驱动程序锁定的内存,直到其不再有用。
  3. 确定内存使用量最大的驱动程序。

    来自 Windows 评估控制台的显示驱动程序非分页分配使用情况的示例报告。

你可以通过换出具有较低内存要求的硬件或软件驱动程序来影响此指标。

驱动程序供应商对此指标的影响最大,方式是驱动程序设计。 在“WAC”中显示的结果中查找大型内存分配。 此外,还可以向驱动程序供应商提供此评估的性能跟踪(存储在与评估结果相同的目录中并且可以使用“WPA”进行分析),以查找适合用于调查减少内存使用量的大量内存分配区域。

步骤 2.3:查看进程专用工作集

总内存占用量最大的用户是可能始终在用户不知情的情况下在后台运行的应用程序。 要查看进程使用的内存量,可以使用报告中的“进程专用页”类别。

  1. 单击左侧箭头展开“进程专用页”类别。

  2. 展开“活动”类别。 该列表显示二进制文件及其活动内存的使用情况。

    你的视图应如下所示:

    来自 Windows 评估控制台的显示进程内存使用情况的示例报告。

  3. 确定使用最多内存的进程。

你可以通过减少“始终运行”应用程序的数量来影响此指标,这些应用程序是“运行”注册表项或“开始”文件夹中的应用程序。 分析已添加应用的影响。

驱动程序和软件供应商通过其设计代码的方式对此指标的影响最大。 在“WAC”中显示的结果中查找大型内存分配。 此外,还可以向软件供应商提供性能跟踪(存储在与评估结果相同的目录中),以查找适合用于调查减少内存使用量的内存分配区域。 仔细分析分配(即使是小型分配)有助于开发人员找到增加的分配。

步骤 3:使用 WPR 收集“驻留集”数据

在步骤 1 和 2 中,你学习了如何使用“评估工具包内存占用”评估来收集内存跟踪。 此评估只能捕获启动场景的跟踪。 可以使用 Windows Performance Recorder (WPR ) 捕获任何方案的跟踪 (应用启动、Web 浏览等)

按照以下步骤收集包含“驻留集”数据的跟踪。

  1. 从“开始”菜单打开“Windows Performance Recorder”。

  2. 选择“一级会审”和“驻留集分析”记录配置文件,但保留其他选项的默认值。

  3. 单击“开始”并等待几秒钟。

    Windows 评估控制台的显示状态记录未开始的记录系统信息屏幕的屏幕截图

  4. 单击“保存”并将“ETL”跟踪保存到磁盘。

现在,你已拥有系统内存构成的快照。

步骤 4:使用 WPA 解释“驻留集”数据

按照以下过程操作:

  1. 从“开始”菜单启动“Windows Performance Analyzer”。

  2. 打开刚刚收集的“ETL”跟踪(“文件”菜单,“打开...”)。

  3. 在“图形资源管理器”中展开“内存”集。

    WPA 图形资源管理器视图的屏幕截图。

  4. 将“驻留集”图表拖放到“分析”选项卡中。

你的视图应如下所示:

显示分析选项卡视图的 WPA 的屏幕截图。

查看数据的显示方式。 下面是一些用于执行顶级分析的最有用的列的定义:

定义
MMList

包含页面的内存管理列表。

  • Active - 当前在进程专用工作集或内核工作集中的页面。

  • Standby - 备用列表中未修改的页面。 它们是可用内存的一部分。

  • Modified - 自上次持久保存到永久性存储后修改的进程专用或文件支持页面。

  • ModifiedNoWrite - 已修改但不会持久保存到永久性存储的页面。

  • Transition - 在列表之间转换的页面。

处理

作为页面所有者的进程的名称。 此信息仅适用于进程专用页面。 即使它们没有被共享,所有可共享的页面都与“Unknown”(-1) 进程相关联。

说明

所表示的值因页面类别而异。 例如:

  • 对于图像、驱动程序、文件等,它会显示完整的文件路径和名称。

  • 对于“池”内存,它显示驱动程序池标记名称。

页面类别

页面中包含的数据的类型,定义如下。 一些可能的类别包括:

  • CopyOnWriteImage - 通过修补可执行映像导入地址表或变基可执行文件创建的进程专用页面。

  • Driver - 驱动程序的代码页。

  • DriverFile - 从驱动程序可执行文件中读取并映射为数据的代码页。

  • DriverLockedSystemPage - 通常由驱动程序或内核锁定或固定在内存中的内核模式页面。

  • Image - .dll 和 .exe 文件中可作为可执行图像加载的页面。

  • MapFile - 可作为数据加载的数据文件页面或图像的页面。

  • NonPagedPool - 包含不可分页系统池中的数据的页面。

  • PagedPool - 包含可分页系统池中的数据的页面。

  • PFMappedSection - 页面文件支持的内存映射部分的页面。

  • SystemPage - 包含用于映射系统页面(例如 I/O 空间、内核堆栈和内存描述符列表)的系统页表条目的页面。

  • UserStack - 包含每个线程的用户模式数据的页面。

  • VirtualAlloc - 由 VirtualAlloc API 分配的页面。

  • Win32Heap - 堆页面。

大小(MB)

每个类别中聚合的页面的总大小。

步骤 6:确定影响内存占用的进程工作集

“驻留集”数据可以根据摘要表中的列排列方式以多种不同方式显示。 摘要表拥有几个预定义的列排列方式,你可以将它们用作调查的起点。

  1. 选择“进程专用工作集”预设。

    WPA 进程专用工作集下拉列表的屏幕截图。

  2. 展开“活动 MMList”组。

    1. 专注于“活动”类别,因为它是当前影响内存使用的类别。

    2. “Standby”页面可以在内存压力下释放。

    3. “Modified”页面可以写入磁盘并释放。

  3. 单击“Size (MB)”列标题,按大小排序。

  4. 确定使用量最大的进程。 你可能会看到“N/A”和“Unknown (-1)”作为进程名称。

    • “N/A”包含与任何进程(例如驱动程序池内存)无关联的页面。

    • “Unknown (-1)”包含可共享的页面。

  5. 展开进程以查看“页面类别”。

    1. 现在,你可以在下图中看到进程工作集的构成。

    2. 排名靠前的类别应为 VirtualAlloc 或 Win32Heap,我们将在练习 2 中进行分析。

    3. 在下面的示例中,“SearchIndexer.exe”通过“堆”分配使用 21.7 MB 的活动内存,通过“VirtualAlloc”API 调用使用 12.4 MB 的活动内存。

    显示进程使用情况的示例表。

专注于第三方进程,并确定它们是否需要在启动时作为预加载软件的一部分启动。 作为开发人员,你应该分析你的进程正在执行的动态分配,以了解可以在哪里进行优化。