Instalei o Nginx + uWSGI + Django em um VDS com 3 núcleos de CPU. O uWSGI está configurado para 6 processos e 5 threads por processo. Agora eu quero dizer ao uWSGI para usar processos para balanceamento de carga até que todos os processos estejam ocupados, e então usar threads se necessário. Parece que o uWSGI prefere threads, e eu não encontrei nenhuma opção de configuração para mudar isso comportamento. O primeiro processo ocupa 100% do tempo de CPU, o segundo leva cerca de 20% e outros processos não são usados na maioria das vezes.
Nosso site recebe 40 r / s. Na verdade, mesmo tendo 3 processos sem threads é o suficiente para lidar com todos os pedidos normalmente. Mas o processamento de pedidos trava de tempos em tempos por várias razões, como recursos compartilhados bloqueados, etc. Nesses casos, temos -1 processo. Os usuários não gostam de esperar e clicar no link novamente e novamente. Como resultado, todos os processos são interrompidos e todos os usuários precisam esperar.
Eu adicionaria ainda mais threads para tornar o servidor mais robusto. Mas o problema é provavelmente python GIL. Tópicos não usam todos os núcleos do processador. Portanto, vários processos funcionam muito melhor para o balanceamento de carga. Mas os threads podem ajudar muito no caso de recursos compartilhados bloqueados e atrasos de espera de E / S. Um processo pode funcionar muito enquanto um dos seus threads está bloqueado.
Eu não quero diminuir os prazos até que não haja outra solução. É possível resolver este problema com threads em teoria, e eu não quero mostrar mensagens de erro para o usuário ou fazê-lo esperar em cada requisição até que não haja outra escolha.