我正在测试一个程序,我需要确定该进程使用的最大内存。我知道一般情况下
ps -aux
可以给我这些信息,但该过程运行时间不到 1/10 秒,因此让 ps 捕获它不是一个好的选择。
还有其他好的选择来获取此类信息吗?我正在对程序运行一些基准测试,看看是否可以提高其内存使用率。
答案1
valgrind
将为您提供此信息,以及有关内存使用的许多其他统计信息(并且它会告诉您有关内存泄漏等的信息)。它会稍微减慢程序速度,但由于您的进程是短暂的,所以这不应该成为问题。
以下是运行的示例输出ls
:
==7051==
==7051== HEAP SUMMARY:
==7051== in use at exit: 351,689 bytes in 838 blocks
==7051== total heap usage: 1,049 allocs, 211 frees, 688,325 bytes allocated
==7051==
==7051== LEAK SUMMARY:
==7051== definitely lost: 0 bytes in 0 blocks
==7051== indirectly lost: 0 bytes in 0 blocks
==7051== possibly lost: 0 bytes in 0 blocks
==7051== still reachable: 351,689 bytes in 838 blocks
==7051== suppressed: 0 bytes in 0 blocks
==7051== Rerun with --leak-check=full to see details of leaked memory
==7051==
==7051== For counts of detected and suppressed errors, rerun with: -v
==7051== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
您要查找的具体信息由“总堆使用量”行给出。
答案2
使用GNU时间(它比 bash 中的内置“时间”有更多的功能):
$ sudo apt-get install time
$ \time prog >/dev/null
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 2380maxresident)k
0inputs+0outputs (0major+119minor)pagefaults 0swaps
转义\time
明确询问不是使用内置的,/usr/bin/time
也可以。还有更多的显示可能性,请使用“man time”。
答案3
这是一个旧线程,但当我还需要检查短时间运行的进程的内存要求时,我刚刚遇到它。
我做了一些调查,接受的答案似乎不正确。 OP 和我自己正在尝试找到程序在任何时候使用的最大内存量,即峰值内存需求。
valgrind 的指标total heap usage
并不衡量这一点,而是衡量执行期间所有分配的总和。因此,如果分配并释放 1MB 的循环迭代 100 次,则total heap usage
即使峰值内存需求仅为 1MB,也会为指标贡献 100MB。
Valgrind 确实包含一个工具 Massif,可用于查找程序的峰值内存需求,可以使用 Massif-Visualizer 工具将其可视化:
valgrind --tool=massif ./<your program>
massif-visualizer massif.out.<num>
该工具将绘制一段时间内的总堆使用情况,并确定程序的正确峰值堆需求。这个过程描述于更多详细信息请参见此处。