Nginx Tomcat 之间时延过长性能问题

时间:2024-10-29 15:39:49

现象:

生产环境中,提供给第三方服务的时延每隔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建立的三次握手和释放的四次握手。问题出在两边释放四次握手不同步。

初步看程序的问题,再深入网络的问题,再深入网络协议,计算机基础得好好学。