Red Hat Training

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

4.2. 监控及诊断性能问题

红帽企业版 Linux 7 提供大量有用的工具来监控系统性能并诊断与系统内存相关的性能问题。本章概述了可用的工具,并举例说明如何使用它们来监控和诊断与内存相关的性能问题。

4.2.1. 使用 vmstat 监控内存使用量

Vmstatprocps-ng 数据包提供,输出用户系统进程、内存、网页、字块输入/输出、中断以及 CPU 活动等的报告。这是在机子最后一次启动或上一个报告之后提供的关于这些活动平均数的即时报告。
以下指令显示了各种事件计数和内存统计信息列表。
$ vmstat -s
使用 vmstat 的方法,详情请见 <第 A.9 节 “vmstat”> 或手册页:
$ man vmstat

4.2.2. 用 Valgrind 分析应用程序的内存使用量

Valgrind 是一个为用户提供空间二进制文件测量方法的框架。它包含大量的工具来概述和分析程序性能。本章列出的 valgrind 工具能帮助用户检测内存错误,例如未初始化的内存使用和不适当的内存分配及解除分配。
要使用 valgrind 或其工具,请安装 valgrind 数据包:
# yum install valgrind

4.2.2.1. 使用 Memcheck 分析内存使用量

Memcheck 是默认的 valgrind 工具。它检测并报告大量难以检测和诊断到的内存错误,例如:
  • 不应发生的内存访问
  • 使用未定义或未初始化的值
  • 不正确的释放堆内存
  • 指示字重叠
  • 内存泄露

注意

Memcheck 只能报告这些错误,但并不能阻止它们发生。如果程序以通常会引起段错误的方式来访问内存的话,段错误仍然会发生。但memcheck 会在发生错误之前立刻记录一条信息。
由于 memcheck 使用测量工具,通过 memcheck 执行的应用程序会比平常运行起来慢 10-30 倍。
要在应用程序上运行 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,0xRR-0xSS
要查看 memcheck 选项的完整列表,请参见 /usr/share/doc/valgrind-version/valgrind_manual.pdf 中的文档。

4.2.2.2. 使用 Cachegrind 分析缓存使用量

Cachegrind 会模拟应用程序与系统缓存层次结构和分支预测器间的交互作用。它会追踪模拟的第一级指令和数据缓存使用情况,以此检测出该级缓存与代码间不良的交互作用。它也会追踪最后一级缓存(第二或第三极)以便追踪内存访问。这样的情况下,使用 cachegrind 的应用程序运行起来会比通常慢 20-100 倍。
Cachegrind 会收集应用程序执行期间的统计数据,并且将概要输出至操作台。要在应用程序中运行 cachegrind ,请执行以下指令:
# valgrind --tool=cachegrind application
用户也可以使用以下选项来让 cachegrind 的输出集中在一个特定的问题上。
--I1
指定大小、关联性以及第一级指令缓存行大小的方法如下:--I1=size,associativity,line_size
--D1
指定大小、关联性以及第一级数据缓存行大小的方法如下:--D1=size,associativity,line_size.。
--LL
指定大小、关联性以及最后一级缓存行大小的方法如下:--LL=size,associativity,line_size
--cache-sim
启用或禁用缓存访问和缺失数量的集合是默认启用的(--cache-sim=yes)。禁用此集合以及 --branch-sim 来使 cachegrind 不收集信息。
--branch-sim
启用或禁用分支指令及错误预测数量的集合是默认启用的(--branch-sim=yes)。禁用此集合以及 --cache-sim 来使 cachegrind 不收集信息。
Cachegrind 写入详细的分析信息至每个进程 cachegrind.out.pid 文件,其中, pid 是进程标识符。这一详细信息可以使用 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 中的文档。

4.2.2.3. 使用 Massif 分析堆栈空间

Massif 测量特定应用程序的堆空间。它测量可用空间和额外用来记录和调准的空间。massif 有助于用户了解减少应用程序内存使用的方法,以便提高运行速度,减少应用程序耗尽系统交换空间的可能性。使用 massif 执行的应用程序运行起来比平常通常慢 20 倍左右。
要在一个应用程序中运行 massif,请执行如下命令:
# valgrind --tool=massif application
用户也可以使用以下选项来将 massif 的输出集中在一个特定的问题上。
--heap
设定 massif 是否分析堆。默认值为 --heap=yes。要禁用堆分析可设置为 --heap=no
--heap-admin
堆分析启用时要设定每个用于管理的数据块字节数。默认值为 8 字节。
--stacks
设定 massif 是否分析堆。默认值为 --stack=no 是由于堆分析会大大减缓 massif。将这一选项设置为 --stack=yes 来启用堆分析。要注意的是,massif 会假设主要的堆始于零值,这是为了更好地显示与所分析的应用程序相关的堆尺寸的变化。
--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 中的文档。