Производительность параллелизма в Django (apache2 prefork/mod_wsgi), что я делаю не так?

Прежде всего, я никоим образом не доволен производительностью моего сайта на Django, он не получает большого трафика, чуть более 1000 посещений в день.

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

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

Разве количество запросов не должно увеличиваться при одновременном выполнении?

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

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

Для стартовой страницы, обслуживаемой через apache2/mod_wsgi django:
-n100 -c4: http://dpaste.com/97999/ (58,2 запроса/с)
-n100 -c1: http://dpaste.com/97998/ (57,7 запросов/с)

Для robots.txt напрямую из apache2:
-n100 -c4: http://dpaste.com/97992/ (4917 запросов/с)
-n100 -c1: http://dpaste.com/97991/ (1412 запросов/с)

Это моя конфигурация Apache: http://dpaste.com/97995/

Изменить: добавлено больше информации

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

person schmilblick    schedule 25.09.2009    source источник
comment
Вы не указываете, скомпилирован ли Apache с prefork или worker MPM. Вы не предоставляете конфигурацию, которую используете для размещения вашего приложения на mod_wsgi, поэтому не знаете, используете ли вы встроенный режим или режим демона. Использование 100 запросов для эталонного образца также не даст хороших результатов, обычно вы хотите использовать тысячи. Также не могу сказать, устранили ли вы задержки при запуске. Apache/mod_wsgi будет лениво загружать веб-приложение Python. Также нет указаний, относится ли ваш запрос к базе данных и является ли это проблемой. Требуется дополнительная информация.   -  person Graham Dumpleton    schedule 26.09.2009
comment
Добавлено больше информации. Я проверил его с 2000 и 10 тыс. запросов с теми же результатами. Запрос вообще не попадает в базу данных, я убедился, что все кэшировано (memcached), и top сообщает мне, что это только процессы apache, которые используют (все) ресурсы.   -  person schmilblick    schedule 26.09.2009
comment
О, и у меня на самом деле был prefork в заголовке, так что эта информация была предоставлена. Добавил в текст сейчас для ясности.   -  person schmilblick    schedule 26.09.2009
comment
так рад, что вы использовали dpaste ... везде мертвые ссылки :) Действительно очень полезно для сообщества!   -  person StefanNch    schedule 12.06.2013


Ответы (1)


Поскольку вы используете 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

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

person Graham Dumpleton    schedule 26.09.2009
comment
Спасибо! Я не знал, что mod_wsgi может работать в режиме демона. Я прочитаю это пару раз и изменю свои настройки. Если я правильно прочитал ваше предложение, вы говорите, что мне не следует запускать предварительную версию apache2? - person schmilblick; 28.09.2009
comment
Если вы используете режим демона для запуска приложения Python WSGI, не столь важно, чтобы вы запускали рабочий MPM, поскольку код Python больше не работает в основных дочерних процессах сервера Apache. Если вы также используете PHP с использованием mod_php, вы все равно застрянете с запуском prefork MPM. Тем не менее, если он не зависит от mod_php или любых других модулей Apache, требующих однопоточных процессов Apache, то лучше использовать рабочий MPM. Даже если вам все еще нужно запускать однопоточный prefork MPM, процессы демона mod_wsgi все равно могут быть многопоточными. - person Graham Dumpleton; 28.09.2009