[Перевод] Повышение производительности за счет оптимизации конфигурации Gunicorn.

задняя часть Программа перевода самородков Gunicorn оптимизация производительности

Практические советы по настройке 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 使用默认的 worker 模式(同步模式)。注意看这个图片的第四行:“Using worker: sync”.

Второй метод параллелизма (многопоточность)

Gunicorn также позволяет использовать несколько потоков на одного воркера. В этом сценарии приложение Python загружается один раз для каждого рабочего процесса, и каждый поток, созданный одним и тем же рабочим потоком, использует одно и то же пространство памяти.

Чтобы использовать многопоточность в Gunicorn. мы использовалиthreadsмодель. каждый раз, когда мы используемthreadsрежим, рабочий класс будетgthread:

gunicorn --workers=5 --threads=2 main:app

Gunicorn 的多线程模式就是使用了 worker 的 gthread 类。请注意图片中的第四行 “Using worker: threads”。

Предыдущая команда эквивалентна:

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, мы надеемся оптимизировать производительность приложения.

  1. Если это приложениеВвод/вывод ограничен, вы обычно можете добиться наилучшей производительности, используя «псевдопотоки» (gevent или asyncio). Как мы узнали, Gunicorn работает, устанавливая соответствующиерабочий класси воляworkersКоличество с поправкой на(2*CPU)+1для поддержки этой парадигмы программирования.
  2. Если это приложениепривязка к процессору, то не имеет значения, сколько одновременных запросов обрабатывает приложение. Единственное, что имеет значение, это количество параллельных запросов. так какGIL Python, потоки и «псевдопотоки» не выполняются параллельно. Единственный способ добиться параллелизма — увеличить**workers** Рекомендуемое количество(2*CPU)+1, поймите, что максимальное количество параллельных запросов на самом деле является количеством ядер.
  3. Если вы не уверены в приложениииспользование памяти,использовать多线程и соответствующийрабочий класс gthreadПовысится производительность, так как приложение загружается один раз на каждом рабочем потоке, и каждый поток, работающий на одном рабочем потоке, будет совместно использовать часть памяти, но это требует дополнительного потребления ЦП.
  4. Если вы не знаете, что выбрать для себя, начните с самой простой конфигурации, простоworkersКоличество установлено на(2*CPU)+1и не думай о多线程. С этого момента это базовая среда для всех тестов и ошибок. Если узким местом является память, начните внедрять многопоточность. Если узким местом является ввод-вывод, рассмотрите возможность использования другой парадигмы программирования Python. Если узкое место находится в ЦП, рассмотрите возможность добавления дополнительных ядер и настройкиworkersколичество.

система сборки

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

Иногда изменение настроек HTTP-сервера, использование дополнительных ресурсов или изменение дизайна приложения с помощью другой парадигмы программирования — это наши решения для повышения производительности приложения.

при этих обстоятельствах,система сборкиЭто означает понимание типов вычислительных ресурсов (процессов, потоков и «псевдопотоков»), которые мы должны гибко применять для развертывания высокопроизводительных приложений.

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

Ссылаться на

  1. Гуникорн из РубиUnicornПортирован проект. этосхема дизайнаПомогает прояснить некоторые из самых основных понятий.Архитектура ГуникорнаДальнейшее укрепление некоторых из этих концепций.
  2. запись в блоге с отношениемПрезентация на основе Unix о том, как Unicorn рассказывает о некоторых ключевых функциях, очень хороша.
  3. Ответ на Stack Overflow о модели предраспределенного веб-сервиса.
  4. НемногоБолееСсылаться начтобы понять, как настроить Gunicorn.

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


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.