在Python中检查子进程的内存使用情况

13


我正在Ubuntu上用Python开发一个应用程序,并使用subprocess在Python中运行外部二进制文件。由于这些二进制文件是在运行时生成的,可能会失控,因此我需要严格控制这些二进制文件的内存占用和运行时间。是否有一种方式可以在运行时限制或监控这些二进制程序的内存使用情况?我不想使用"ps"之类的subprocess来达到此目的。

2个回答

14
你可以使用Python的 resource 模块,在派生子进程之前设置限制。
对于监控,resource.getrusage()将为您提供关于所有子进程的摘要信息;如果您想查看每个子进程的信息,可以在其他评论中执行/proc技巧(不可移植但有效),或在每个子进程和一个Python程序之间添加一层,并找出一些通讯方式(可移植,丑陋,稍微有效)。

6

如果您的子进程有PID号码,您可以从proc文件系统中读取所有信息。使用:

/proc/[PID]/smaps(自Linux 2.6.14起) 此文件显示每个进程映射的内存消耗。对于每个映射,都会有一系列行,如下所示:

或者

/proc/[PID]/statm 提供有关内存使用情况的信息,以页面为单位。

或者,您可以使用以下方法限制子进程可以获取的资源:

subprocess.Popen('ulimit -v 1024; ls', shell=True)

当进程达到虚拟内存限制时,它将因内存不足而失败。

1
我需要在Python中实现这个功能。因此,我需要分叉一个子进程,并同时运行一个while循环,不断监视/proc/(pid)/smaps文件。难道没有其他方法吗?例如:我可以为子进程分配固定的内存吗?我希望能够以某种方式使用Python的内存管理器。 - Neo
哎呀,从没想过这个。是的,这对我来说应该完全可行。 - Neo
2
ulimit已经过时。摘自man页面:“警告:此例程已过时。请改用getrlimit(2),setrlimit(2)和sysconf(3)。 - omikron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接