为了满足并发要求,本次对某个接口进行压测,目标是并发1200(实际可以达到1600),RT 1s以内;nginx+tomcat集群
1、刚开始启动200线程,30秒,没有任何问题,响应时间也正常;
2、将持续时间调整到300秒后,运行到一定时间就会报错,并且后续请求都是错误;
3、通过查看error日志发现:
onnect() to xxxx:8080 failed (99: Cannot assign requested address) while connecting to upstream, client: xxxxx, server: localhost, request: "POST /xxxx/UpdateDevicePosition.do HTTP/1.1", upstream: "http://xxxxxx:8080/xxxxx/UpdateDevicePosition.do", host: "xxxxx"
此报错说明nginx在反向代理到tomcat时,端口已经耗尽,不能再分配端口。
4、解决方案:
首先将端口范围扩大,
查看端口范围:
sysctl net.ipv4.ip_local_port_range
扩大端口范围:
echo 15000 64000 > /proc/sys/net/ipv4/ip_local_port_range
(但是治标不治本,因为端口最多只有65535个);
再通过 netstat -anp查看网络连接,发现有很多连接处于TIME_WAIT,于是只需将处于TIME_WAIT的连接快速回收即可解决问题;所以通过改写内核参数解决:
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
引申扩展关于解决time_wait的处理办法
具体的解决方式
vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
// 表示开启SYN cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1
//表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
//表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_fin_timeout = 30
//修改系統默认的 TIMEOUT 时间
/sbin/sysctl -p //保存后生效
至此问题解决,压测时服务器稳定运行,先留个记录,下一篇如何将并发只有70优化到1600;