UWSGI работник не распределяется равномерно - PullRequest
2 голосов
/ 02 марта 2020

У меня есть проект Django, настроенный с nginx и uwsgi. На сайте не так много процессоров. В основном это простое чтение, но мы ожидаем много хитов. Я использовал apache контрольный показатель для нагрузочного тестирования. Предоставление простого ab -n 200 -c 200 <url> замедляет работу веб-сайта (при включенном тесте производительности невозможно открыть веб-сайт в любом браузере даже с другого IP-адреса). Я указал число процессов как 16, а количество потоков - как 8. Мой файл uwsgi.ini приведен ниже.

[uwsgi]
 master          = true 
 socket          = /tmp/uwsgi.sock
 chmod-socket    = 666
 chdir           = <directory>
 wsgi-file       = <wsgi file path>
 processes       = 16
 threads         = 8
 virtualenv      = <virtualenv path>
 vacuum          = true
 enable-threads  = true
 daemonize= <log path>
 stats= /tmp/stats.sock

enter image description here когда я проверяю uwsgitop, видно, что рабочие 7 и 8 обрабатывают большинство запросов, остальные обрабатывают меньшее количество запросов по сравнению с их. Может ли это быть причиной того, что я не могу загрузить веб-сайт в браузер, пока выполняется тест? Как эффективно использовать процессы uwsgi для обслуживания максимального количества одновременных запросов?

enter image description here

это результат htop. Во время тестирования производительности не используется много памяти или процессора. Может кто-нибудь помочь мне эффективно настроить сервер?

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Если у вас достаточно денег, поменяйте процессор в соответствии с требованиями вашей материнской платы. Лучше go для ядра i3 или выше.

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

0 голосов
/ 12 марта 2020

Насколько я вижу, там только 2 ядра. Вы не можете охватить огромное количество процессов и потоков только двумя ядрами. Вы получите преимущества, если ваши потоки будут ждать других процессов ввода-вывода. Тогда они go спят, а другие могут работать.

Всегда максимум два (= количество ядер) одновременно.

Вы не предоставляете много информации о своем приложении, за исключением того, что оно "в основном простое чтение, но мы ожидаем много обращений" , Это не звук много IO ждет. Я предполагаю, что база данных также работает на том же хосте (потребуется некоторое время процессора)

Попробуйте сначала уменьшить ваши потоки / процессы до 4. Затем поиграйте с +/- 1 и проверьте соответственно.

Прочитайте https://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html Вы найдете предложения типа:

Там нет magi c правило для установки количества используемых процессов или потоков. Это очень сильно зависит от приложения и системы.

По умолчанию плагин Python не инициализирует GIL. Это означает, что созданные вами приложения потоки не будут работать. Если вам нужны потоки, не забудьте включить их с помощью enable-threads. Запуск uWSGI в режиме многопоточности (с параметрами потоков) автоматически включит поддержку потоков. Это «странное» поведение по умолчанию из соображений производительности, в этом нет ничего постыдного.

...