NGINX + uWSGI + Flask. Alguns pedidos são muito lentos

1

Estamos executando um aplicativo Flask bastante grande e descobrimos que, em momentos aleatórios, terminamos com uma solicitação muito lenta (às vezes um minuto ou mais)

Presumo que o problema esteja relacionado a módulos de carregamento lento e solicitações lentas são quando um novo funcionário precisa iniciar ou recarregar. (Originalmente, nós tivemos esse problema com o Apache + mod_wsgi, mas decidimos tentar o uWSGI, já que ele preprega os trabalhadores). No entanto, mesmo com o recarregamento não é consistente. Muitas vezes, posso recarregar e as solicitações são um pouco mais lentas, mas não significativamente.

Eu sei que o carregamento lento é uma coisa no Django, mas como eu entendo nos documentos, o Flask não faz isso a menos que esteja configurado para. Não sei por que os pedidos continuariam tão lentos.

Para adicionar ao mistério, estou executando isso no EC2, atrás de um balanceador de carga (apenas com uma instância). Parece que tenho mais problemas quando me conecto através do balanceador de carga do que quando me conecto diretamente, mas novamente é aleatório. A maioria das solicitações por meio do balanceador de carga não está adicionando mais de 10 ms.

Aqui estão as várias configurações:

nginx:

server {
        listen 80;
        server_name dev.mysite.net
        root /var/www/mysite;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:/var/run/uwsgi/mysite.sock;
        }
}

uWSGI (gerenciado pelo imperador)

[uwsgi]
base = /usr
app = my_app.py
pythonpath = /usr/lib/python2.7
pythonpath = /usr/lib/python2.7/site-packages
pythonpath = /usr/lib/python2.7/dist-packages
pythonpath = /var/www/mysite
socket = /var/run/uwsgi/%n.sock
module = %(app)
callable = app
logto = /var/log/uwsgi/%n.log
workers=10
enable-threads = 1

EDIT: Uma coisa que eu encontrei foi que manter configurações de tempo limite de vida pode causar problemas e parece que o jeito estava esperando por mais alguns segundos do que o tempo limite de keep alive. Isso parece ter ajudado, mas não corrigido totalmente, especialmente em solicitações por meio do balanceador de carga.

    
por Cfreak 28.05.2015 / 18:09

1 resposta

2

Resolvemos este problema:

O problema era as zonas de disponibilidade no ELB. Eu pensei que eu tinha que ter uma zona de disponibilidade definida o mesmo que onde minha instância realmente é e, em seguida, pelo menos uma zona pública (a zona em que a instância está em particular).

Aparentemente, onde a instância não importa, apenas as zonas de disponibilidade precisam ser todas públicas. Criar uma sub-rede pública na mesma zona de disponibilidade magicamente fez com que funcionasse mesmo que a própria instância estivesse em uma sub-rede privada.

    
por 17.07.2015 / 23:15