Мы запускаем приложение Flask, которое предоставляет данные, хранящиеся в базе данных.Возвращает много 503
ошибок.Насколько я понимаю, они генерируются Apache при достижении максимального количества одновременных потоков.
Основная причина, скорее всего, в том, что приложение работает плохо, но на данном этапе мы не можем позволить себе гораздо больше времени на разработку,поэтому я ищу дешевый взлом конфигурации конфигурации, чтобы смягчить проблему.
Поставщики данных отправляют данные с высокой скоростью.Я считаю, что их программа получает много 503
, и просто попробуйте / поймайте их, чтобы повторить попытку до успеха.
Потребители данных используют приложение с гораздо меньшей скоростью, и я бы хотел, чтобы ониэти проблемы меня не слишком беспокоят.
Я думаю об ограничении числа одновременных обращений с IP каждого провайдера.Они могут получить более низкую пропускную способность, но они будут жить с этим, как они уже делают, и это облегчит жизнь обычным потребителям.
Я определил mod_limitipconn , который, кажется,для этого.
mod_limitipconn [...] позволяет администраторам ограничивать количество одновременных запросов, разрешенных с одного IP-адреса.
Я бы хотелубедитесь, что я понимаю, как это работает и как установлены ограничения.
Я всегда полагал, что из-за настроек WSGI было максимально 5 одновременных соединений: threads=5
.Но я прочитал Процессы и потоки в документации mod_wsgi, и я запутался.
Учитывая приведенную ниже конфигурацию, правильны ли эти предположения?
Толькоодновременно запускается один экземпляр приложения.
Может быть создано не более 5 одновременных потоков.
Когда выполняется 5 запросовобрабатывается, если поступает шестой запрос, клиент получает 503
.
Ограничение количества одновременных запросов для IP xxxx на уровне apache до 3 обеспечит, что только 3 из этих 5потоки могут использоваться этим IP, оставляя 2 другим IP.
Увеличение количества потоков в конфигурации WSGI может помочь разделить пул соединений между клиентами, обеспечивая большую степень детализации в скоростиограничения (вы можете ограничить до 3 для каждого из 4 провайдеров и оставить еще 5 с общим количеством 17), но это не улучшит общую производительность, даже если сервер имеет незанятые ядра, потому что предотвращает использование Python GILНесколько одновременно работающих потоков .
Увеличение числа потоков до большого числа, например 100, может сделать запросы длиннее, но ограничит ответы 503
.Этого может даже быть достаточно, если клиенты устанавливают не слишком высокий лимит для своих одновременных запросов, и если они этого не делают, я могу применить это с помощью чего-то вроде mod_limitipconn
.
Увеличение числаслишком много потоков сделает запросы настолько длинными, что клиенты получат тайм-ауты вместо 503
, что не очень хорошо.
Текущая конфигурация ниже.Не уверен, что имеет значение.
apachectl -V
:
Server version: Apache/2.4.25 (Debian)
Server built: 2018-06-02T08:01:13
Server's Module Magic Number: 20120211:68
Server loaded: APR 1.5.2, APR-UTIL 1.5.4
Compiled using: APR 1.5.2, APR-UTIL 1.5.4
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
/etc/apache2/apache2.conf
:
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
/etc/apache2/mods-available/mpm_worker.conf
(но это не должно иметь значения в event
еще, верно?):
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
/etc/apache2/sites-available/my_app.conf
:
WSGIDaemonProcess my_app threads=5