手邊有一台Server, 設備大概是16G, 16 Core CPU,
打算拿來建置一台Backend Web Server(只跑PHP),
套件部分使用Nginx(0.8.6)、PHP-fpm,
希望可以達到每秒鐘併發數在200~500之間,
實際架設後並使用ApacheBench測試(-n10000 -c200)的結果是,
只要當系統的TIME_WAIT達到6000(net.ipv4.tcp_max_tw_buckets)之後,
伺服器的反應開始下降(使用tshark觀察), 並且就卡住了,
最後ab會發出apr_socket_recv: Connection timed out (110)的訊息,
尤其反覆測試後, 在先前的TIME_WAIT釋放之前, Server都會處於非常慢的狀況,
請問有哪些細節是沒有注意到還可以持續優化的嗎?
還是這台機器的等級, 沒有辦法處理這麼高併發的數量?
中間, 有使用ss去觀察TIME_WAIT的timer倒數,
發現每次都是從60秒開始倒數,
請問有辦法降低這個數值嗎?
或者讓Nginx的連接在client關閉後,
直接將該資源回收掉嗎?
目前一直著眼在TIME_WAIT的問題,
是否我思考的方向有錯?
還請有經驗的指點迷津,
感謝.
kernel參數調整如下,
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_mem = 786432 10485760 15728640
net.ipv4.tcp_wmem = 4096 10485760 20971520
net.core.wmem_max = 20971520
net.ipv4.tcp_rmem = 4096 10485760 20971520
net.core.rmem_max = 20971520
/etc/limits.conf調整如下,
* soft nofile 65535
* hard nofile 65535
Ningx的主要相關設定如下,
worker_processes 8;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 51200;
}
PHP-fpm的主要相關設定如下,
backlog = 8192
max_children = 256(static)
rlimit_files = 65535