Как узнать, что uWSGI предпочитает процессы для потоков для балансировки нагрузки

Я установил Nginx + uWSGI + Django на VDS с 3 ядрами процессора. uWSGI настроен на 6 процессов и 5 потоков на процесс. Теперь я хочу сообщить uWSGI, чтобы использовать процессы для балансировки нагрузки до тех пор, пока все процессы не заняты, а затем, если нужно, использовать потоки. Кажется, что uWSGI предпочитает потоки, и я не нашел никакой опции конфигурации, чтобы изменить это поведение. Первый процесс занимает более 100% процессорного времени, второй занимает около 20%, а другие процессы в основном не используются.

Наш сайт получает 40 р/с. Фактически даже имея 3 процесса без потоков, обычно обрабатывать все запросы обычно. Но обработка запросов зависает время от времени по разным причинам, таким как заблокированные общие ресурсы и т.д. В таких случаях у нас есть -1 процесс. Пользователям не нравится ждать и щелкать ссылку снова и снова. В результате все процессы зависают, и все пользователи должны ждать.

Я бы добавил еще больше потоков, чтобы сделать сервер более надежным. Но проблема, вероятно, в python GIL. Нити не используют все ядра ЦП. Таким образом, несколько процессов работают намного лучше для балансировки нагрузки. Но потоки могут сильно помочь в случае заблокированных общих ресурсов и задержки ожидания ввода-вывода. Процесс может сильно работать, пока один из его потоков заблокирован.

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

Ответ 1

Итак, решение:

  • Обновите uWSGI до последней стабильной версии (как предположил Роберто).
  • Используйте опцию --under-lock.

Теперь я запускаю 50 потоков для каждого процесса, и все запросы распределяются между процессами одинаково.

Ответ 2

Каждый процесс является фактически потоком, поскольку потоки являются контекстами выполнения одного и того же процесса.

По этой причине нет ничего похожего на "процесс выполняет его вместо потока". Даже без потоков ваш процесс имеет 1 контекст выполнения (поток). То, что я буду исследовать, - это то, почему вы получаете (воспринимаемые) плохие показатели при использовании нескольких потоков для каждого процесса. Вы уверены, что используете стабильную (с поддержкой сплошной резьбы) версию uWSGI? (1.4.x или 1.9.x)

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

GIL не проблема для вас, так как из-за того, что вы описываете, проблема связана с отсутствием потоков для управления новыми запросами (даже если из ваших номеров выглядит, что у вас может быть слишком тяжелое нарушение блокировок на что-то еще)