我有一个自定义的 Django 应用程序,大约每 5,000 个请求就会变得无响应。在 apache 日志中,我看到以下内容:
Apr 13 11:45:07 www3 apache2[27590]: **successful view render here**
...
Apr 13 11:47:11 www3 apache2[24032]: [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting
Apr 13 11:47:43 www3 apache2[24032]: [error] server reached MaxClients setting, consider raising the MaxClients setting
...
Apr 13 11:50:34 www3 apache2[27617]: [error] [client 10.177.0.204] Script timed out before returning headers: django.wsgi
(repeated 100 times, exactly)
Run Code Online (Sandbox Code Playgroud)
我相信我正在使用以下配置运行 WSGI 2.6 (/usr/lib/apache2/modules/mod_wsgi.so-2.6):
阿帕奇配置
WSGIDaemonProcess site-1 user=django group=django threads=50
WSGIProcessGroup site-1
WSGIScriptAlias / /somepath/django.wsgi
Run Code Online (Sandbox Code Playgroud)
/somepath/django.wsgi
import os, sys
sys.path.append('/home/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)
发生这种情况时,我可以终止 wsgi 进程,服务器将恢复。
>ps aux|grep django # process is running as user "django"
django 27590 5.3 17.4 908024 178760 ? Sl Apr12 76:09 /usr/sbin/apache2 -k start
>kill -9 27590
Run Code Online (Sandbox Code Playgroud)
这让我相信这个问题是一个已知问题:
死锁超时= sss (2.0+)
定义在检测到 Python GIL 上的潜在死锁后,在守护进程关闭并重新启动之前允许经过的最大秒数。默认值为 300 秒。存在此选项是为了解决守护进程冻结的问题,因为 rouge Python C 扩展模块在进入阻塞或长时间运行的操作时没有正确释放 Python GIL。
但是,我不确定为什么这种情况不会自动清除。我确实看到脚本超时发生在最后一次成功的页面渲染后 5 分钟,因此触发了死锁超时。但它实际上并没有终止进程。
编辑:更多信息
您可以尝试添加请求限制,然后回收守护进程(在外部进程执行此操作之前)。这是通过添加maximum-requests
的参数来完成的WSGIDaemonProcess
。
请参阅https://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Defining_Process_Groups
或者,您可以调查您的“django”用户被允许拥有多少进程。su - django -s /bin/bash
您可以通过以该用户身份打开 shell并检查ulimit -a
.
归档时间: |
|
查看次数: |
8524 次 |
最近记录: |