如何测量使用concurrent.futures.ProcessPool的Python进程总峰值内存(含子进程)
测量Python多进程脚本的内存峰值(含子进程与写时复制)
针对使用concurrent.futures.ProcessPool的Python脚本,要准确统计包含所有子进程的内存峰值,同时考虑Linux写时复制(COW)的共享内存,推荐以下工具:
1. smem
- 核心优势:专门优化内存统计逻辑,自动识别COW共享内存页,汇总进程组内存时不会重复计算共享部分,给出更真实的内存占用。
- 使用方式:
安装后,通过进程名过滤并汇总统计:
参数说明:smem -t -k -u -P "python your_script.py"-t:显示进程组的汇总行-k:以KB为单位展示内存(可用-m切换为MB)-u:按用户维度分组统计-P:匹配指定的进程命令或名称
输出中的**PSS(Proportional Set Size)**字段是关键——它按比例分配共享内存的占用,完美解决COW场景下的重复统计问题,能直接反映整个进程树的实际内存消耗。
2. psrecord
- 核心优势:Python编写的轻量工具,自动追踪主进程的所有子进程,记录内存/CPU的变化趋势,可输出峰值数据或生成可视化图表。
- 使用方式:
安装后,直接跟踪脚本运行:
也可以先获取主进程PID,再单独跟踪:psrecord --plot memory_peak.png --log memory_stats.txt "python your_script.py"
日志文件中会明确记录整个进程树的内存峰值,统计时已考虑COW共享内存的影响。psrecord --plot memory_peak.png --log memory_stats.txt <主进程PID>
3. top(进程组模式)
- 核心优势:系统自带工具,无需额外安装,通过进程组ID(PGID)过滤子进程,结合PSS字段实现COW-aware的内存统计。
- 使用方式:
- 先获取主进程的PGID:
ps -o pgid= <主进程PID> - 用top过滤该进程组并显示PSS字段:
top -p $(pgrep -g <PGID>) -o %MEM -H - 若要自动计算总PSS(内存峰值可通过持续观察或脚本捕获):
top -b -n 1 -p $(pgrep -g <PGID>) | awk '/PSS/ {sum += $NF} END {print "Total PSS: " sum " KB"}'
- 先获取主进程的PGID:
4. nmon
- 核心优势:交互式监控工具,支持按进程组排序,直观展示每个进程的共享/独占内存,适合实时观察内存变化并捕捉峰值。
- 使用方式:
启动nmon后,按p进入进程视图,再按g切换为进程组排序,找到你的Python进程组,查看PSS或SHR字段——它会自动处理COW共享内存,避免重复统计子进程的共享页。
内容的提问来源于stack exchange,提问作者Anthony Poole
相关产品推荐
相关产品推荐

