背景:
客户端请求服务端域名,进行查询操作,偶尔出现200ms+延迟,且对于该请求服务端执行速度4ms左右,此问题非常诡异,决定对此进行研究. 下面记录下当时详细的定位&解决流程
问题定位:
1、分析代码
服务端系统是一个常见的spring-boot web工程,使用了集成的tomcat。分析了代码之后,发现并没有特殊的地方,没有特殊的过滤器或者拦截器,所以初步排除业务代码问题.
2、确定调用链路
3、问题排查分析
3.1、网络层问题,抓包 (20210701)
确定耗时位置是 客户端调用F5,还是 F5 调用 服务端 ?
3.1.1 服务端ack出现大量 RST
通过跟踪RST的HTTP 流 发现:在FIN最后一次关闭之后 , 服务端向客户端发送了 FIN 关闭连接的请求,然后服务端又向客户端发了报文导致RST. 抓包如下:
怀疑是连接不能复用导致的建联耗时,经排查代码发现,客户端未使用连接池,因此 客户端增加HTTP 连接池来解决此类问题 .
3.1.2 网络耗时长,抓包
经过2.1.1 的优化之后,还是存在调用超时的现象,现在我们通过wireshark 抓包观察,发现客户端与F5之间无超时情况,客户端发出请求后,随机收到了F5的ACK;F5 发出请求后,间隔40ms 收到服务端的ack , 此处就引出了另外一个问题,就是 TCP 神奇的40 ms (https://cloud.tencent.com/dev... 大家可以自行去备注的链接去研读,这里篇幅时间有限,不在进行赘述 .
3.2、网络层无波动,考虑应用层
开始考虑服务端 socket 连接 和 服务端容器方向
3.2.1. 服务器socket连接
跳过F5 负载,直接使用IP:port 的方式请求服务端(20210713)
20210714 观察日志: