记一次接口突然响应很慢的排查经历
项目背景:微信小程序获取uinonid,通过第三方获取积分等信息(相关的一个小部分其他不谈)
一进入小程序就一直菊花乱转,看了下报文是一直没返回东西给前端的
于是先从nginx access_log入手 发现除了499就是200 没什么异常 没看过499于是从499入手
查了一下发现是用户主动断开连接 后面发现只要后端还未返回东西给前端只要主动刷新页面就会出现499 中断此次连接
如图所示 红圈框住的还没接收到返回 就被刷新了页面 nginx acess_log 就会记录为499了
于是乎我们可以排除是这个问题了 此时怀疑起了是不是第三方返回太慢导致我们的php-fpm(curl设置了25s断连 因为第三方的接口太坑爹了) 不够用排队等处理 所以接口响应就很慢 (其实一开始是排除这个的,以为不够用是汇报502的)
于是拿自己的服务器模拟了这种操作 a服务器curl调用b服务器接口(模拟线上服务器) b服务器接口sleep 20s(模拟第三方处理很慢)(两台服务器 php-fpm配置都是动态最大30)
然后调用a服务器接口一直刷了五十次 然后再开一个页面请求a服务器另一个接口 结果是请求a服务器另一个接口的页面也响应很慢 和一开始的场景一致
找到原因了 继续验证 查看很慢那段时间访问第三方的日志(这个日志是为了方便自己debug打的 大概接口如图)
很多都超过了25S导致自动断开连接 没有拿到返回的信息(图上值截取了部分,实际上有很多)
总结:这个经历可供大家毫无头绪的时候参考,因为自己刚遇到这个情况的时候也是束手无策的,不知道怎么从哪里开始诊断,当然,大家也可以继续往数据库等层面找原因看看慢日志等,慢慢去发掘原因