确定极短进程的最大内存使用量

确定极短进程的最大内存使用量

我正在测试一个程序,我需要确定该进程使用的最大内存。我知道一般情况下 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>

该工具将绘制一段时间内的总堆使用情况,并确定程序的正确峰值堆需求。这个过程描述于更多详细信息请参见此处

相关内容