6

首先,我对我的 Django 驱动网站的性能没有任何不满,它没有获得大量流量,到目前为止每天访问量超过 1000 次。

我很好奇它在应对流量高峰时的表现如何,所以我使用 ab-tool 进行了一些基准测试。

我注意到并发大于 1 时的性能提供与 1 个并发连接相同数量的请求。

reqs/s 不应该随着并发的增加而增加吗?

我在具有 1 GB RAM、apache2(prefork)、mod_wsgi、memcached 和 mysql 的虚拟机上。
页面上的所有内容都已被缓存,数据库没有任何命中。如果 memcached 会删除该条目,则只有 2 个轻量(索引)查询 - 并且应该立即重新缓存。

基准数据:(注意:我确实用 2000 和 10k 个请求对它进行了基准测试,结果相同)

对于起始页,django 通过 apache2/mod_wsgi 提供服务:
-n100 -c4: http://dpaste.com/97999/ (58.2 reqs/s)
-n100 -c1: http://dpaste.com/97998/ (57.7请求/秒)

对于 robots.txt,直接来自 apache2:
-n100 -c4: http://dpaste.com/97992/ (4917 reqs/s)
-n100 -c1: http://dpaste.com/97991/ (1412 reqs/s )

这是我的 apache conf:http ://dpaste.com/97995/

编辑:添加了更多信息

wsgi.conf:http ://dpaste.com/98461/

mysite.conf:http ://dpaste.com/98462/

我的 wsgi 处理程序:

import os, sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
4

1 回答 1

12

由于您在嵌入式模式下使用 prefork MPM 和 mod_wsgi 并带有大量进程,因此您可能会降低机器的性能。首先,建议您阅读:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

像您一样使用嵌入式模式,您需要仔细调整您的 MPM 参数。将 MaxRequestsPerChild 设置为非零并不是一个好的开始,因为您将定期强制退出 Apache 进程,结果将导致负载峰值,因为所有内容都必须重新加载。

建议工人 MPM 和你的 Python Web 应用程序在 mod_wsgi 守护程序模式下运行。首先,这将导致运行的进程更少,内存开销更少,并为系统性能提供更多可预测性。然后可以开始更仔细地研究为什么事情可能会运行得更慢。

需要注意的一件事是您在“ab”输出的以下部分得到什么:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.2      0       2
Waiting:        0    0   0.1      0       2
Total:          0    0   0.2      0       2

如果 max 列显示较大的值,那么您会受到应用程序加载成本的影响,因为您要么没有通过预加载从测试中消除它们,要么是因为进程重启间隔较短。

于 2009-09-26T11:26:14.890 回答