Análise de desempenho de servidores WSGI: coloque o uWSGI de volta no lugar

Na semana passada, foi publicada uma tradução de um artigo de dois anos: Análise de Desempenho dos Servidores WSGI: Parte Dois , onde o uWSGI foi privado da fama imerecidamente.


É urgente verificar novamente os testes!



Objetivos


Uso o uWSGI há muito tempo e quero mostrar que não é tão ruim quanto descrito nos testes de 2016.
Inicialmente, eu só queria reproduzir os testes e descobrir o que havia de errado com o uWSGI.
O código não contém versões de pacotes e módulos usados.


Portanto, para executar testes e obter resultados semelhantes, não funciona.
A seguir, minha missão de executar testes e comparar os resultados nos gráficos.
A pedido dos leitores, a Unidade NginX foi adicionada.


Passos


wrk 4.1.0


Encontre especificações , corrija , colete
Informações adicionadas ao readme.rd.


estatísticas do docker


Durante 2 anos, a produção de estatísticas mudou.


Uma segunda coluna NAME foi adicionada e isso interrompeu o analisador de estatísticas.


Para não encontrar um problema semelhante em dois anos, usaremos a saída formatada:


 - docker stats > "$BASE/$1.$2.stats" & + docker stats --format "{{.CPUPerc}} {{.MemUsage}}" > "$BASE/$1.$2.stats" & 

E, portanto, simplificaremos um pouco o código do analisador.


debian


Agora a imagem mais recente do debian é a versão 9.5 , exiba isso no Dokerfile:


 - FROM debian + FROM debian:9.5 

Em abril de 2016, a versão mais recente era 8.4


No entanto, o Apache permaneceu quase o mesmo: agora a versão do Apache é 2.4.25 e em 2016 era o Apache 2.4.10.


cherrypy tornado uwsgi gunicorn bjoern meinheld mod_wsgi


Não faz sentido dizer que os módulos foram alterados.
Especifique a versão atual:


 - RUN pip install cherrypy tornado uwsgi gunicorn bjoern meinheld mod_wsgi + RUN pip install cherrypy==17.4.0 \ + uwsgi==2.0.17.1 \ + gunicorn==19.9.0 \ + bjoern=2.2.3 \ + meinheld==0.6.1 \ + mod_wsgi==4.6.5 

O que o tornado faz lá, onde está o lançamento do arquivo wsgi para o lançamento do tornado? Exclua o artefato.
Não seria ruim colocar isso em um requirements.txt diferente, mas por enquanto vamos deixar assim.


cherrypy -> cheroot.wsgi


Como mostrado acima, a versão atual é 17.4.0.
Em abril de 2016, a versão v5.1.0 provavelmente foi usada.
E em 2017, ocorreram alterações na versão 9.0 , que afetaram a importação do servidor:


 - from cherrypy import wsgiserver - server = wsgiserver.CherryPyWSGIServer( + from cheroot.wsgi import Server as WSGIServer + server = WSGIServer( 

Erros de soquete: leia 100500


Após as alterações descritas acima, o primeiro teste completo foi lançado.
Os resultados foram bons: o uwsgi não produziu 3 ... 200, mas 7500 ... 5000 solicitações por segundo.
Porém, após um exame detalhado dos gráficos obtidos, descobriu-se que o wrk detectou todas as respostas como erros de leitura.


Após verificar dezenas de chaves de inicialização do uwsgi, verificou-se que não havia erros ao ativar o http1.1: --http-keepalive e --http11-socket .
Além disso, o primeiro fornece 7500 ... 5000 consultas por segundo e o segundo estável, 29 mil!


o que mudou no uWSGI no momento


É mais provável que em agosto de 2016 a versão do uWSGI 2.0.12 (20151230) tenha sido usada.
Depois, em maio, o uWSGI 2.0.13 foi lançado .


Este foi um evento importante, mas não resolveu o problema de desempenho de acordo com a versão wrk até 2018, com o lançamento do uWSGI 2.0.16 :


Suporte HTTP / 1.1 com porta traseira (--http11-socket) da 2.1

É por isso que o uWSGI foi recomendado para uso com o NginX,
E por que isso é importante na estrutura do artigo pode ser entendido a partir desse ticket em 2012.


Por que então esses resultados


Eu tentei as seguintes versões:


  • 2.0.12 para o debian 8.4, nos nove ele não vai por causa do novo openssl.
  • 2.0.13 ... 2.0.17 para debian 8.4 e 9.5

Mas não consegui resultados tão ruins como 3 ... 200 consultas por segundo.
Atenção para a linha de inicialização do aplicativo:


uwsgi --http: 9808 --plugin python2 --wsgi-file app.py --processes ...

A especificação de um plug-in indica a instalação do uwsgi do repositório, não do pip.
Isso pode indicar que o autor não possui a experiência necessária com essa pilha.


Portanto, admito várias possibilidades:


  • O teste de cada um dos servidores uwsgi foi realizado separadamente, em momentos diferentes.
  • Houve algum conflito entre a versão do sistema do uwsgi e instalada via pip.
  • A versão wrk do autor em 2016, tinha alguns recursos para trabalhar no http1.0
  • O uwsgi começou com um conjunto diferente de opções
  • artigo personalizado, figuras do teto.

Quais são os resultados agora


O uWSGI nos gráficos é variado:
Os dois primeiros uWSGI e uWSGIbase (v2.0.17.1) foram executados em um longo teste, com seus concorrentes, com parâmetros:
--http11 :9808 --processes 5 --threads 2 --enable-threads .
--http11 :9808 --processes 5 .
Como a prática demonstrou, NÃO há diferença qualitativa para um teste de aplicação simulada.


E, separadamente, a versão uWSGI de 2016:
uWSGI-v2.0.12th-old e uWSGI-v2.0.12nt-old - respectivamente v2.0.12 com e sem threads no contêiner debian 8.4.
--http :9808 --http-keepalive --processes 5 --threads 2 --enable-threads
--http :9808 --http-keepalive --processes 5


RPS 2018 ALL
O uWSGI ocupa o 2º lugar, sem reduzir os resultados com o aumento da carga.
Em terceiro lugar, está a Unidade NginX.


RPS 2018 LOW
No segmento baixo, o uWSGI-v2.0.12 é o melhor, mesmo com um aumento na carga.


LATENCIES 2018 ALL
Aqui vemos como a Unit não mostrou seu melhor lado.


LATENCIES 2018 LOW
O uWSGI e o CherryPy são vencedores inquestionáveis ​​em latência.



Esta imagem é semelhante a 2016.



Aqui vemos quantos anos o uWSGI consumiu memória com o aumento da carga.
A unidade também aumenta linearmente o consumo de memória.



E o novo uWSGI, gunicorn, mod_wsgi - confiavelmente "mantém a barra", e isso diz muito.



Os uWSGIs antigos começam a obter grandes erros após 300 conexões abertas.



Unidade e CherryPy - sem erros!
Bjoern começa a doar com 1000 compostos.
Mas com a nova estranheza do uWSGI, iniciando 200 conexões, obtemos 50 erros e o número não aumenta mais. Este ponto requer consideração detalhada.


Todos os dados são coletados aqui.
Todas as alterações de código podem ser vistas no RP .


Conclusões


O uWSGI não é tão ruim ou muito bom!
Se você não gostar dos resultados do teste WRK, tente usar outras ferramentas.

Source: https://habr.com/ru/post/pt428047/


All Articles