我想执行一批作业,然后有一个摘要告诉我每个作业的峰值内存需求是多少。在分析器(如valgrind )下执行作业是不可接受的,因为它会减慢工作速度。对于正在运行的作业,我可以在 /proc/JOBPID/status 下读取 VmPeak 的值,其中 JOBPID 是作业进程的 PID。但是我需要获取作业的历史最大内存需求,因此我需要在作业的进程即将完成时获取 VmPeak 的值,否则我只会在我阅读的那一刻获得峰值内存使用量VmPeak,阅读后可能会增加。因此,除非有一种方法可以读取已完成进程的 VmPeak 值,否则这种方法似乎没有用。关于如何获得从进程启动到完成时分配给进程的最大内存量的任何其他想法?
VmPeak 答案对我来说似乎是一个不错的答案...您可以每隔 x 秒将 vmpeak 附加到文件中,然后找到最大值。或者,每隔 x 秒,运行类似:
VmPeak = curVmPeak if (curVmPeak > VmPeak)
.您是否尝试过为您的主程序覆盖子收割者?在收获死去的孩子之前,您可能可以访问您感兴趣的过程统计信息。
我最后的赌注是用您自己的共享库覆盖 libc 的 exit() 调用,并让您的程序为您报告这些统计信息。
我希望有一个解决方案,使用挂钩脚本可以在作业进程完成时触发,然后短暂暂停进程以检查 VmPeak 的值。修改每个作业的源代码我可能可以通过编写退出处理程序(使用类似atexit函数的东西)轻松地做类似的事情。但我不想触及源头。
我最终使用的解决方案基本上是 Kyle Brandt 提出的,即每隔几个单位时间对峰值内存使用情况进行采样,然后通过这种方式确定最大值。虽然我不必自己写。我找到了一个基本上可以做到这一点的小工具,它叫做memtime。