xpa*_*nta 3 mysql mod-wsgi apache-2.2
我有一个使用 Apache 和 mod_wsgi 的 django 网站。自过去 4-5 天以来,我的管理员电子邮件中不断出现此类错误。
OperationalError: (1040, 'Too many connections')
我已经安装了 django-debug-toolbar,每个页面平均有 100-150 个查询,响应时间不到 300 毫秒。我不认为我的 MySql 服务器超载。另一方面,这发生在我尝试重新配置我的httpd.conf
设置后一段时间。
我的网站每天收到 800-1000 次点击。
这些是我的httpd.conf
设置
KeepAlive Off
Listen 13646
MaxSpareThreads 15
MinSpareThreads 8
MaxClients 20
ServerLimit 20
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
MaxRequestsPerChild 1000000
StartServers 20
WSGIDaemonProcess <project> processes=7 threads=12 python-path=<path>
WSGIProcessGroup <project>
WSGIRestrictEmbedded off
WSGILazyInitialization On
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
附注。我正在使用共享托管计划。我的托管计划有 512MB RAM,其中 300MB 是免费的。
关于您的配置的一些评论。
MaxSpareThreads 和 MinSpareThreads 应该是 ThreadsPerChild 的倍数。如果不是,通过某些值组合,您可以让 Apache 在创建新进程之间循环,因为它认为它需要它们,然后决定下一刻再次杀死它们,因为它随后改变主意并认为它们是多余的。因此,将 MinSpareThreads 更改为 5。
MaxClients 表示在所有 Apache 子工作进程中最多可以有 20 个并发请求。然而,它们代理的 mod_wsgi 守护进程有能力处理 7*12=84。因此,您在守护进程/线程上被过度分配,因为 Apache 子工作进程永远无法同时通过 20 个以上的请求。一种更好的配置,使用更少的内存是进程=4 和线程=5。
如果您实际使用的是工作 MPM,则将 StartServers 设置为 20 就太高了。从技术上讲,对于工作 MPM,StartServers 不能超过 MaxClients/ThreadsPerChild。因此,将 StartServers 设置为 2。
MaxRequestsPerChild 设置为任意高,并且根据您的请求吞吐率,您也可以将其设置为正常默认值 0,这意味着保持进程周围而不是在某些最大请求数上回收它们。由于 Python Web 应用程序在 mod_wsgi 守护进程模式下运行,因此无论如何都不需要回收 Apache 子工作进程。
无论如何,这不太可能改变您的原始问题,但会创建更优化的配置。