实际情况:需要满足QPS=5000的请求,大部分请求来自于几个固定IP,即可以利用keep-alive特性来重复利用TCP连接。系统是CentOS 6
一、调整内核参数
net.ipv4.tcp_syncookies = 1 #开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,主要为防止DoS攻击 net.core.somaxconn = 2048 #定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认的 128 太小了,建议调大 net.ipv4.tcp_tw_reuse = 1 #开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接 net.ipv4.tcp_tw_recycle = 0 #启用timewait快速回收,但如果开启了该值,并同时开启了tcp_timestamps,会产生时间戳错乱的现象,建议关闭 net.ipv4.tcp_keepalive_time = 900 #TCP发送keepalive消息的频度。缺省是2小时。这里设为15分钟 net.ipv4.tcp_fin_timeout = 15 #保持在FIN-WAIT-2状态的时间,默认60s net.ipv4.ip_local_port_range = 10240 65535 #允许系统打开的端口范围,10240以下的保留 net.ipv4.tcp_max_syn_backlog = 8192 #记录的那些尚未收到客户端确认信息的连接请求的最大值 net.ipv4.tcp_max_tw_buckets = 5000 #timewait的数量,默认是180000。 net.ipv4.tcp_max_orphans = 131072 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,即孤儿连接,主要是为了防止DoS攻击
将以上参数写入到/etc/sysctl.conf,然后sysctl -p重新加载,加载完立即生效。
其他的参数采用默认值,可参考 http://www.howtocn.org/nginx:%E9%85%8D%E7%BD%AE%E4%B8%80%E4%B8%AA%E9%AB%98%E6%80%A7%E8%83%BD%E7%9A%84nginx_fastcgi%E6%9C%8D%E5%8A%A1%E5%99%A8 查看更多参数
二、调整Nginx参数
main部分
worker_processes 8; #根据CPU核数决定 worker_rlimit_nofile 65536; #一个nginx进程打开的最多文件数,跟ulimit -n保持一致 events { use epoll; #优化IO模型 worker_connections 10240; #不要设置太高,否则线程切换会造成很大负担 } keepalive_timeout 15; #如果短连接居多,建议缩短
upstream部分
keepalive 128; #connection数量,用于Nginx跟后端的keep-alive连接,因为upstream后端以长连接为主,该值设定非常有效。设的越大,占用内存越多 proxy_http_version 1.1; #在location内设定 proxy_set_header Connection ""; #在location内设定
该部分可以详见,http://blog.csdn.net/lizhiqiang50/article/details/7551292
三、Tomcat调整
maxThreads="300" #默认200,不要设的太高,否则线程切换会造成CPU很大负担,表现情况就是TOP看sy%比例很高。 minSpareThreads="50" connectionTimeout="20000" #20秒 keepAliveTimeout="15000" #15秒