手边有一台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