1

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

这整个场景让我挠头很长时间了。我创建了一个测试服务器作为虚拟盒子,并在服务器上加载了 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)

schedule.monitor 是从本网站逐字复制的Reloading Source Code

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


编辑:原来问题出在虚拟机上。因为虚拟机被配置为使用我的本地机器作为 DNS,所以从机器内部进行 DNS 查找可能需要 5 秒以上的时间。这意味着任何时候机器连接到另一台服务器(也就是查找我们的 SQL 服务器),它都会冻结,巧合的是在 mod_wsgi 收到请求和我的 python 视图收到请求之间。将值更改/etc/resolv.conf为我们的本地 DNS 解决了这个问题。

4

0 回答 0