Я пытаюсь оптимизировать каплю 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