如何减少支持进程运行可执行文件的Web服务器的内存使用量?

问题描述 投票:1回答:1

我有一个运行在AWS EC2实例上的Django Web服务器,内存为1GB。当向Web服务器发出特定请求时,我需要使用subprocess.call('./executable')运行可执行文件。可执行文件运行一个Perl脚本,它执行一些文件I / O,然后对从文件解析的数据进行一些计算,没什么太疯狂的。

我开始遇到导致我的Web服务器崩溃的内存分配问题,所以我讨论了使用ulimit -v some_value为分配给每个子进程的虚拟内存设置硬限制。我发现每个子进程需要大约100MB才能运行而不会出错,所以毫不奇怪我只遇到1GB的内存问题。

不过,我想知道为什么这个内存使用率如此之高。是否分配了大量额外内存,因为我从运行内存密集型Web服务器的进程调用subprocess.call?运行一个运行Perl脚本的可执行文件必然是内存密集型的,因为Perl有一些开销或其他什么?如果Perl脚本用Python重写并直接在Django Web服务器上运行,它会使用更少的内存吗?

非常感谢这一点的任何和所有帮助。谢谢!

python django perl subprocess out-of-memory
1个回答
-1
投票

人们对内核,进程和内存的细节比我更了解一些很棒的评论!去看一下。

我真的没有给你一个确定的答案,但我希望能在这里阐明一些:

内存使用的原因,以及因此内存异常,在此SO anwer:Python memory allocation error using subprocess.Popen中进行了解释。

这是Unix中一个非常普遍的问题,实际上与python或生物信息学无关。对os.fork()的调用会暂时将父进程的内存加倍(父进程的内存必须对子进程可用),然后将其全部丢弃以执行exec()。虽然这个内存并不总是被实际复制,但是系统必须有足够的内存来允许它被复制,因此如果你的父进程正在使用超过一半的系统内存并且你甚至“wc -l”进行子处理“,你会遇到内存错误。

您应该看一下在Python中实现这个perl脚本并在视图中使用该模块/包,避免在请求 - 响应周期中使用另一个线程/进程来处理这个问题。

另一件可能相关或不相关的事情,如果这是一个长期运行的工作或CPU密集型任务,你应该考虑使用像CeleryPython RQ之类的东西在后台工作中处理它。这可以使您的服务器快速响应请求并避免积压请求,从而避免因为这个长时间运行的任务正在执行其工作而导致20个请求仍在处理的情况,因此没有其他人可以访问服务器。使用工人的选择取决于您的需求,截止日期等。

© www.soinside.com 2019 - 2024. All rights reserved.