繁体   English   中英

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

[英]How can I decrease the memory usage of my web server which forks processes to run an executable?

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

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

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

非常感谢您对此提供的所有帮助。 谢谢!

人们比我更了解内核,进程和内存的细节,这给人们带来了很多好评! 去看一下。

我确实没有确切的答案,但我希望可以在这里阐明一些建议:

在以下示例中解释了内存使用的原因,以及因此导致的内存不足异常: 使用 subprocess.Popen的Python内存分配错误

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

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

如果这是一项长期运行的任务或占用大量CPU的任务,那么可能不相关的另一件事是,您应该考虑使用CeleryPython RQ之类的东西在后台作业中对此进行处理。 这样可以使您的服务器快速响应请求,并避免积压请求,从而避免由于长期运行的任务正在执行任务而仍在处理20个请求,因此没有其他人可以访问服务器。 使用工人的选择取决于您的需求,截止日期等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM