关键词:TCP、CLOSE_WAIT
问题背景
某日下午有测试人员急匆匆的跑来跟我反馈:“有客户反馈供应商附件预览不了,流程阻塞,需要紧急处理”,我立马精神起来,毕竟都是付费客户(目前做B端业务,客户都是付费用户,不像C端,出了问题发个道歉声明也就过去了)。
等她说完,我第一时间用测试账号登上去验证,浏览器一直在转圈,差不多一分钟以后出了nginx的504错误页。
初步排查
也许有人对504这个错误码不熟悉,这里借用百度百科的内容简单介绍下这个错误码。
504 Gateway Timeout
作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
(内容来源于百度百科)
看到这个错误码第一反应就是下游服务太慢,导致nginx请求超时了,这里的下游服务是自研的附件预览服务,采用SpringBoot开发,整体的请求链路如下图所示:
在线预览的处理流程如下:
1.用户在业务方站点发起预览请求;
2.业务方拼接相关参数重定向到预览服务;
3.预览服务通过业务方传递的附件链接调用业务方接口下载附件到本地;
4.预览服务将下载的附件转换成html供用户在线预览;
结合上面的处理流程和请求链路,初步得到以下两点猜测:
1.预览服务调用业务方下载接口过慢;
2.预览服务本身处理过慢;
带着这两点猜测我立马去查看日志,结果却大跌眼镜,从昨天14点以后就没有日志输出了。
请求进不来了?假死?挂了?
我首先确认进程是否存在,进程跑的好好的,为什么会没有请求呢,我第一反应是业务代码有问题,导致线程被hang占满了tomcat的线程池,所以立即使用jstack查看线程情况,意外的是一切正常,线程数不多,更没有发现死锁、socket read0等可能导致线程hang住的情况。
自身没问题,难道是被其他任务影响了,我继续使用top查看系统负载、cpu占用等情况
显而易见,负载、cpu占用都不高,似乎陷入了僵局。
我猜测可能不是业务代码的问题,需要跳出业务代码去查问题,既然没有请求,那就先从网络开始查起。
渐入佳境
先确认下服务端监听端口是不是正常。
第一步:netstat 查看网络状态netstat -aonp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer tcp 81 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1/java off (0.00/0/0) tcp 0 0 127.0.0.1:8100 0.0.0.0:* LISTEN 24/soffice.bin off (0.00/0/0) tcp 936 0 172.20.4.203:8080 172.20.5.59:40576 CLOSE_WAIT - off (0.00/0/0) tcp 867 0 172.20.4.203:8080 172.20.4.172:57166 CLOSE_WAIT - off (0.00/0/0) tcp 964 0 172.20.4.203:8080 172.20.5.59:50106 CLOSE_WAIT - off (0.00/0/0) tcp 1701 0 172.20.4.203:8080 172.20.4.172:45428 CLOSE_WAIT - off (0.00/0/0) tcp 1169 0 172.20.4.203:8080 172.20.4.172:61582 CLOSE_WAIT - off (0.00/0/0) tcp 963 0 172.20.4.203:8080 172.20.4.172:64474 CLOSE_WAIT - off (0.00/0/0) tcp 1058 0 172.20.4.203:8080 172.20.5.59:44564 CLOSE_WAIT - off (0.00/0/0) tcp 962 0 172.20.4.203:8080 172.20.4.172:64160 CLOSE_WAIT - off (0.00/0/0) tcp 1733 0 172.20.4.203:8080 172.20.4.172:46810 CLOSE_WAIT - off (0.00/0/0) tcp 1587 0 172.20.4.203:8080 172.20.5.59:40032 CLOSE_WAIT - off (0.00/0/0) tcp 994 0 172.20.4.203:8080 172.20.4.172:47474 CLOSE_WAIT - off (0.00/0/0) tcp 867 0 172.20.4.203:8080 172.20.5.59:47134 CLOSE_WAIT - off (0.00/0/0)