Django mod_wsgi请求需要6秒

时间:2012-08-13 21:13:52

标签: django apache mod-wsgi

简而言之,我的问题是我的请求需要很长时间,我无法找出原因。我不知道我能做些什么来弄清楚为什么这么长时间。我可能忽略了哪些其他技术来帮助缩短请求时间?

这整个场景让我在很长一段时间里摸不着头脑。我已经将测试服务器创建为虚拟盒并在服务器上加载了vagrant。每当我尝试从virtualbox的主机访问Apache / Django网站时,请求平均需要6秒。我读到mod_wsgi应该第一次加载需要时间,但是即使在后续访问中仍然需要大约6秒才能加载。

这是Django工具栏的输出

Resource    Value
User CPU time   183.972 msec
System CPU time     606.908 msec
Total CPU time  790.880 msec
Elapsed time    5720.771 msec
Context switches    12800 voluntary, 21 involuntary

如您所见,经过的时间非常长,而总CPU时间大约是一分钟。我有点担心Context switches的数量很多。无论我接下来尝试使用以下命令来配置Apache

$ ab -n 400 http://127.0.0.1:8080/scheduling/instruments
...
Time taken for tests:   5.389 seconds
Complete requests:      400
...
Time per request:       13.473 [ms] (mean)

这对我没有任何意义,因为它在我的浏览器完成一个请求时设法完成了400个请求。当我在浏览器中发出相同的确切请求时,通常需要6秒钟。我唯一想到的是,请求必须以某种方式花费5秒钟让mod_wsgi启动django并从那里处理请求。以下是我的httpd.conf文件中的相关部分以及用于提供应用程序的django.wsgi文件

# Use apache to serve the static media files
AliasMatch ^/([^/]+)/media/(.*) /var/www/apps/$1/media/$2

<DirectoryMatch ^/var/www/apps/([^/]+)/media>
Order deny,allow
Allow from all
</DirectoryMatch>

WSGIDaemonProcess django_apps user=apache group=root
WSGIProcessGroup django_apps
WSGISocketPrefix /var/run/wsgi
WSGIScriptAliasMatch ^/([^/]+) /var/www/apps/$1/django.wsgi

和django.wsgi apache加载

import os
import sys

path = '/var/www/apps'
path2 = '/var/www/apps/scheduling'
path3 = '/var/www/apps/scheduling/debug_toolbar'
if path not in sys.path:
    sys.path.append(path)
if path2 not in sys.path:
    sys.path.append(path2)
if path3 not in sys.path:
    sys.path.append(path3)

os.environ['DJANGO_SETTINGS_MODULE'] = 'scheduling.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

import scheduling.monitor
scheduling.monitor.start(interval=1.0)

schedu.monitor从此网站Reloading Source Code

逐字复制

如果它有帮助,服务器是我本地Mac Lion上托管的VirtualBox,并且所有端口转发都已正确设置。服务器是Centos 6,默认安装Apache 2.2和Django 1.3.1


编辑:事实证明问题在于它在虚拟机上。由于VM配置为使用我的本地计算机作为DNS,因此DNS查找可能需要超过5秒才能从计算机内部进行。这意味着任何时候机器连接到另一台服务器(也就是查找我们的SQL服务器),它会冻结,巧合在mod_wsgi获取请求和我的python视图接收请求之间。将/etc/resolv.conf中的值更改为我们的本地DNS可以解决问题。

0 个答案:

没有答案