2009-09-25 4 views
6

Прежде всего, я никоим образом не недовольны работой моего сайта, работающего на Django, и не получал массового трафика, чуть более 1000 посещений в день.Выполнение параллелизма в Django (apache2 prefork/mod_wsgi), что я делаю неправильно?

Мне было любопытно, насколько хорошо он справится с большими пиками трафика, поэтому я использовал инструмент ab-tool для проведения бенчмаркинга.

Я заметил, что производительность, когда параллелизм больше 1, обеспечивает тот же самый объем запроса, что и одно одновременное соединение.

Не следует ли увеличить количество повторов/сек с параллелизмом?

Im на виртуальной машине с 1 ГБ ОЗУ, apache2 (prefork), mod_wsgi, memcached и mysql.
Все содержимое на странице было кешировано, база данных не принимает никаких обращений. И если memcached отбросит запись, будет только 2 запросов (проиндексированных) - и их следует немедленно перезаписать.

Бенчмаркинг данные: (примечание: я сделал Benchmark его с 2000 года и 10к запросов с теми же результатами)

За начальную страницу, служил через apache2/mod_wsgi Джанго:
-n100 С4: http://dpaste.com/97999/ (58,2 Reqs/с)
-n100 -c1: http://dpaste.com/97998/ (57,7 Reqs/с)

Для robots.txt, непосредственно из apache2:
-n100 С4: http://dpaste.com/97992/ (4917 Reqs/с)
-n100 -c1: http://dpaste.com/97991/ (1412 Reqs/с)

Это мой апач конф: http://dpaste.com/97995/

Edit: Добавлена ​​дополнительная информация

wsgi.conf: http://dpaste.com/98461/

MySite. conf: http://dpaste.com/98462/

Мой wsgi-обработчик:

import os, sys 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 
import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 
+2

Вы не указали, скомпилирован ли Apache с помощью предпродажного или рабочего MPM. Вы не предоставляете конфигурацию, которую используете, чтобы ваше приложение размещалось mod_wsgi, поэтому не знайте, используете ли вы режим встроенного режима или демон. Использование 100 запросов для образца сравнения также не приведет к хорошим результатам, обычно вы хотели бы использовать тысячи. Также не можете определить, были ли вы уверены, что вы устранили задержки запуска. Apache/mod_wsgi будет лениво загружать веб-приложение Python. Также нет указания, если ваш запрос противоречит базе данных и является ли это проблемой. Необходима дополнительная информация. –

+0

Добавлена ​​дополнительная информация. Я сравнивал его с запросами 2000 и 10 тыс. С теми же результатами. Запрос вообще не попадает в базу данных, я убедился, что все кэшировано (memcached), а top сообщает мне только о процессах Apache, которые используют (все) ресурсы. – schmilblick

+0

О, и у меня на самом деле была «предка» в заголовке, так что информация была предоставлена. Добавлено его текст для ясности. – schmilblick

ответ

12

Как вы используете prefork MPM и mod_wsgi во встроенном режиме с большим количеством процессов, возможно, вы убиваете производительность своей коробки. Для начала, предлагаю вам прочитать:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

Используя встроенный режим, как вы, вы должны тщательно настроить свои параметры MPM. Установка MaxRequestsPerChild не равна нулю, не является хорошим началом, поскольку вы собираетесь периодически вытеснять процессы Apache, в результате чего вы будете вызывать всплеск нагрузки, поскольку все нужно перезагрузить.

Предлагает рабочий MPM и ваше веб-приложение Python, работающее в режиме демонов mod_wsgi. Это для запуска приведет к намного меньшему количеству запущенных процессов, уменьшению издержек памяти и повышению предсказуемости производительности системы. Затем можно более внимательно изучить, почему все может быть медленнее.

Одна вещь, чтобы обратить внимание на то, что вы получите в следующем разделе продукции «AB»:

Connection Times (ms) 
       min mean[+/-sd] median max 
Connect:  0 0 0.0  0  0 
Processing:  0 0 0.2  0  2 
Waiting:  0 0 0.1  0  2 
Total:   0 0 0.2  0  2 

Если максимальная колонка показывает большие значения, то вы получаете пострадали от затрат на загрузку приложений из-за к вам либо не исключая их из ваших тестов с помощью предварительной загрузки, либо путем короткого перерыва процесса.

+0

Спасибо! Я не знал, что mod_wsgi может работать в режиме демона. Я собираюсь прочитать это через пару раз и настроить настройки. Если я правильно прочитал ваше предложение, вы говорите, что я не должен запускать версию apache2 для предкарта? – schmilblick

+2

Если вы используете режим демона для запуска приложения Python WSGI, не так критично, что вы работаете с рабочим MPM, поскольку код Python больше не работает в основных дочерних процессах сервера Apache. Если вы также используете PHP с помощью mod_php, вы все равно будете зацикливаться на запуске prefork MPM. Тем не менее, если не зависит от mod_php или любых других модулей Apache, которые требуют однопоточных процессов Apache, тогда лучше использовать рабочий MPM. Даже если вам все равно придется запускать однопроцессорный MPM-прототип, процессы-демоны mod_wsgi могут быть многопоточными. –