“不敢去怀疑代码,又不得不怀疑代码”记一次网络请求超时分析
摘要:此次定位,颇为复杂,而且有时让人没有思路,因为同一个接口,换一个环境又好
使了,又不敢去怀疑代码;然而有问题的环境,换一个接口也好使了,又不得不怀疑代码
本文分享自华为云社区《一次网络请求超时分析》,笔者:xiewenci 。
问题现象
发 起 http 请 求 , 后 端 服 务 接 口
/v5/iot/11c9c88e6fb26bead43b75514dc380eb/routing-rule/rules?limit=10&marker=fffffffffffffffff
fffffff&offset=0,一直等待,一分钟后返回响应,且中文乱码显示
分析过程
1.首先定界,在正常环境和异常环境换一样的版本代码,测试同样接口,但是正常环境正
常,异常环境还是等待 1 分钟,所以觉得是环境问题,于是下一步,抓包
2.分别再异常环境和正常环境抓包,具体流信息见下图:
异常环境的流信息
正常环境的流信息
从图中看出正常环境是,服务端发送响应完成之后,由客户端正常返回 ACK,然后由客
户端发起 FIN 断链请求。而异常环境则是服务端发送响应完成之后,客户端也回了 ACK,
但是没有主动发起断链请求,直到超过 keep-alive 时间之后,由服务端发起了断链请求(因
为超时主动断链)。现象是客户端一直在等服务端发送响应(可能没有发送完),所以怀疑服
务端有缓存之类,没有及时将响应流发送出去,所以继续查看代码
3.查看代码,在返回客户端的时候,没有 flush 和 close 操作,代码如下