调整使用 apache wsgi 部署的基于 django 的站点以获得更好的性能

调整使用 apache wsgi 部署的基于 django 的站点以获得更好的性能

我正在使用 apache+mod_wsgi 运行 django 应用程序,我在 Amazon ec2 上设置了 6 个中型 ubuntu 服务器,其中 2 个用于 mongo,4 个用于 django 和 apache,使用 ebs 用于 postgresql,并在所有 apache 服务器周围配置了一个负载均衡器,每个服务器都有 4 GB 的 RAM,但在重负载期间系统会变慢,我使用 top 命令看到 apache 正在使用 7 个进程并消耗大约 2.4 GB 的 RAM。以下是 apache MPM prefork 模块配置

<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

然后我按照这篇文章将 MaxClients 改为 12http://fuscata.com/kb/set-maxclients-apache-prefork,但我在 apache 错误日志中收到“请求标头读取超时”错误。请帮助我调整 apache 以获得更好的性能。

答案1

您使用的配置实际上取决于特定 Python Web 应用程序的具体情况。如果没有适当的监控,您将很难优化 Apache 和 mod_wsgi 配置。

从您迄今为止的解释中,我可以看到各种潜在的问题。

首先,您打算使用 mod_wsgi 守护进程模式,但您真的这么做了吗?您没有提供完整的配置,而且 WSGIDaemonProcess 指令本身并不意味着您实际上正在使用守护进程模式。如果您没有正确设置守护进程模式,您将很快使用该配置消耗大量内存,因为 Web 应用程序很可能在 Apache 子工作进程中运行,而不是在 mod_wsgi 守护进程模式进程中运行。

如果您没有正确使用守护进程模式,第二个问题是,您的最小/最大设置将导致进程流失。随着流量在短时间内上升和下降,应用程序不断重新加载会导致更高的 CPU 负载。

第三,即使您正确使用了守护进程模式,您是否已禁用 Python 在 Apache 子工作进程中运行以节省内存和 CPU?为什么您甚至使用 prefork MPM 而不是 worker MPM,如果您使用 mod_wsgi 守护进程模式,后者会更好。

第四,根据 Web 应用程序中 CPU 密集型任务和 I/O 密集型任务之间的平衡,2 ​​个进程和 25 个线程可能非常糟糕。仅使用 3 个进程,每个进程 5 个线程可能会更好,但不知道应用程序在做什么,很难说,监控确实需要。

无论如何,我可以继续,因为这不是我能看到的所有潜在问题,但如果没有真实的性能数据来判断你应该做什么,那真的只是猜测。

我建议您阅读/观看以下内容:

考虑安装一些监控,如果您仍然不知道该怎么做,请使用 mod_wsgi 邮件列表获取帮助,如下所述:

StackOverflow 网站可能可以为迎合 TLDR 人群提供简单的答案,但它们对于正确讨论此类主题而言是一个无用的论坛,因为没有人能够用两句话给出简单的答案。

答案2

我们也遇到过类似的情况,尽管设置更简单,但我们通过processesWSGIDaemonProcess指令中使用更多数字来解决性能问题。

看 ”通过 mod_wsgi 运行 Django 时,我应该在 WSGIDaemonProcess 中指定多少个进程?”进行深入探讨。

相关内容