Django/Apache/mod_wsgi 站点 CPU 负载过高

Django/Apache/mod_wsgi 站点 CPU 负载过高

使用 Apache bench 在 AWS 小型实例(Ubuntu 10.04)上对 django 1.21/Apache/mod_wsgi 配置进行负载测试,显示在低并发请求下 CPU 负载极高(使用 uptime 和 vmstat):

ab -c 5 -n 1000 "my_url"

...导致此正常运行时间输出:

18:04:54 up 9 days, 16:54,  3 users,  load average: 5.33, 2.45, 1.91

即使 Apache 工作台并发值为 2,CPU 仍处于 100% 状态。我正在从同一区域/区域内的另一个 AWS 实例运行 Apache 工作台。您知道问题出在哪里吗?或者我应该如何继续调试?

细节:

  • 出于无奈,我安装了一个带有简单“Hello World”视图(没有 DB 调用等)的 vanilla django 项目/应用程序。结果相同。所以我怀疑这是我的应用程序代码。
  • 负载测试期间内存使用情况看起来良好。

这是负载测试之前/期间/之后的 vmstat 输出:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
0  0      0 1034484  94848 321320    0    0     0     0   13   29  0  0 100  0
6  0      0 1032916  94848 321328    0    0     0     0  262  720  4 32 12  0
6  0      0 1031684  94848 321336    0    0     0     0  312  796  7 33  0  0
8  0      0 1030892  94856 321344    0    0     0    12  302  763  4 36  0  0
...
6  0      0 1030268  94864 321376    0    0     0     0  302  843  3 39  0  0
0  0      0 1032452  94868 321380    0    0     0    12  183  516  3 22 34  0
1  0      0 1033988  94868 321388    0    0     0     0   24   38  1  2 92  0
0  0      0 1033996  94868 321388    0    0     0     0   17   28  0  0 100  0
  • 我正在运行 apache2 的预分叉版本,因为我也在运行依赖于 PHP 的 WordPress。(PHP 与 Apache 工作版本配合不佳)

这是我的虚拟主机文件:

WSGIPythonHome /home/xxx/webapps/ve/api
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName  app.xxx.mobi

        WSGIDaemonProcess snaplive user=www-data group=www-data processes=10 threads=1 maximum-requests=10000
        WSGIProcessGroup snaplive
        WSGIScriptAlias / /home/xxx/webapps/api/settings/apache/prod.wsgi
        DocumentRoot /home/xxx/webapps/api/static
        ErrorLog /var/log/apache2/django-live/error.log
        CustomLog /var/log/apache2/django-live/access.log combined
</VirtualHost>

这是我的 httpd.conf 文件:

Alias /media /home/xxx/Django-1.2.1/django/contrib/admin/media
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so

StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxClients 50
MaxRequestsPerChild 3000
ServerLimit 8
Keepalive off
HostnameLookups Off

这是我的 wsgi 文件:

import os
import sys
sys.stdout = sys.stderr

from django.core.handlers.wsgi import WSGIHandler
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
application = WSGIHandler()

sys.path.append("/home/xxx/webapps/api")

通过在负载测试期间从浏览器访问 django url,我已经定性地确认了高 CPU 负载正在影响性能。

我读到过这可能并不重要,但我在错误日志中经常看到这种情况:

[Sun Sep 19 18:04:58 2010] [error] Exception KeyError: KeyError(-1218693376,) in <module 'threading' from '/usr/lib/python2.6/threading.pyc'> ignored

以下是我的 Apache 基准测试结果,希望对您有帮助:

Server Software:        Apache/2.2.14
Server Hostname:        app.xxx.mobi
Server Port:            80

Document Path:          /plist_catalog/test_data
Document Length:        0 bytes

Concurrency Level:      5
Time taken for tests:   27.720 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Non-2xx responses:      1000
Total transferred:      269000 bytes
HTML transferred:       0 bytes
Requests per second:    36.08 [#/sec] (mean)
Time per request:       138.598 [ms] (mean)
Time per request:       27.720 [ms] (mean, across all concurrent requests)
Transfer rate:          9.48 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    2   8.5      1      88
Processing:     9  136 176.9     81    1182
Waiting:        9  135 176.6     81    1182
Total:         10  138 176.7     83    1183

Percentage of the requests served within a certain time (ms)
  50%     83
  66%     98
  75%    128
  80%    140
  90%    423
  95%    576
  98%    727
  99%    819
 100%   1183 (longest request)

答案1

问题是我安装了 apache2-mpm-itk 包而不是 apache2-mpm-prefork。apache2-mpm-itk 源自 apache2-mpm-prefork,但由于某种原因,与 mod_wsgi 一起使用时表现不佳。

答案2

我最近使用 django 的体验是它非常耗 CPU。我的应用程序相当小,但每当我收到并发请求(只有 15 个或更多请求)时,django 总是占用我 80% - 100% 的 CPU。

后来我增加了 CPU 核心,应用程序开始正常运行。

基本建议:

你的服务器需要多少 RAM?

    Minimum of 8Gig or more for medium sized apps.

您的服务器需要多少个 CPU 核心?

    The number of cores that you will need within your server is directly related to the types of loads you plan to run on your server. 6 to 8 cores for medium sized apps.

更多的核心立即意味着更高的负载性能。

你的服务器需要多少 IOPS?

The I/O usage refers to the disk input and output (I/O).Similarly IOPS refers to Inputs Outputs Per Second.
IOPS determines the speed at which a hard drive reads data from and writes data to a hard drive. 
A high quality Hitachi Ultrastar 15K600 15K SAS disk can deliver as many as 400 IOPS in server tasks, 
While a modern SSD disk can easily delivery 10,000 IOPS or more.

参考:

https://www.eurovps.com/blog/how-much-ram-cpu-storage-iops-vps-needs

https://www.milesweb.com/hosting-faqs/all-you-need-to-know-about-web-hosting-io-usage-iops-limit-and-entry-processes-limit

相关内容