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

Выявление узких мест с помощью нагрузочного тестирования nginx VPS

Я пытаюсь оптимизировать каплю Digital Ocean (512 МБ), тестирую с помощью loader.io

Я тестирую на своей домашней странице HTTPS / PHP. Я установил кеш страницы FastCGI, что позволило мне увеличить скорость от 100 до 2000 запросов в секунду.

Но все, что превышает 2000 запросов в секунду, приводит к большому количеству таймаутов и медленным ответам (от 20 мс в среднем до 1500 мс). Я пытаюсь определить узкое место. Это еще не процессор / память, потому что загрузка едва достигает 0,30, а использование памяти составляет примерно половину. Я попытался изменить размер до гораздо большего размера, но таймауты все еще происходят.

Это не FastCGI, потому что производительность нагрузочного тестирования почти идентична для базового файла .html.

Во время тайм-аутов error.log пуст. Кажется, ничего не выдает ошибок (что я могу найти). Kern.log имеет этот журнал:

TCP: Possible SYN flooding on port 80. Sending cookies.  Check SNMP counters
TCP: Possible SYN flooding on port 443. Sending cookies.  Check SNMP counters.

Я попытался отключить файлы cookie, которые остановили эти ошибки, но таймауты все еще сохранялись.

Во время тайм-аутов я начинаю видеть нарастание TIME_WAIT:

netstat -ntla | awk '{print $6}' | sort | uniq -c | sort -rn
   6268 ESTABLISHED
    831 TIME_WAIT
      6 LISTEN
      2 FIN_WAIT1
      1 Foreign
      1 established)

Мой вопрос: где еще я могу найти здесь узкое место? Есть ли другие журналы ошибок или команды, которые я могу использовать для отслеживания?

Вот мой nginx.conf (FastCGI и обычный кеш браузера находятся в моем файле по умолчанию). Я пробовал multi_accept, что, похоже, ухудшает время ожидания. Я знаю, что worker_connections - это нелепо, но, похоже, не имеет значения, насколько я увеличиваю или уменьшаю его:

user www-data;
worker_processes auto;
worker_rlimit_nofile 200000;
pid /run/nginx.pid;

events {
    worker_connections 200000;
    # multi_accept on;
    use epoll;

}

http {

    ##
    # Basic Settings
    ##

    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    server_tokens off;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 30;
    types_hash_max_size 2048;

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

    ##
    # Logging Settings
    ##
    access_log off;
    # access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

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

Вот мой sysctl.conf

### IMPROVE SYSTEM MEMORY MANAGEMENT ###

# Increase size of file handles and inode cache
fs.file-max = 2097152

# Do less swapping
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 2

### GENERAL NETWORK SECURITY OPTIONS ###

# Number of times SYNACKs for passive TCP connection.
net.ipv4.tcp_synack_retries = 2

# Allowed local port range
net.ipv4.ip_local_port_range = 2000 65535

# Protect Against TCP Time-Wait
net.ipv4.tcp_rfc1337 = 1

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 15

# Decrease the time default value for connections to keep alive
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_syncookies = 1

### TUNING NETWORK PERFORMANCE ###

# Default Socket Receive Buffer
net.core.rmem_default = 31457280

# Maximum Socket Receive Buffer
net.core.rmem_max = 12582912

# Default Socket Send Buffer
net.core.wmem_default = 31457280

# Maximum Socket Send Buffer
net.core.wmem_max = 12582912

# Increase number of incoming connections
net.core.somaxconn = 4096

И я помещаю их в limits.conf:

*         hard    nofile      500000
*         soft    nofile      500000
root      hard    nofile      500000
root      soft    nofile      500000