У меня есть сайт django, использующий Apache и mod_wsgi. С последних 4-5 дней я продолжаю получать этот тип ошибки по электронной почте администратора.
OperationalError: (1040, 'Too many connections')
Я установил django-debug-toolbar, и у меня в среднем 100–150 запросов для каждой страницы и время отклика менее 300 мс. Не думаю, что перегружаю свой MySql-сервер. С другой стороны, это произошло через некоторое время после того, как я попытался перенастроить свой httpd.conf
настройки.
Мой сайт получает 800-1000 посещений в день.
Это мои httpd.conf
настройки
KeepAlive Off
Listen 13646
MaxSpareThreads 15
MinSpareThreads 8
MaxClients 20
ServerLimit 20
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
MaxRequestsPerChild 1000000
StartServers 20
WSGIDaemonProcess <project> processes=7 threads=12 python-path=<path>
WSGIProcessGroup <project>
WSGIRestrictEmbedded off
WSGILazyInitialization On
Любая помощь будет принята с благодарностью.
PS. Я использую общий хостинг. У меня есть 512 МБ ОЗУ для моего хостинг-плана. 300 МБ из них бесплатны.
Несколько комментариев о вашей конфигурации.
MaxSpareThreads и MinSpareThreads действительно должны быть кратными ThreadsPerChild. Если это не так, с некоторыми комбинациями значений вы можете заставить Apache циклически переключаться между созданием новых процессов, потому что он думает, что они ему нужны, и затем решает в следующий момент убить их снова, потому что затем он передумает и считает их избыточными. Итак, измените MinSpareThreads на 5.
MaxClients утверждает, что может иметь не более 20 одновременных запросов через все дочерние рабочие процессы Apache. Тем не менее, процессы демона mod_wsgi, которым они проксируют, могут обрабатывать 7 * 12 = 84. Таким образом, у вас слишком много ресурсов для процесса / потоков демона, потому что дочерние рабочие процессы Apache никогда не смогут обрабатывать более 20 запросов одновременно. Лучшая конфигурация, использующая меньше памяти, - это процессы = 4 и потоки = 5.
StartServers, установленный на 20, является слишком высоким, если вы действительно используете рабочий MPM. Технически StartServers не может быть больше, чем MaxClients / ThreadsPerChild для рабочего MPM. Итак, установите StartServers на 2.
MaxRequestsPerChild устанавливается произвольно высоким, и с учетом пропускной способности вашего запроса вы также можете установить для него нормальное значение по умолчанию, равное 0, что означает сохранение процессов, а не их повторное использование при некотором максимальном количестве запросов. Поскольку веб-приложение Python работает в режиме демона mod_wsgi, в любом случае не должно быть необходимости повторно использовать дочерний рабочий процесс Apache.
В любом случае это вряд ли изменит вашу исходную проблему, но создаст более оптимальную конфигурацию.