监控和诊断性能问题
使用vmstat监控内存使用量
vmstat
由procps-ng包提供。
以下命令显示各种事件计数器和内存统计的表。
|
|
使用Valgrind分析应用程序的内存使用情况
valgrind
是一个为用户空间二进制文件提供检测的框架。附带了许多工具,用于分析程序的性能:
要使用valgrind
请安装balgrind
软件包:
|
|
使用memcheck分析内存使用情况
memcheck
是默认的valgrind
工具。可以检测并报告许多难以检测和诊断的内存错误,例如:
- 不应发生的内存访问
- 未定义或未初始化的值使用
- 错误地释放堆内存
- 指针重置
- 内存泄露
由于memcheck
使用检测,因此使用memcheck
执行的应用程序比平时慢十倍到三十倍。
要在应用程序运行memcheck
,执行以下命令:
|
|
还可以使用以下选项将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-error=no
,这将禁用此报告,加快memcheck
。 -
--ignore-ranges
指定
memcheck
在检查内存寻址能力时忽略一个或多个范围,例如,--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
。
使用chchegrind分析缓存使用情况
cachegrind
模拟应用程序与系统缓存层次结构和分支预测期器的交互。它跟踪模拟的第一级指令和数据告诉缓存的使用,以检测与此级别告诉缓存的不良代码交互,它还跟踪最后一级缓存(二级或三级)以跟踪内存访问。因此,使用cachegrind
应用程序比平时慢了20到100倍。
cachegrind
手机应用程序执行期间的统计信息,并将摘要输出到控制台。要在程序上运行cachegrid
执行:
|
|
还可以使用以下选项将cachegrind
输出聚焦到特定问题。
-
--I1
指定第一级指令高速缓存的大小,关联性和行大小,就像这样:
--I1=SIZE,ASSOCIATIVITY,LINE_SIZE
。 -
--D1
指定第一级数据高速缓存的大小,关联性和行大小,就像这样:
--D1=SIZE,ASSOCIATIVITY,LINE_SIZE
。 -
--LL
指定最后一级缓存的大小,关联性和行大小,就像这样:
--LL=SIZE,ASSOCIATIVITY,LINE_SIZE
。 -
--cache-sim
启用或禁用缓存访问和未命中计数。默认情况下是启用(
–cache-sim=yes
)。禁用会使cachegrind
无法收集信息。 -
--branch-sim
启用或禁用分支指令的集合和不正确的预测计数。默认情况启用此选项。禁用会使
cachegrind
无法收集信息。
cachegrind
将详细的分析信息写入每个进程的cachegrind.out.pid
文件,其中pid
是进程标识符。这个相信信息可以由配套cg_annotate
工具进一步处理,像这样:
|
|
cachegrind
还提供了cg_diff工具,可以更轻松地在代码更改之前和之后绘制性能。要比较输出文件,执行以下命令,先用初始配置文件输出文件替换,然后再用后续配置文件输出文件替换。
|
|
使用cg_annotate
工具可以更详细地查看输出文件。
使用massif分析堆和堆栈空间
massif
测量指定应用程序使用的堆空间。可以测量有用的空间以及额外用来记录和校准的空间,massif
有助于了解减少应用程序内存使用的方法,以便提高运行速度,减少应用程序耗尽系统交换空间的可能性。使用massif
执行的应用程序运行起来比平时慢20倍左右。
要在一个应用程序中运行massif ,执行:
|
|
用户也可以使用以下选项来将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
文件的数据:
|
|