Que degradação de desempenho esperar com o Nginx sobre o Gunicorn + Gevent?

2

Eu estou tentando obter uma configuração de servidor web de alto desempenho para lidar com sondagens longas, websockets etc. Eu tenho uma VM rodando (Rackspace) com 1GB de RAM / 4 núcleos. Eu configurei um aplicativo 'hello world' muito simples para gunicorn com trabalhadores gevent (assíncrono). Na frente do gunicorn, coloquei Nginx com um simples proxy para Gunicorn. Usando ab , Gunicorn lança 7700 solicitações / s , onde o Nginx faz apenas um 5000 pedidos / seg . Essa degradação de desempenho é esperada?

Olá, mundo:

#!/usr/bin/env python
def application(environ, start_response):
    start_response("200 OK", [("Content-type", "text/plain")])
    return [ "Hello World!" ]

Gunicorn:

gunicorn -w8 -k gevent --keep-alive 60 application:application

Nginx (despojado):

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
}    
http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    upstream app_server {
        server 127.0.0.1:8000 fail_timeout=0;
    }    
    server {
        listen 8080 default;
        keepalive_timeout 5;
        root /home/app/app/static;
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass   http://app_server;
        }
    }
}

Benchmark: (resultados: nginx TCP , nginx UNIX , gunicorn )

ab -c 32 -n 12000 -k http://localhost:[8000|8080]/

A execução do gunicorn em um soquete unix fornece uma taxa de transferência um pouco mais alta ( 5500 r / s ), mas ainda não corresponde ao desempenho do gunicorn bruto .

    
por bouke 16.02.2012 / 08:47

2 respostas

1

Você pode reduzir o tempo limite da conexão para 0 segundo para o gunicorn usando:

link

Você também pode usar keep_alive para o backend proxy_pass usando esta diretiva: link

esteja ciente de que a diretiva keep alive não está disponível em versões antigas do nginx

    
por 29.08.2012 / 17:18
0

O Nginx não usa keepalive com backends, então você deve desativá-lo em gunicorn. Também gostaria de começar a testar o nginx com 1 worker para que ele não concorra com o gunicorn por um cpu gratuito. Você pode precisar aumentar as conexões de trabalho se elas não forem recicladas rápido o suficiente.

Além disso, você nunca conseguirá o mesmo desempenho que o gunicorn bruto, já que o nginx introduz sua própria latência (embora baixa). Você poderia servir sua aplicação diretamente com gunicorn e ativos estáticos com nginx em outro domínio, isso tem algumas vantagens, como o tráfego limpo de cookies.

    
por 16.02.2012 / 12:02