Назад | Перейти на главную страницу

Какого снижения производительности ожидать с Nginx по сравнению с исходным Gunicorn + Gevent?

Я пытаюсь получить очень производительную настройку веб-сервера для обработки длительного опроса, веб-сокетов и т. Д. У меня работает виртуальная машина (Rackspace) с 1 ГБ ОЗУ / 4 ядрами. Я установил очень простое приложение gunicorn 'hello world' с (асинхронными) работниками gevent. Перед Gunicorn я поставил Nginx с простым прокси на Gunicorn. С помощью ab, Gunicorn выплевывает 7700 запросов / сек, где Nginx только 5000 запросов / сек. Ожидается ли такое снижение производительности?

Привет мир:

#!/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 (раздетый):

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;
        }
    }
}

Тест: (результаты: nginx TCP, nginx UNIX, Gunicorn)

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

Запуск gunicorn через сокет unix дает несколько более высокую пропускную способность (5500 об / с), но он по-прежнему не соответствует характеристикам raw Gunicorn.

Вы можете уменьшить тайм-аут соединения до 0 секунд для Gunicorn, используя:

http://docs.gunicorn.org/en/latest/settings.html#timeout

Вы также можете использовать keep_alive для бэкэнда proxy_pass с помощью этой директивы: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

имейте в виду, что директива keep alive недоступна в более старых версиях nginx

Nginx не использует поддержку активности с бэкэндами, поэтому вы должны отключить его в Gunicorn. Также я бы начал тестировать nginx с 1 рабочим, чтобы он не конкурировал с Gunicorn за бесплатный процессор. Возможно, вам придется увеличить количество рабочих соединений, если они не будут перерабатываться достаточно быстро.

Кроме того, вы никогда не достигнете той же производительности, что и raw gunicorn, поскольку nginx вводит собственную задержку (хотя и небольшую). Вы можете обслуживать свое приложение напрямую с помощью Gunicorn и статических ресурсов с помощью nginx в другом домене, это имеет некоторые преимущества, такие как чистый трафик cookie.