|
8
|
| davidmytton · 技术社区 · 17 年前 |
|
|
1
5
您可能有一个内存泄漏,由一些
resource limit
(
ps aux 在繁忙的系统上可能会很冗长。。。 使现代化 您可以使用 resource 模块:
|
|
|
2
3
这个交换空间的答案是假的。从历史上看,Unix系统希望这样的交换空间可用,但它们不再以这种方式工作(Linux也从未以这种方式工作)。您甚至还没有接近耗尽内存,因此这不可能是实际问题-您正在耗尽其他一些有限的资源。 考虑到错误发生的位置(_get_handles调用os.pipe()来创建到子级的管道),您可能遇到的唯一真正问题是没有足够的可用文件描述符。相反,我会查找未关闭的文件(执行popen的进程的PID上的lsof-p)。如果您的程序确实需要一次打开大量文件,则增加打开文件描述符的用户限制和/或系统限制。 |
|
3
3
不确定您收到的错误指示内存不足的原因:它应该是一个文件描述符错误,作为的返回值
|
|
|
4
2
如果您运行的是后台进程,那么很可能您已经重定向了进程stdin/stdout/stderr。 在这种情况下,将选项“close_fds=True”附加到Popen调用中,这将阻止子进程继承重定向的输出。这可能是你遇到的极限。 |
|
|
5
1
在添加交换空间之前,您可能需要等待所有这些PS进程完成。
但是您对subprocess.Popen的调用每次都会派生一个新进程。 使现代化 .
|
|
|
6
1
所有人都应该提供有趣的信息。我认为这一过程占用了本应释放的资源。它是否有可能占用资源句柄(内存块、流、文件句柄、线程或进程句柄)?stdin,stdout,stderr来自生成的“ps”。内存句柄。。。从许多小的增量分配。当您的流程刚刚完成首次启动和运行,并且在24小时“坐”在那里定期启动子流程之后,我非常有兴趣看到上面的命令为您的流程显示了什么。 因为它在几天后就死了,所以您可以让它只运行几个循环,然后每天重新启动一次,作为一种解决方法。这会在这段时间内对你有所帮助。 雅各布 |
|
|
7
0
你需要
注意:这在Windows上不起作用。 |
|
|
8
0
我不认为您链接到的Zenoss文章中给出的情况是导致这条消息的唯一原因,因此还不清楚交换空间是否确实是问题所在。我建议,即使是在成功调用的情况下,也要记录一些更多的信息,这样您就可以在每次调用之前查看可用内存的状态
还有一件事——如果你指定的话
更新:
如果不是内存,下一个可能的罪魁祸首就是文件句柄。我建议在以下情况下运行失败的命令
|
|
|
9
0
虚拟内存很重要!!! 在将交换添加到操作系统之前,我遇到了同样的问题。虚拟内存的公式通常是:SwapSize+50%*PhysicalMemorySize。我最终通过添加更多物理内存或添加交换磁盘来解决这个问题。在我的情况下,close_fds不起作用。 |