不查看代码能否获知Valgrind的VG_N segments大小?如何查程序内存峰值?
解决Valgrind内存池溢出问题及替代内存监控方案
一、获取Valgrind失败前的内存尝试用量
面对VG_N Segments is too low错误,无root权限时可通过以下方式提取内存相关数据:
- 开启Valgrind详细日志:运行程序时追加参数
valgrind --log-file=valgrind.log --verbose ./your_program,日志文件中会记录报错前的内存分配统计,包括已分配块数量、总内存占用等关键信息。 - 尝试Valgrind的Massif工具:执行
valgrind --tool=massif --massif-out-file=massif.out ./your_program,若程序在报错前Massif已完成部分采集,可通过ms_print massif.out查看已记录的内存峰值数据。即便程序中途崩溃,也可能拿到可用的阶段性统计结果。
二、无需Valgrind的程序最大内存请求量监控方案
Ubuntu 20.04下,无需root权限即可使用以下工具获取内存峰值:
time命令:运行/usr/bin/time -v ./your_program,输出中的Maximum resident set size项即为程序运行期间的物理内存驻留峰值。注意这是实际占用的物理内存,并非虚拟内存请求总量。psrecord工具:若服务器允许安装Python本地包,先执行pip install --user psrecord,再运行psrecord ./your_program --plot memory.png。它会全程记录内存使用变化,生成可视化图表和文本报告,明确标注内存峰值。pmap工具:在程序运行期间(或用gdb暂停程序),执行pmap -x $(pidof your_program),输出末尾的Total行显示当前虚拟内存总大小。多次采样对比,即可近似得到程序运行过程中的虚拟内存峰值。top实时监控:手动执行top -b -p $(pgrep your_program),持续观察RES(驻留内存)和VIRT(虚拟内存)列的数值变化,记录最大值。若需要自动化,可结合简单脚本定时采集数据。
内容的提问来源于stack exchange,提问作者Michael Stachowsky
相关产品推荐
相关产品推荐

