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