Tải CPU cao trên trang web Django / Apache / mod_wsgi


10

Tải thử nghiệm cấu hình django 1.21 / Apache / mod_wsgi trên phiên bản nhỏ AWS (Ubuntu 10.04) với băng ghế Apache đang hiển thị tải CPU rất cao (sử dụng thời gian hoạt động và vmstat) ở các yêu cầu đồng thời thấp:

ab -c 5 -n 1000 "my_url"

... gây ra đầu ra thời gian hoạt động này:

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

CPU ở mức 100% ngay cả với giá trị đồng thời của băng ghế dự bị Apache là 2. Tôi đang chạy băng ghế Apache từ một phiên bản AWS khác trong cùng khu vực / khu vực. Ý tưởng về vấn đề gì, hoặc làm thế nào tôi nên tiếp tục gỡ lỗi này?

Chi tiết:

  • Vì tuyệt vọng, tôi đã cài đặt một dự án / ứng dụng vanilla django với chế độ xem "Hello World" đơn giản (không có cuộc gọi DB, v.v.). Kết quả tương tự. Vì vậy, tôi nghi ngờ đó là mã ứng dụng của tôi.
  • Sử dụng bộ nhớ có vẻ tốt trong quá trình kiểm tra tải.

Đây là một đầu ra vmstat trước / trong / sau khi tải thử nghiệm:

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
  • Tôi đang chạy phiên bản prefork của apache2 vì tôi cũng đang chạy WordPress, dựa trên PHP. (PHP không chơi tốt với phiên bản công nhân Apache)

Đây là tập tin máy chủ ảo của tôi:

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>

Đây là tập tin httpd.conf của tôi:

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

Đây là tập tin wsgi của tôi:

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

Bằng cách nhấn url django từ trình duyệt trong quá trình kiểm tra tải, tôi đã xác nhận một cách định tính rằng tải CPU cao đang ảnh hưởng đến hiệu suất.

Tôi đã đọc rằng điều này có thể không quan trọng, nhưng tôi thấy điều này rất nhiều trong nhật ký lỗi của tôi:

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

Dưới đây là kết quả băng ghế dự bị Apache của tôi, trong trường hợp hữu ích:

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)

Câu trả lời:


2

Vấn đề là tôi đã cài đặt gói apache2-mpm-itk thay vì apache2-mpm-prefork. apache2-mpm-itk có nguồn gốc từ apache2-mpm-prefork, nhưng vì một số lý do, nó không hoạt động tốt khi được sử dụng với mod_wsgi.


Khi sử dụng ITK MPM và mod_wsgi, nên sử dụng chế độ daemon mod_wsgi và vô hiệu hóa việc sử dụng trình thông dịch Python trong các quy trình nhúng. Nếu chế độ nhúng được sử dụng thì bạn đang tải ứng dụng của mình theo mọi yêu cầu giống như CGI.
Graham Dumpleton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.