Linux环境下追踪指定PID进程的内存分配变化
成熟的进程内存分配生命周期测量与绘图方案
以下是几种比基于strace自定义脚本更成熟、易用的方案,覆盖不同场景需求:
1. psrecord:轻量进程资源监控与绘图
这是专门用于记录进程CPU、内存使用趋势的工具,底层读取/proc文件系统,开销极低,适合长期监控:
- 安装:
pip install psrecord - 使用:
其中psrecord <PID> --plot memory_trend.png --interval 1--interval指定采样间隔(秒),执行后会生成包含RSS(常驻内存)、VSZ(虚拟内存)随时间变化的曲线图,同时还会输出CPU使用率数据。
2. memory-profiler:内存分配细节跟踪(支持Python进程及外部进程)
原本为Python代码内存分析设计,但也可附加到运行中的任意进程:
- 安装:
pip install memory-profiler - 使用:
- 附加到目标进程开始记录:
mprof run --pid <PID> - 生成曲线图:
mprof plot
- 附加到目标进程开始记录:
3. perf:系统级内存调用跟踪与自定义绘图
Linux自带的性能分析工具,可精准跟踪内存相关系统调用事件:
- 记录内存分配/释放事件:
perf record -e kmem:mmap,kmem:munmap,kmem:brk -p <PID> -o perf.data - 导出原始数据:
perf script > memory_events.txt - 后续可使用Python(pandas+matplotlib)或gnuplot处理
memory_events.txt,提取时间、内存变化量绘制曲线。优点是精度高,能获取底层分配的地址、大小等细节。
4. bpftrace:低开销实时内存跟踪
基于eBPF的工具,对目标进程性能影响极小,适合生产环境监控:
- 编写简单跟踪脚本(比如
memory_trace.bt):BEGIN { printf("%-8s %-10s %-12s\n", "TIME", "PID", "MEM_CHANGE(KB)"); } kmem:mmap,kmem:brk { time("%H:%M:%S "); printf("%-10d %-12.2f\n", pid, args->size / 1024.0); } kmem:munmap { time("%H:%M:%S "); printf("%-10d %-12.2f\n", pid, -args->size / 1024.0); } - 运行脚本跟踪目标进程:
bpftrace -p <PID> memory_trace.bt > memory_data.csv - 导出的数据可直接导入Excel或用Python绘图,能实时看到内存的分配/释放变化。
5. 自定义脚本+gnuplot:高度灵活的指标监控
如果需要自定义采集的内存指标(比如共享内存、缓存等),可以直接读取/proc/[PID]/statm或/proc/[PID]/status,结合gnuplot绘图:
- 采集数据的shell脚本(
mem_collector.sh):#!/bin/bash PID=$1 OUTPUT="memory_stats.csv" echo "timestamp,rss_mb,vsz_mb" > $OUTPUT while true; do TS=$(date +%Y-%m-%d_%H:%M:%S) STATM=$(cat /proc/$PID/statm) RSS=$(echo $STATM | awk '{print $2 * 4096 / 1024 / 1024}') VSZ=$(echo $STATM | awk '{print $1 * 4096 / 1024 / 1024}') echo "$TS,$RSS,$VSZ" >> $OUTPUT sleep 1 done - 运行脚本:
./mem_collector.sh <PID> - gnuplot绘图脚本(
plot_mem.gp):set datafile separator "," set terminal png size 1200,600 set output "mem_trend.png" set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set format x "%H:%M:%S" set xlabel "Time" set ylabel "Memory (MB)" plot "memory_stats.csv" using 1:2 title "RSS" with lines lw 2, \ "memory_stats.csv" using 1:3 title "VSZ" with lines lw 2 - 生成图表:
gnuplot plot_mem.gp
方案对比
- 你的
strace方案:能精准跟踪内存调用,但性能开销较大,不适合长期监控; - 轻量监控:优先选
psrecord或自定义/proc采集脚本; - 精准底层分析:用
perf或bpftrace; - Python进程深度分析:用
memory-profiler。
内容的提问来源于stack exchange,提问作者Tabish Mir
相关产品推荐
相关产品推荐

