Сколько процессов я должен указать в WSGIDaemonProcess при запуске Django через mod_wsgi?

23

Допустим, у меня есть 2 сайта (Superuser и Serverfault), запущенные с их собственного виртуального хоста Apache на одном компьютере. Эти 2 сайта работают на Django и работают на Apache с mod-wsgi. Типичный файл конфигурации для одного из сайтов будет выглядеть следующим образом:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

Хост - это Linux-машина с 4 ГБ оперативной памяти под управлением Ubuntu. Может кто-нибудь предложить количество процессов, которые я должен указать выше для моих 2 сайтов? Давайте предположим, что у них такой же трафик, как и у сайтов Superuser и Serverfault.

Тьерри Лам
источник

Ответы:

22

Ну, сколько трафика сделать фактические сайты суперпользователя и Serverfault есть? Гипотетики не очень полезны, если у них недостаточно информации, чтобы облегчить ответ ...

Число процессов в худшем случае должно быть максимальным числом запросов в секунду, которое должен обрабатывать сайт, деленным на количество запросов в секунду, которое может обработать один процесс, если все эти запросы будут выполнены с вашим самым медленным действием (поэтому обратная величина времени обработки этого действия). Добавьте любой коэффициент помадки, который вы считаете подходящим, на основе доверительного интервала ваших требований / сек и временных измерений.

Среднее число наблюдений такое же, но вы делите req / sec на средневзвешенное значение числа запросов в секунду для каждого действия (вес - это процент запросов, которые вы ожидаете выполнить для данного конкретного действия). Опять же, факторы помадки полезны.

Фактическая верхняя граница количества процессов, которые вы можете запустить на машине, определяется верхним объемом памяти, который занимает каждый процесс; спулингировать один процесс, а затем выполнить множество действий, требующих памяти (те, которые обычно извлекают и обрабатывают много данных), с реалистичным набором данных (если вы просто используете игрушечный набор данных для тестирования, скажем, 50 или 100) строк, а затем, если одно из ваших действий извлекает и манипулирует каждой строкой в ​​таблице, это не будет хорошим измерением для того, когда эта таблица увеличится до 10000 строк), чтобы увидеть, к чему стремится использование памяти. Вы можете искусственно ограничить использование памяти каждым процессом с помощью сценария, который пожинает работникам, которые достигают определенного порога использования памяти, с риском возникновения неприятных проблем, если вы установите этот порог слишком низким.

Получив показатель использования памяти, вы вычитаете некоторый объем памяти для загрузки системы (мне самому нравится 512 МБ), вычитаете кучу больше, если у вас на том же компьютере запущены другие процессы (например, база данных), а затем еще немного, чтобы убедиться, что у вас не осталось свободного места в дисковом кеше (зависит от размера рабочего набора вашего диска, но опять-таки я бы выбрал не менее 512 МБ). Это количество памяти, которое вы делите на использование памяти для каждого процесса, чтобы получить максимальный уровень.

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

Вот вам и многолетний опыт масштабирования сайтов, превращенный в одну маленькую и простую статью SF.

romble
источник
Другим важным фактором для числа процессов / потоков является то, как долго могут обрабатываться отдельные запросы, и общее распределение по всем возможным отрезкам времени. Другими словами, сколько запросов одновременно нужно обработать, что занимает больше среднего времени ответа. Таким образом, это не так просто, как теоретические запросы в секунду, так как влияние этих более длительных запросов может быть значительным и излишне диктовать общие параметры конфигурации. FWIW mod_wsgi 3.0 будет включать в себя некоторые встроенные средства сбора статистики, чтобы попытаться собрать данные об этом, чтобы облегчить настройку.
Грэм Дамплтон
@Graham: перечитайте мой ответ, я рассказал об этом в некоторых деталях. Requests / sec является просто обратной величиной времени отклика, и его легче разделить на целое число req / sec, чем умножить на десятичную.
womble
Вы не можете сосредоточиться только на худшем случае ответа, или только на среднем по этому вопросу. Он должен быть взвешен способами, основанными на проценте запросов, приходящихся на периоды времени, т. Е. На разброс по всем возможным временам. Если бы вы действительно взяли ваше время ответа наихудшего случая, вы бы столкнулись с нереальными требованиями. Проблема действительно трудно понять, какую формулу использовать. Вот почему в mod_wsgi 3.0 будет встроенный сбор статистики, который смотрит на использование потоков и на какой процент по количеству и времени используется любое количество потоков в любой момент времени.
Грэм Дамплтон
3
Возможно, проблема в том, что вы смотрите на процессы только там, где меня беспокоит то, как потоки используют каждый процесс, и это не так просто. Другими словами, эта директива WSGIDaemonProcess указывает на 5 процессов, где каждый процесс по умолчанию использует 15 потоков. Столько, сколько я прочитал в вашем описании, это предполагает однопоточные процессы. Если нет, укажите мне, как ваша модель обслуживает потоки, а также проблемы конкуренции / масштабирования вокруг GIL. Итак, уточните, что ваше описание действительно только для однопоточных процессов, и я не буду спорить.
Грэм Дамплтон
2
Разве «многопоточный-Apache + multiprocess-wsgi» не является лучшим выбором, пока вы не уверены на 99%, что ваш код Python и все зависимости поточно-ориентированы?
Томаш Зелиньски
9

Уомбл ответ «s является удивительным, хотя и немного трудно понять и применить для неопытный. Я хотел бы привести некоторые эмпирические цифры и сравнение приложения «простой контент» и «электронная коммерция».

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

A) Сайты и микросайты CMS

Мы работаем с несколькими веб-сайтами клиентов, большинство из которых в основном являются контент-сайтами или микро-сайтами, на которых размещается CMS django, некоторые пользовательские формы, а иногда и Celery для запланированных фоновых задач. Эти сайты не жаждут ресурсов, некоторые из них успешно работают параллельно на одном 4-ядерном Intel Xeon с 32 ГБ оперативной памяти. Вот конфигурация, которую мы используем для каждого из сайтов такого типа:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

Я говорю о примерно 40 сайтах на одном сервере, большинство из которых со своим промежуточным сайтом работают в режиме ожидания. С двумя процессами (по умолчанию с 15 потоками каждый) сайты обеспечены, хотя и ограничены в своих возможностях распределения ресурсов сервера. Почему эта настройка достаточна, может быть объяснено простой природой приложения (CMS): ни один запрос никогда не займет больше пары миллисекунд. Apache всегда будет оставаться расслабленным, как и нагрузка на процессор.

Б) Сайты электронной коммерции

Более сложные сайты, которые мы делаем, характеризуются все еще вычислительно недорогими локальными операциями, но внешними зависимостями (например, веб-сервисами, предоставляющими данные бронирования), которые дороги с точки зрения времени транзакции. Операции с внешними запросами занимают потоки гораздо дольше, поэтому вам нужно больше потоков для обслуживания того же числа пользователей (по сравнению с простым сайтом CMS сверху). Хуже того, потоки иногда блокируются, когда внешняя служба не может ответить на запрос немедленно, иногда в течение нескольких секунд. Это может привести к неприятному побочному эффекту, когда потоки, помещающие запросы в одну и ту же службу, встают в очередь, пока все доступные потоки mod_wsgi не будут израсходованы и не заблокированы в ожидании.

Для этих сценариев мы пытались использовать 6процессы, не видя большой разницы, и в итоге мы 12увидели несравненный прирост производительности и стабильности работы:

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

Некоторые простые нагрузочные тесты с 150 и 250 параллельными пользователями легко обрабатываются сайтом, который остается хорошо реагирующим (в то время как с 2процессами сайт непригоден для обслуживания 50 пользователей параллельно). Двухпроцессорный 6-ядерный Intel Xeon с 32 ГБ ОЗУ работает под нагрузкой ЦП ниже 25% при этой нагрузке, при этом использование ОЗУ практически остается постоянным и составляет менее 25%. Обратите внимание, что мы используем выделенный компьютер только для одного сайта, поэтому мы не будем воровать ресурсы, которые могут понадобиться другим сайтам.

Вывод

Использование большего числа процессов - это компромисс между разрешением Apache использовать доступные системные ресурсы или нет. Если вы хотите сохранить стабильную серверную систему (не веб-сайт!) В условиях «атаки», оставьте это число низким. Если вы хотите, чтобы Apache помогал вам использовать системные ресурсы (ЦП, ОЗУ) при необходимости, выберите большее число. То, как высоко вы можете подняться, рассчитывается примерно так, как описано в принятом ответе выше, и в конечном итоге ограничено доступной мощностью процессора и оперативной памяти.

(PS: Я держу раздел ConfigurationDirectives вики проекта modwsgi под своей подушкой для Apache-подобного фонового чтения. Также не забудьте понять и контролировать открытые соединения вашего сервера Apache .)

Peterino
источник
Отличный пост, но почему вы не установите количество потоков? Поскольку Python GIL сводит на нет многие преимущества потоков, я бы предположил, что вы захотите иметь больше процессов, чем потоков, но есть ли какое-то преимущество в определении количества потоков?
Серин
Количество по умолчанию threads15 согласно документации . Я не думаю, что есть преимущество указывать это явно. На самом деле, я помню, что не упомянул об этом по причине: в SO был какой-то пост или часть документации, в которой рекомендовано пропустить значение, чтобы избежать побочных эффектов (я знаю, это звучит странно). К сожалению, я не могу найти этот источник сейчас. Для остальной части вашего вопроса (GIL) вы, вероятно, более опытный, чем я, извините.
Петерино
Спасибо за эту эмпирическую конфигурацию. Однако имейте в виду, что согласно этому посту You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru