目录

监控和诊断性能问题

使用vmstat监控内存使用量

vmstat由procps-ng包提供。

以下命令显示各种事件计数器和内存统计的表。

1
vmstat -s

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

valgrind是一个为用户空间二进制文件提供检测的框架。附带了许多工具,用于分析程序的性能:

要使用valgrind请安装balgrind软件包:

1
yum install valgrind

使用memcheck分析内存使用情况

memcheck是默认的valgrind工具。可以检测并报告许多难以检测和诊断的内存错误,例如:

  • 不应发生的内存访问
  • 未定义或未初始化的值使用
  • 错误地释放堆内存
  • 指针重置
  • 内存泄露

由于memcheck使用检测,因此使用memcheck执行的应用程序比平时慢十倍到三十倍。

要在应用程序运行memcheck,执行以下命令:

1
valgrind --tool=mecheck 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-error=no,这将禁用此报告,加快memcheck

  • --ignore-ranges

    指定memcheck在检查内存寻址能力时忽略一个或多个范围,例如,--ignore-ranges=0xPP-0xQQ,0xRR-0xSS

使用chchegrind分析缓存使用情况

cachegrind模拟应用程序与系统缓存层次结构和分支预测期器的交互。它跟踪模拟的第一级指令和数据告诉缓存的使用,以检测与此级别告诉缓存的不良代码交互,它还跟踪最后一级缓存(二级或三级)以跟踪内存访问。因此,使用cachegrind应用程序比平时慢了20到100倍。

cachegrind手机应用程序执行期间的统计信息,并将摘要输出到控制台。要在程序上运行cachegrid执行:

1
vaglrind --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)。禁用会使cachegrind无法收集信息。

  • --branch-sim

    启用或禁用分支指令的集合和不正确的预测计数。默认情况启用此选项。禁用会使cachegrind无法收集信息。

cachegrind将详细的分析信息写入每个进程的cachegrind.out.pid文件,其中pid是进程标识符。这个相信信息可以由配套cg_annotate工具进一步处理,像这样:

1
cg_annotate cachegrind.out.pid

cachegrind还提供了cg_diff工具,可以更轻松地在代码更改之前和之后绘制性能。要比较输出文件,执行以下命令,先用初始配置文件输出文件替换,然后再用后续配置文件输出文件替换。

1
cg_diff FIRST SECOND

使用cg_annotate工具可以更详细地查看输出文件。

使用massif分析堆和堆栈空间

massif测量指定应用程序使用的堆空间。可以测量有用的空间以及额外用来记录和校准的空间,massif有助于了解减少应用程序内存使用的方法,以便提高运行速度,减少应用程序耗尽系统交换空间的可能性。使用massif执行的应用程序运行起来比平时慢20倍左右。

要在一个应用程序中运行massif ,执行:

1
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文件的数据:

1
ms_print massif.out.pid