我有一个自定义的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)
我相信我使用以下configuration运行WSGI 2.6(/usr/lib/apache2/modules/mod_wsgi.so-2.6):
apacheconfiguration
WSGIDaemonProcess site-1 user=django group=django threads=50 WSGIProcessGroup site-1 WSGIScriptAlias / /somepath/django.wsgi
/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()
发生这种情况时,我可以杀死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
这使我相信这个问题是一个已知的问题 :
deadlock-timeout = sss(2.0+)
定义在守护进程closures之前允许通过的最大秒数,在检测到Python GIL发生潜在死锁后重新启动。 默认值是300秒。 这个选项的存在是为了防止由于Python C扩展模块在进入阻塞或长时间运行时没有正确释放Python GIL而导致守护进程冻结的问题。
但是,我不确定为什么这个条件不会自动清除。 我确实看到脚本超时正好发生在最后一次成功页面呈现5分钟之后,因此死锁超时正在触发。 但它并没有真正杀死这个过程。
编辑:更多信息
您可以尝试添加一个请求的限制,在此之后,守护进程将被回收(在外部进程之前)。 这是通过添加WSGIDaemonProcess
的maximum-requests
参数来WSGIDaemonProcess
。
请参阅https://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Defining_Process_Groups
或者,您可以调查您的“django”用户允许拥有多less进程。 你可以通过以su - django -s /bin/bash
打开一个shell来检查,并检查ulimit -a
输出。