Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

7.2. 监控和诊断性能问题

红帽企业 Linux 7 提供了很多工具,这些工具可用于监控系统性能并诊断与系统内存相关的性能问题。本节概述了可用的工具,并提供了如何使用它们来监控和诊断与内存相关的性能问题的示例。

7.2.1. 使用 vmstat 监控内存使用情况

vmstatprocps-ng 软件包提供,输出系统进程、内存、分页、块输入/输出、中断和 CPU 活动的报告。它提供自计算机上一次启动或上次报告之后平均这些事件的即时报告。
以下命令显示各种事件计数器和内存统计信息的列表。
$ vmstat -s
有关如何使用 vmstat 的详情,请参考 第 A.8 节 “vmstat” 或 man page:
$ man vmstat

7.2.2. 使用 Valgrind 分析应用程序内存使用情况

Valgrind 是一个为用户空间二进制文件提供检测的框架。它随附了大量工具,可用于分析和分析程序性能。本节概述的 valgrind 工具可帮助您检测内存错误,如未初始化内存使用和不正确的内存分配或释放。
要使用 valgrind 或其任何工具,请安装 valgrind 软件包:
# yum install valgrind

7.2.2.1. 使用 Memcheck 分析内存使用情况

Memcheck 是默认的 valgrind 工具。它检测并报告一些难以检测和诊断的内存错误,例如:
  • 不应发生的内存访问
  • 未定义或未初始化值使用
  • 释放堆内存不正确
  • 指针重叠
  • 内存泄漏
注意
Memcheck 只能报告这些错误,它无法防止它们发生。如果您的程序以通常会导致分段错误的方式访问内存,则分段错误仍会发生。但是,memcheck 会在故障前立即记录错误消息。
因为 memcheck 使用检测程序,所以通过 memcheck 执行的应用程序会运行 10 到三十倍,比通常要慢十倍。
要在应用程序上运行 memcheck,请执行以下命令:
# valgrind --tool=memcheck application
您还可以使用以下选项将 memcheck 输出专注于特定类型的问题。
--leak-check
在应用程序完成执行后,memcheck 会搜索内存泄漏。默认值为 --leak-check=summary,它打印找到的内存泄漏数量。您可以指定 --leak-check=yes--leak-check=full 来输出每个泄漏的详情。要禁用,请指定 --leak-check=no
--undef-value-errors
默认值为 --undef-value-errors=yes,在使用未定义值时报告错误。您还可以指定 --undef-value-errors=no,这将禁用此报告并稍微加快 Memcheck。
--ignore-ranges
指定在检查内存可寻址时 memcheck 应该忽略的一个或多个范围,例如 :--ignore-ranges=0xPP-0xQQ,0xR-0xSS
有关 memcheck 选项的完整列表,请查看包含在 /usr/share/doc/valgrind-version/valgrind_manual.pdf 的文档。

7.2.2.2. 使用 Cachegrind 分析缓存使用情况

cachegrind 模拟应用程序与系统的缓存层次结构和分支预测器的交互。它跟踪模拟第一级指令和数据缓存的使用情况,以检测与这一缓存级别交互较差的代码。它还跟踪最后一级缓存(第二或第三级),以跟踪内存访问。因此,使用 cachegrind 执行的应用程序会运行 twenty,比通常要慢一百倍。
cache grind 收集应用程序执行期间的统计信息,并输出控制台的摘要。要在应用程序上运行 cachegrind,请执行以下命令:
# valgrind --tool=cachegrind application
您还可以使用以下选项将 cachegrind 输出专注于特定问题。
--I1
指定第一个指令缓存的大小、关联和行大小,例如 :--I1=size关联性line_size
--D1
指定第一级数据缓存的大小、关联性和行大小,例如 :--D1=size关联性line_size
--LL
指定最后一个缓存的大小、关联和行大小,例如 :--LL=size关联性line_size
--cache-sim
启用或禁用缓存访问和未命中计数的集合。默认启用(--cache-sim=yes)。禁用这个和 --branch-sim 会保留 cachegrind,没有要收集的信息。
--branch-sim
启用或禁用分支指令的集合和不正确的预测计数。默认启用(--branch-sim=yes)。禁用这个和 --cache-sim 会保留 cachegrind,没有要收集的信息。
cachegrind 将详细的性能分析信息写入每个进程 cachegrind.out.pid 文件,其中 pid 是进程标识符。此详细信息可以通过 companion cg_annotate 工具进一步处理,例如:
# cg_annotate cachegrind.out.pid
cachegrind 还提供 cg_diff 工具,这有助于在代码更改之前和之后图表程序性能。若要比较输出文件,可执行以下命令,首先将 替换为初始配置文件输出文件,第二个则替换为后续配置文件输出文件:
# cg_diff first second
可以通过 cg_annotate 工具查看生成的输出文件。
有关 cachegrind 选项的完整列表,请查看 /usr/share/doc/valgrind-version/valgrind_manual.pdf 的文档。

7.2.2.3. 使用 Massif 分析 Heap 和堆栈空间

Massif 测量指定应用程序使用的堆空间。它测量有用的空间和分配用于预订和调整的其他空间。massif 帮助您了解如何减少应用程序的内存使用来加快执行速度,并降低应用程序耗尽系统交换空间的可能性。使用 massif 执行的应用程序运行大约会比通常的 Tenty 慢。
要在应用程序上运行 massif,请执行以下命令:
# valgrind --tool=massif application
您还可以使用以下选项将 massif 输出专注于特定问题。
--heap
指定 massif 配置集是否为堆。默认值为 --heap=yes。可以通过将其设置为 --heap=no 来禁用堆性能分析。
--heap-admin
指定启用堆性能分析时要用于管理的每个块的字节数。默认值为 8 字节。
--stacks
指定堆栈的 massif 配置集。默认值为 --stack=no,因为堆栈性能分析可能会大大减慢 massif。将此选项设置为 --stack=yes 以启用堆栈性能分析。请注意,mass if 假定主堆栈以 0 大小开头,以便更好地指示与正在配置文件应用相关的堆栈大小的变化。
--time-unit
指定 massif 收集性能分析数据的间隔。默认值为 i (已执行)。您还可以指定 ms (毫秒或实时)和 B (在堆和堆栈上分配的字节或取消分配)。检查分配的字节对于短期运行的应用和测试非常有用,因为它可以在不同的硬件之间重复生成。
Massif 输出性能分析数据到 massif.out.pid 文件中,其中 pid 是指定应用程序的进程标识符。ms_print 工具会图形此性能分析数据,以显示应用的执行上的内存消耗,以及负责在峰值内存分配点处分配的站点的详细信息。要绘制 massif.out.pid 文件中的数据,请执行以下命令:
# ms_print massif.out.pid
有关 Massif 选项的完整列表,请查看 /usr/share/doc/valgrind-version/valgrind_manual.pdf 的文档。