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

Время отклика прокси Nginx очень медленное

Недавно мы добавили nginx перед varnish для разгрузки ssl. Мы собирались переписать все наши HTTP-запросы на https. Но затем мы обнаружили, что время отклика значительно увеличилось даже для HTTP-вызовов, когда они обслуживаются nginx. В то время как тот же запрос обслуживается varnish без nginx, время отклика было намного быстрее.

Я настроил буферы прокси (2048 4k), чтобы ответ не сохранялся в файле, а также отключил буферизацию прокси. Но оба подхода не помогли. Поэтому я клонировал сервер nginx (виртуальную машину) и отправил тот же запрос против клонированного. Время отклика было на одном уровне с лаком.

Похоже, что при нагрузке на nginx (около 700 запросов / сек) время отклика увеличивается.

Может ли кто-нибудь сказать мне, что я упускаю что-то очевидное?

Вот моя конфигурация nginx

#nginx.conf
worker_processes auto;

worker_rlimit_nofile 90000;

pid        /var/run/nginx.pid;

error_log /var/log/nginx/error.log error;

events {

    worker_connections 40000;

    multi_accept on;

    use epoll;
}


http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 20M;
    client_body_buffer_size 128k;
    server_tokens off;
    keepalive_requests 1000;
    reset_timedout_connection on;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    ##
    # SSL common settings
    ##
    include /etc/nginx/include.d/ssl-common;


    ##
    # Logging Settings
    ##

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    log_format detailed '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" $request_length $request_time '
                '$upstream_response_length $upstream_response_time '
                '$upstream_status';

    log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $status / upstream $upstream_status $request upstream_response_time $upstream_response_time msec $msec request_time $request_time body: $request_body';

    log_format timed_combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'$upstream_connect_time $upstream_header_time '
'$request_time $upstream_response_time $pipe';

    access_log off;


    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    #Proxy config

    proxy_buffering on;
    proxy_buffers 56 4k;
    proxy_busy_buffers_size 8k;

    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Connection ""; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


#For a specific request I've increased the proxy buffer size
proxy_buffers 2048 4k;
proxy_buffer_size 4k;
proxy_busy_buffers_size 8k;


#Upstream setting
keepalive 2000;

Я даже оптимизировал настройки tcp в sysctl.config, и это тоже не помогает. Вот мой sysctl.config

#sysctl.config

fs.file-max = 100000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 400000
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
vm.min_free_kbytes = 65536

Вот график для Disk IO. Примечание: статистику TCP-соединений я добавил совсем недавно, поэтому информации немного.

Nginx_status - график, показывающий запросы и подключения

Что-нибудь в журнале ошибок?

Недавно возникла проблема, при которой в системе заканчивались дескрипторы файлов, потому что она буферизовала каждый запрос, а пакеты поддержки активности восходящего потока не были включены. Я бы не подумал, что у вас возникнут эти проблемы из-за этих настроек.

Не знаю, как выглядит ваше оборудование, но 700 запросов SSL / с в секунду - это довольно тяжело, есть ли iowait? ЦП исчерпан? "keepalive_timeout 65" также выглядит высоким для этого уровня трафика, возможно, у вас закончились TCP-соединения. Я нашел наилучшие результаты для ~ 300 запросов / с очень короткими, около 1-3 секунд, но это будет зависеть от вашей нагрузки.