近期收到其它同事的反馈:有个http接口调用经常出现Connection timed out,去查看tomcat下的业务日志和catalina.out
也没有重要线索,怀疑reload
nginx造成短时的网络问题,然而说出这种猜想自己都有点心虚。果然没多久就啪啪啪打脸了,好香!服务调用又出异常啦,而且有时候行,有时候Connection timed out~
没办法只能从整个链路查日志,链路大概是这样的:
前端发送的请求 → nginx → ip哈希方式到Web服务器
既然Web服务器找不到有用的日志,只能去nginx找,果然在nginx的错误日志里找到大量如下错误日志:
[error] 26621#0: *50585595 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: xxx.xxx.xx.xxx...
找到错误但完全没有解决思路,难受?,屋漏偏逢连夜雨,接着又收到CPU 200%的预警邮件,有点小兴奋。使用top
命令查看是哪个进程占用了这么高的CPU,是个java进程,使用pwdx pid
定位到进程所在路径。
估计是pid对应的进程已经不能正常工作了,查看占用CPU最高的两个线程,发现其一直在做Full GC
操作。到这大概知道怎么回事了,Tomcat进程估计发生了内存泄漏已无法处理请求,快速对该进程的现场信息进行保存,然后重启Tomcat,重启后nginx不再产生recv() failed (104: Connection reset by peer)
的错误日志。
总结:
系统出现时好时坏的异常时首先要留意流入服务器的第一个站点以及CPU、内存状况