You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  • 使用:
    1. 附加到目标进程开始记录:
      mprof run --pid <PID>
      
    2. 生成曲线图:
      mprof plot
      
    它会生成包含内存分配峰值、波动细节的图表,若目标是Python进程,还能关联到具体代码行的内存消耗。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:40:25