- Оригинальный адрес:Better performance by optimizing Gunicorn config
- Оригинальный автор:Omar Rayward
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:shixi-li
Практические советы по настройке Gunicorn
В общем, увеличьте количество кластеров или ядер для приложений с ограниченным ЦП. Но «псевдопотоки» следует использовать для приложений с ограничениями ввода-вывода.
Gunicornявляется HTTP-сервером Python WSGI. его местонахождение обычно вобратный прокси(какNginx)илибалансировки нагрузки(какAWS ELB) и веб-приложение (например, Django или Flask).
Архитектура Гуникорна
Gunicorn реализует предварительно распределенный веб-сервер для UNIX.
Итак, что это значит?
- Gunicorn запускает основной поток, на который выполняется диспетчеризация, а результирующий дочерний поток является соответствующим рабочим потоком.
- Роль основного процесса заключается в обеспечении того, чтобы количество рабочих было таким же, как указано в настройках. Поэтому, если какой-либо рабочий поток умирает, основной поток может запустить другой, отправив себя.
- Роль работника заключается в обработке HTTP-запросов.
- этодо in предварительное распространениеЭто означает, что основной поток создает воркеры перед обработкой HTTP-запросов.
- Ядро операционной системы обеспечивает балансировку нагрузки между рабочими процессами.
Чтобы повысить производительность при использовании Gunicorn, мы должны помнить о трех способах параллелизма.
Первый режим параллелизма (рабочий режим, также известный как режим процесса UNIX)
Каждый рабочий процесс — это процесс UNIX, который загружает приложение Python. Между работниками нет общей памяти.
предложенныйworkers
количествода(2*CPU)+1
.
Для двухъядерной (двухпроцессорной) машины рекомендуется 5 рабочих мест.
gunicorn --workers=5 main:app
Второй метод параллелизма (многопоточность)
Gunicorn также позволяет использовать несколько потоков на одного воркера. В этом сценарии приложение Python загружается один раз для каждого рабочего процесса, и каждый поток, созданный одним и тем же рабочим потоком, использует одно и то же пространство памяти.
Чтобы использовать многопоточность в Gunicorn. мы использовалиthreads
модель. каждый раз, когда мы используемthreads
режим, рабочий класс будетgthread
:
gunicorn --workers=5 --threads=2 main:app
Предыдущая команда эквивалентна:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
Максимальное количество одновременных запросов в нашем примере равноworker * 线程
, то есть 10.
Рекомендуемое максимальное количество параллелизма при использовании рабочего и многопоточного режима по-прежнему(2*CPU)+1
.
Таким образом, если мы используем четырехъядерный (4 ЦП) компьютер и хотим использовать рабочие процессы и многопоточный режим, мы можем использовать 3 рабочих процесса и 3 потока, чтобы получить максимум 9 одновременных запросов.
gunicorn --workers=3 --threads=3 main:app
Третий режим параллелизма («Псевдопотоки»)
Есть некоторые библиотеки Python, такие как (geventиAsyncio) может включить множественный параллелизм в Python. это основано насопрограммаРеализованы "псевдопотоки".
Gonicrn позволяет использовать эти асинхронные библиотеки Python путем настройки соответствующих рабочих классов.
Настройки здесь для того, что мы хотим запустить на одноядерной машине.gevent
:
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
worker-connections — это специальная настройка рабочего класса gevent.
(2*CPU)+1
все еще рекомендуетсяworkers
количество. Поскольку у нас только одно ядро, мы будем использовать 3 рабочих.
В этом случае максимальное количество одновременных запросов равно 3000. (3 работника * 1000 подключений/работник)
Параллелизм против параллелизма
- Параллелизм — это выполнение 2 или более задач одновременно, что может означать, что только одна из них обрабатывается, а остальные приостановлены.
- Параллелизм означает, что две или более задач выполняются одновременно.
В Python как потоки, так и псевдопотоки являются формой параллелизма, но не параллелизма. Но рабочие — это ряды, основанные на параллелизме или параллелизме.
Теория хороша, но как мне ее использовать в моей программе?
фактический случай
Изменяя настройки Gunicorn, мы надеемся оптимизировать производительность приложения.
- Если это приложениеВвод/вывод ограничен, вы обычно можете добиться наилучшей производительности, используя «псевдопотоки» (gevent или asyncio). Как мы узнали, Gunicorn работает, устанавливая соответствующиерабочий класси воля
workers
Количество с поправкой на(2*CPU)+1
для поддержки этой парадигмы программирования. - Если это приложениепривязка к процессору, то не имеет значения, сколько одновременных запросов обрабатывает приложение. Единственное, что имеет значение, это количество параллельных запросов. так какGIL Python, потоки и «псевдопотоки» не выполняются параллельно. Единственный способ добиться параллелизма — увеличить**
workers
** Рекомендуемое количество(2*CPU)+1
, поймите, что максимальное количество параллельных запросов на самом деле является количеством ядер. - Если вы не уверены в приложениииспользование памяти,использовать
多线程
и соответствующийрабочий класс gthreadПовысится производительность, так как приложение загружается один раз на каждом рабочем потоке, и каждый поток, работающий на одном рабочем потоке, будет совместно использовать часть памяти, но это требует дополнительного потребления ЦП. - Если вы не знаете, что выбрать для себя, начните с самой простой конфигурации, просто
workers
Количество установлено на(2*CPU)+1
и не думай о多线程
. С этого момента это базовая среда для всех тестов и ошибок. Если узким местом является память, начните внедрять многопоточность. Если узким местом является ввод-вывод, рассмотрите возможность использования другой парадигмы программирования Python. Если узкое место находится в ЦП, рассмотрите возможность добавления дополнительных ядер и настройкиworkers
количество.
система сборки
Мы, разработчики программного обеспечения, часто думаем, что любое узкое место в производительности можно решить путем оптимизации кода приложения, но это не всегда так.
Иногда изменение настроек HTTP-сервера, использование дополнительных ресурсов или изменение дизайна приложения с помощью другой парадигмы программирования — это наши решения для повышения производительности приложения.
при этих обстоятельствах,система сборкиЭто означает понимание типов вычислительных ресурсов (процессов, потоков и «псевдопотоков»), которые мы должны гибко применять для развертывания высокопроизводительных приложений.
Используя правильное понимание, архитектуру и внедряя правильные технические решения, мы можем избежать попадания в ловушку попыток повысить производительность за счет оптимизации кода приложения.
Ссылаться на
- Гуникорн из РубиUnicornПортирован проект. этосхема дизайнаПомогает прояснить некоторые из самых основных понятий.Архитектура ГуникорнаДальнейшее укрепление некоторых из этих концепций.
- запись в блоге с отношениемПрезентация на основе Unix о том, как Unicorn рассказывает о некоторых ключевых функциях, очень хороша.
- Ответ на Stack Overflow о модели предраспределенного веб-сервиса.
- НемногоБолееСсылаться начтобы понять, как настроить Gunicorn.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.