使用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 |