现象:
生产环境中,提供给第三方服务的时延每隔2分钟总有时延大于200ms,影响了用户体验。
前期排查以为是系统内部问题,nginx +tomcat +redis。发现业务模块之间ok。
排查nginx 机器 发现查看nginx进程ps -ef|grep nginx 180个WAIT_TIME
tcpdump 抓包
TCP重连耗时近1分钟,底层连接出问题了。nginx 和tomcat之间的握手不停重连。
频繁握手、采用长连接。
网上有一篇nginx+tomcat 长连接的文档很准确。
/enweitech/article/details/52858612
当前系统修改如下:
http {
keepalive_requests 8192;
keepalive_timeout 180s 180s;
}
upstream test {
keepalive 768;
}
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
}
tomcat 的
<Executor name="tomcatThreadPool" namePrefix="req-exec-"
maxThreads="2048"
maxHttpHeaderSize="8192"
minSpareThreads="512"
maxSpareThreads="1024"
maxIdleTime="30000"/>
<Connector executor="tomcatThreadPool"
port="8080"
protocol=".http11.Http11NioProtocol"
connectionTimeout="10000"
redirectPort="8443"
acceptCount="1024"
enableLookups="false"
URIEncoding="utf-8"
compression="on"
结合操作系统配置
/etc/
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
重启服务之后 完美解决。
后续持续研究此问题:
nginx和tomcat 会出现此问题,tcp建立的三次握手和释放的四次握手。问题出在两边释放四次握手不同步。
初步看程序的问题,再深入网络的问题,再深入网络协议,计算机基础得好好学。