Django / Apache / mod_wsgi sitesinde yüksek CPU yükü


10

Apache tezgahlı bir AWS küçük örneğinde (Ubuntu 10.04) django 1.21 / Apache / mod_wsgi yapılandırmasının yük testi, düşük eşzamanlı isteklerde son derece yüksek CPU yükü (çalışma süresi ve vmstat kullanarak) gösteriyor:

ab -c 5 -n 1000 "my_url"

... bu çalışma süresi çıktısına neden olur:

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

CPU, 2'lik bir Apache bench eşzamanlılık değeriyle bile% 100'dedir. Aynı bölgede / bölgede farklı bir AWS örneğinden Apache bench'i çalıştırıyorum. Sorunun ne olduğu hakkında fikirler veya bunu nasıl ayıklamaya devam etmeliyim?

Detaylar:

  • Çaresizlik içinde, basit bir "Merhaba Dünya" görünümü (DB aramaları vb.) İle bir vanilya django projesi / uygulaması yükledim. Aynı sonuçlar. Bu yüzden benim uygulama kodum olduğundan şüpheliyim.
  • Yük testi sırasında bellek kullanımı iyi görünüyor.

Yük testinden önce / sırasında / sonrasında bir vmstat çıkışı:

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
  • Ayrıca PHP'ye dayanan WordPress'i çalıştırdığım için apache2'nin prefork sürümünü çalıştırıyorum. (PHP, Apache çalışan sürümü ile iyi oynamıyor)

İşte sanal ana makinelerim:

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>

İşte benim httpd.conf dosyam:

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

İşte benim wsgi dosyam:

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")

Yük testi sırasında bir tarayıcıdan bir django url'sine vurarak, yüksek CPU yükünün performansı etkilediğini nitel olarak doğruladım.

Bunun önemli olmayabileceğini okudum, ancak hata günlüklerimde bunu çok görüyorum:

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

Yardımcı olması durumunda Apache tezgah sonuçlarım:

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)

Yanıtlar:


2

Sorun apache2-mpm-prefork yerine apache2-mpm-itk paketini yüklememdi. apache2-mpm-itk, apache2-mpm-prefork'tan türetilir, ancak bir nedenle mod_wsgi ile kullanıldığında iyi performans göstermedi.


ITK MPM ve mod_wsgi kullanırken, katıştırılmış işlemlerde mod_wsgi arka plan modunu kullanmanız ve Python yorumlayıcı kullanımını devre dışı bırakmanız önerilir. Gömülü mod kullanılırsa, uygulamanızı aynı CGI gibi her istek üzerine yüklüyorsunuz.
Graham Dumpleton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.