Django的apache与内置的dev服务器相比,开销很大

我在即将到来的生产环境中运行Django / Tastypie,但是我注意到使用Apache与使用内置的开发服务器相比,开销很大。 Apache很慢。

这里是使用ab的非科学带宽testing:

阿帕奇:

$ ab -n 100 -c 50 https://www.mydomain.com/api/v1/clock/?format=json This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.mydomain.com (be patient).....done Server Software: Apache/2.2.22 Server Hostname: www.mydomain.com Server Port: 443 SSL/TLS Protocol: TLSv1/SSLv3,AES256-SHA,2048,256 Document Path: /api/v1/clock/?format=json Document Length: 295 bytes Concurrency Level: 50 Time taken for tests: 1.313 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Non-2xx responses: 100 Total transferred: 49800 bytes HTML transferred: 29500 bytes Requests per second: 76.15 [#/sec] (mean) Time per request: 656.634 [ms] (mean) Time per request: 13.133 [ms] (mean, across all concurrent requests) Transfer rate: 37.03 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 15 283 162.5 282 590 Processing: 55 324 148.4 306 622 Waiting: 55 319 150.2 305 621 Total: 110 607 138.8 619 712 Percentage of the requests served within a certain time (ms) 50% 619 66% 691 75% 692 80% 701 90% 709 95% 709 98% 711 99% 712 100% 712 (longest request) 

开发服务器(manage.py runserver):

 $ ab -n 100 -c 50 http://127.0.0.1:8000/api/v1/clock/?format=json This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient).....done Server Software: WSGIServer/0.1 Server Hostname: 127.0.0.1 Server Port: 8000 Document Path: /api/v1/clock/?format=json Document Length: 381 bytes Concurrency Level: 50 Time taken for tests: 0.701 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 54500 bytes HTML transferred: 38100 bytes Requests per second: 142.59 [#/sec] (mean) Time per request: 350.656 [ms] (mean) Time per request: 7.013 [ms] (mean, across all concurrent requests) Transfer rate: 75.89 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 1.9 0 7 Processing: 43 73 47.0 63 365 Waiting: 31 70 47.0 61 365 Total: 50 74 47.0 64 365 Percentage of the requests served within a certain time (ms) 50% 64 66% 67 75% 69 80% 71 90% 77 95% 101 98% 276 99% 365 100% 365 (longest request) 

正如你所看到的,在较小的负载下,开发服务器速度要快10倍左右。 即使在更高的负载下,它也可以处理两倍的请求。

我已经做了基本的修改,以试图解决这个问题,这似乎有点帮助,但有什么我错过了吗? 我要求的'时钟'是一个非常基本的脚本,只需要一个数据库调用,所以没有任何连接或任何事情发生。 这是使用Tastypie,所以输出是直的文本/ JSON。 有些东西似乎不对,因为使用dev服务器的请求速度要快得多。

这是我的Apache设置。 它在守护进程模式下设置在worker MPM上:

 KeepAlive Off <IfModule mpm_worker_module> StartServers 25 MinSpareThreads 25 MaxSpareThreads 300 ThreadLimit 64 ThreadsPerChild 25 MaxClients 300 MaxRequestsPerChild 0 </IfModule> WSGIRestrictEmbedded On 

虚拟主机增加:

  WSGIDaemonProcess www.mydomain.com processes=4 threads=1 WSGIProcessGroup www.mydomain.com WSGIScriptAlias / /var/www/domain/wsgi.py process-group=www.mydomain.com application-group=%{GLOBAL} WSGIPassAuthorization On 

Python / Tastypie设置:

 Debug = False USE_I18N = False USE_X_FORWARDED_HOST = True 

它运行在负载平衡的AWS介质实例上,并且此服务器不提供任何静态文件,如images / css / js。 我试着在IOPS / x-large实例上使用这个,但没有任何改变。 数据库在Amazon RDS上。 但是,运行开发服务器时,所有这一切都是一样的,这告诉我主机环境不是问题。

任何帮助将不胜感激!! 我现在并不担心太高的负荷。 这是一个基于JSON的API,所以所有请求都是文本而且很小。 我最担心的是来自高层次小请求的响应时间。

谢谢! 标记

编辑:

我在apache上做了一个新的abtesting,将dns映射到localhost。 这与将其映射到127.0.0.1基本相同。 这给了更好的结果:

 $ ab -n 100 -c 50 http://www.mydomain.com/api/v1/clock/?format=json This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking www.mydomain.com (be patient).....done Server Software: Apache/2.2.22 Server Hostname: www.mydomain.com Server Port: 80 Document Path: /api/v1/clock/?format=json Document Length: 381 bytes Concurrency Level: 50 Time taken for tests: 0.666 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 55900 bytes HTML transferred: 38100 bytes Requests per second: 150.22 [#/sec] (mean) Time per request: 332.841 [ms] (mean) Time per request: 6.657 [ms] (mean, across all concurrent requests) Transfer rate: 82.01 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 3 3.0 2 6 Processing: 38 258 92.6 308 357 Waiting: 33 254 92.9 303 354 Total: 44 261 90.6 310 363 Percentage of the requests served within a certain time (ms) 50% 310 66% 321 75% 323 80% 327 90% 336 95% 344 98% 362 99% 363 100% 363 (longest request) 

所以最初的testing是通过外部负载平衡器。 这些数字是好的,但是,仍然是前50%的testing平均310毫秒的响应时间。 这些似乎与我的实时外部testing相媲美。 然而,django dev服务器首先50%的testing平均64ms,即使apache服务器扩展好得多。 有没有任何build议来调整Apache,以便它可以落入服务初始请求的范围更快? 我不介意用额外的服务器进行横向扩展,但请求时间对我来说意味着什么。

你有没有考虑过使用NGINX? 它允许我们用uwsgi运行时有显着的性能提升。

您的Apache MPM配置以各种方式被破坏,而且对于实际允许流向实际运行应用程序的mod_wsgi守护程序进程组的请求数量,这种方式也有点矫枉过正。 在加载之下,你所要做的就是创建大量的积压和很长的响应时间,因为你的Django应用程序不能满足处理负载所需的进程/线程。

使用ab只有100个测试请求也会扭曲结果,因为您可能要测量Apache的预热时间,因为它会创建更多的工作进程。 最初,您也将计算您的Django应用程序的加载时间。

我建议你看我的两个PyCon会谈,其中包括Apache / mod_wsgi配置和使用性能监视来找出瓶颈所在。 这可能会给你一些你为什么有问题的背景。