【发布时间】:2015-08-31 02:04:28
【问题描述】:
在我当前的项目中,我有一个网络服务器,它调用 Linux 命令来获取然后显示在网站上的信息。我遇到的问题是网络服务器运行在只有 256 MB RAM 的微型嵌入式设备(它基本上是设备的配置工具)上。网络服务器本身确实占用了我该设备上一半以上的可用 RAM。
现在,当我尝试使用 subprocess.check_output() 调用命令时,fork 很快就会使 RAM 使用量翻倍(据我所知,因为它克隆了父进程或其他东西),从而使整个事情崩溃了一个“ Out of Memory”,虽然被调用的进程很小。
由于该设备使用相当便宜的闪存芯片,如果过度使用这些芯片会失效,我不想使用任何交换解决方案或其他基于增加虚拟内存的解决方案。
到目前为止,我尝试做的是在程序开始时打开一个 sh 会话,当它的内存使用率仍然很低时,然后将命令写入该 sh 会话并读取输出。这有点工作,但它很不稳定,因为错误的“退出”或类似的东西可能会使整个事情崩溃。
有没有类似于 subprocess.check_output() 的解决方案不会使我的内存使用量翻倍?
【问题讨论】:
-
顺便说一句,您使用的是什么网络服务器?
-
这是一个使用 web.py 作为框架的自编程。
-
想把它贴在某个地方让我们看看吗?
-
对; 足够公平。我可以想到两种方法来解决这个问题。 1) 减少您的网络服务器/应用程序的内存占用 2) 运行另一个独立于您的网络服务器/应用程序的守护程序,该守护程序可以通过 UNIX 套接字/管道进行通信。
-
问题是由于
os.fork()而标准解决方案是一个fork-server(一个产生其他进程的专用进程--基于multiprocessing而不是sh-基于你的题)。相关:Python subprocess.Popen “OSError: [Errno 12] Cannot allocate memory”
标签: python linux memory subprocess