Назад | Перейти на главную страницу

Настройка Apache mod_wsgi

У меня есть сайт django в webfaction, который использует apache + mod_wsgi.

Сайт получает около 1000 запросов в минуту.

Но он производит некоторые вычисления, поэтому запрос занимает около 5-10 секунд.

Я использую следующую конфигурацию

StartServers         2
MinSpareThreads      10
MaxSpareThreads      25
ThreadLimit          25
ThreadsPerChild      25
MaxClients           75
MaxRequestsPerChild   1000

threads=15 processes=12

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

Я хочу, чтобы Apache быстро принимал запросы.

Я совсем заблудился из-за количества параметров, я тоже не совсем понимаю, что они означают. Что нам нужно StartServers и MaxRequestWorkers для?

Будем очень признательны за любую помощь и / или объяснения.

У меня 8гб оперативной памяти.

Рабочий Apache MPM.

mod_wsgi 4.4.21.

Заранее спасибо.

StartServers количество запускаемых вами серверных процессов, и MaxRequestWorkers количество потоков на процесс. Настройки Webfaction должны быть разумными в большинстве ситуаций, хотя для тысячи запросов в минуту может потребоваться некоторая настройка, но, вероятно, в основном в приложении.

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

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

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

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