我正在使用Apache + mod_wsgi运行Django应用程序,我已经在Amazon EC2上安装了6个中等Ubuntu服务器,其中2个用于mongo,4个用于Django和apache,使用ebs作为postgresql并在所有Apache服务器周围configuration了一个负载均衡器,每个服务器有4 GB的内存,但在重负载系统变得缓慢,我看到使用顶部命令,Apache使用7个进程,吃大约2.4 GB的RAM。 下面是apache MPM prefork模块configuration
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule>
这是wsgi守护进程
WSGIDaemonProcess example user=abc group=abc processes=2 threads=25
然后我通过以下这篇文章http://fuscata.com/kb/set-maxclients-apache-prefork改变MaxClients到12,但我得到“请求标头读取超时”错误在Apache错误日志。 请帮助我调整Apache以获得更好的性能。
你使用的configuration真的取决于你的特定的Python Web应用程序的具体情况。 没有适当的监控,你将很难优化你的Apache和mod_wsgiconfiguration。
正如你迄今为止所解释的,我可以看到各种潜在的问题。
首先是你打算使用mod_wsgi守护进程模式,但是你呢? 你不给出完整的configuration,单独的WSGIDaemonProcess指令并不意味着你实际上使用守护进程模式。 如果您没有正确设置守护进程模式,那么使用该configuration会非常快速地消耗大量内存,因为Web应用程序可能正在Apachesubprocess工作进程中运行,而不是在mod_wsgi守护进程模式进程中运行。
第二个问题,如果你不正常使用守护进程模式是你最小/最大设置将导致进程stream失。 这将导致更高的CPU负载,因为stream量在短时间内上升和下降,因此应用程序不断重新加载。
第三个是,即使你正在使用守护进程模式,你有没有禁用Python运行在Apache童工进程保存内存和CPU? 为什么你甚至使用prefork MPM,而不是使用mod_wsgi守护进程模式的worker MPM。
第四个是根据Web应用程序中的CPU绑定和I / O绑定任务之间的平衡,2个进程和25个线程可能非常糟糕。 只使用3个进程和5个线程可能会更好,但不知道你的应用程序做什么,真的很难说,真的需要监控。
无论如何,我可以继续前进,因为这并不是我所能看到的所有潜在问题,但是,如果没有真正的performance数据来衡量你应该做什么,那么我们就会猜测。
我build议你做的只是阅读以下内容:
考虑安装一些监控,如果你仍然不知道该怎么做,请使用mod_wsgi邮件列表获取帮助,如下所示:
StackOverflow网站可能会适合简单的答案,但是对于像这样的主题进行适当的讨论,它们是没用的论坛,因为没有简单的答案可以用两个句子来说明。
我们遇到过类似的情况,虽然设置较简单,我们通过在WSGIDaemonProcess指令中使用更多的processes来解决性能问题。
请参阅“ 在通过mod_wsgi运行Django时在WSGIDaemonProcess中指定多less个进程? ”进行深入讨论。