Beban CPU tinggi pada situs Django / Apache / mod_wsgi

10

Memuat pengujian konfigurasi Django 1.21 / Apache / mod_wsgi pada instance AWS kecil (Ubuntu 10.04) dengan bangku Apache menunjukkan beban CPU yang sangat tinggi (menggunakan waktu aktif dan vmstat) dengan permintaan bersamaan yang rendah:

ab -c 5 -n 1000 "my_url"

... menyebabkan output uptime ini:

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

CPU pada 100% bahkan dengan nilai concurrency bangku Apache dari 2. Saya menjalankan bangku Apache dari contoh AWS yang berbeda di wilayah / zona yang sama. Gagasan tentang apa masalahnya, atau bagaimana saya harus terus men-debug ini?

Detail:

  • Karena putus asa, saya menginstal proyek / aplikasi vanilla django dengan tampilan "Hello World" sederhana (tidak ada panggilan DB, dll). Hasil yang sama. Jadi saya ragu itu kode aplikasi saya.
  • Penggunaan memori terlihat baik selama uji beban.

Berikut ini adalah output vmstat sebelum / selama / setelah tes beban:

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
  • Saya menjalankan versi prefork dari apache2 karena saya juga menjalankan WordPress, yang bergantung pada PHP. (PHP tidak cocok dengan versi pekerja Apache)

Ini file virtual hosts saya:

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>

Ini file httpd.conf saya:

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

Ini file wsgi saya:

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

Dengan menekan url django dari browser selama uji beban, saya telah mengkonfirmasi secara kualitatif bahwa beban CPU yang tinggi memengaruhi kinerja.

Saya telah membaca bahwa ini mungkin tidak penting, tapi saya sering melihat ini di log kesalahan saya:

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

Berikut adalah hasil bangku Apache saya, jika bermanfaat:

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)
orang yg membuang sampah di jalan
sumber

Jawaban:

2

Masalahnya adalah bahwa saya telah menginstal paket apache2-mpm-itk alih-alih apache2-mpm-prefork. apache2-mpm-itk berasal dari apache2-mpm-prefork, tetapi karena beberapa alasan, tidak berkinerja baik ketika digunakan dengan mod_wsgi.

orang yg membuang sampah di jalan
sumber
Saat menggunakan ITK MPM dan mod_wsgi, direkomendasikan untuk menggunakan mod_wsgi daemon mode dan nonaktifkan penggunaan interpreter Python dalam proses embedded. Jika embedded mode digunakan maka Anda memuat aplikasi Anda pada setiap permintaan seperti halnya CGI.
Graham Dumpleton