一次网络问题排查

问题背景

线上服务告警,报请求外部服务 EOF 错误。告警持续约10几分钟恢复正常。 image.png 我们业务依赖很多第三方服务,看到该告警,第一时间拉起了第三方服务的研发排查,但因为使用的是第三方服务提供的 sdk,请求成功前默认不会记录有请求 id 来帮助定位,对方一时也无从下手,同时也没有其他客户反馈该问题,建议我们先复现。

问题排查过程

阶段一

查资料得知 EOF出现的直接原因就是读一个已经关闭的 TCP 连接。

网上有相似的问题,在高并发场景下,长连接复用时,可能会遇到对方服务主动关闭链接时,客户端还在读该链接则报 EOF。

另外,据有相关经验的同事提到,他有其他服务遇到过相似问题,改用短链接就好了。

服务本身虽然会有一定的并发,但应该不至于高到这个程度,但服务本身对短链接这点性能消耗是可以接受的,先改成短链接跑一段时间。

阶段二

服务安然跑了两周,就在以为问题解决的时候,又冒出了告警,持续了一小会。

迅速打开容器和主机的网络监控面板,没有发现异常情况,NAT 网关虽然流量有升高,但是购买的性能应该是远能满足。这就非常让人摸不着头脑了。

手上信息不足,无头绪。但看监控可以排除容器和主机的网络问题。问题可能出在我方网关或者对方网关上。于是,向第三方服务方求证是否对客户端 ip 进行了限制,得到了否定的答复。那就只好先行抓包,等下一次现场出现。同时,在另外的不共用 NAT 网关的环境跑一些拨测脚本,设置该对照组进一步缩小问题范围。

阶段三

没过两天,终于等来了现场。

观察抓包数据,发现好些个发往第三方的请求一直没有收到回包导致一直重传,最后收到第三方服务的 fin 包。这个就是 EOF 的直接原因了。但不是高并发引起,而是在包重传了一分钟后被断开。

image.png

扫描二维码关注公众号,回复: 14345059 查看本文章

紧接着在有问题的容器中 curl 第三方服务,出现等待很久的现象,再尝试 curl 其他外网服务,有时成功,有时也会等待。此时其他对照组本身没有遇到该问题。那是不是出在 NAT 网关上?

NAT 网关的情况和上次差不多,出入流量和连接数在上升,但在性能允许范围内。奇怪了。

会引起出入带宽明显上升的情况应该挺特殊,了解确认后得知是一个上传下载的功能引起。立马通过日志确认 EOF 时间点是否使用了该功能。发现确实有相关性,每次 EOF 时都有东西在上传下载。网关的监控数据表明出现明显波动。

当前的重点是恢复核心业务,立马和产品沟通,暂时下架该功能。然后问题恢复,告警群回归正常。

阶段四

虽然解决了EOF问题,但是网关的问题得深究,明明性能配置都远没达到 NAT 网关的瓶颈,为何会出现丢包的情况。而且观察监控数据,流量一直跑在低点,即使在上传下载文件,也没有突增到很高。和 NAT 网关的同学的沟通后得知,有新特性做了灰度,对于某类用户,NAT 网关关联的EIP 默认带宽为 1M, 以前是没有这个限制的,后续已将默认值调大至 5G。后续我们也作了调整,将占带宽功能的出入口与业务的网关分隔开,以免业务受影响。

结论

NAT 网关 EIP 带宽过低,在超过 EIP 的带宽后会出现丢包。第三方服务在我方发出请求后一分钟没有收到后续请求,主动断开了连接,导致我方报 EOF。查以往 EOF 的日志也确认了这一点,都是在发请求后一分钟开始报错。

猜你喜欢

转载自juejin.im/post/7114300246175580167
今日推荐