株机接口发送超时问题的分析和总结
1. 问题背景
1.1. 问题描述
珠机项目在项目部上线高可用(F5 系统)前一切正常,在某日上线高可用后发现系统向 esb 发送接口数据时出现间断性的失败,失败原因为连接超时。使用手动重发功能也是会出现几率性失败。
1.2. 问题分析
1.2.1. 接口日志
接口日志记录的异常为:Network error :Connection timed out
日志很明显表明是网络问题。把问题反馈给客户时,由于问题是概率出现,且只在 MES 像 ESB 发送数据单向有问题,客户认为不能排除 MES 或 MES 所在系统环境的问题,需要我们提供进一步证据表明是网络问题。
1.2.2. 初步网络测试
现场进行了如下测试和检验步骤,均没有明显问题(没有检测到异常的原因会在下文说明)。
1. 关闭 nginx、让 F5 只代理我们一个系统,无效果
2. 余智使用 kim 给的网络检测工具检测网络没有发现异常,服务器 ping esb 服务器也正常
3. 关闭 F5 系统(等于将系统恢复到最初的状态),问题依旧存在
4. 我们将服务器的环境拷贝到自己的笔记本上,发现发数据都是正常(大概测试了 100-200 条数据)
5. 我使用开发环境直接连接正式库发送数据,每隔 0.5 秒给 esb 发送 100 条数据,也没有问题
2. 问题处理
2.1. 工具准备
接口日志表明是网络问题,我们还是先在基础网络上进行分析。为了进一步获取接口概率失败情况下的详细网络数据,我们使用了强大网络分析工具:Wireshark。Wireshark 是一个网络抓包工具,能够检测通过网络接口 (网卡) 的所有字节流,而且能够解析常用的网络协议,以可阅读的方式呈现。官网下载地址:
https://www.wireshark.org/download.html
使用方法也比较简单,直接在对应的网口上开始捕获就可以。为了针对特定问题分析,需要掌握一些基础的过滤条件使用方法,最简单的 ip.address == xx.xx.xx.xx 只过滤显示目标地址的数据。其他操作可参考:
https://www.cnblogs.com/nmap/p/6291683.html
2.2. 网络接口分析
现场捕获的网口数据流显示,网络会间断出现 TCP 连接三次握手失败的情况。TCP 三次握手的简要描述是“请求”->“相应”->“再确认”。具体说明可参考:
https://www.cnblogs.com/Qing-840/p/9283367.html
现场截图和说明如下:
上图表明,52(MES 服务器)向 77(ESB 服务器)请求建立链接 (3+6+12) 秒超时,右侧 SYN 表示连接请求,Retransmission 表示两次重发请求,间隔时间是 3 秒和 6 秒。
2.3. 问题解决
将上述结果反馈给客户。此时客户才告诉我们,ESB 也使用了 F5 负载均衡,而且进行了新旧机房搬迁。77 是负载均衡服务器,下挂两个 ESB 服务,一个是 74,一个是 75,而且 75 是在新机房扩展的服务。由此我们推断,可能是 75 服务本身的网络不稳定,当 F5 负载到 74 上时接口是正常的,而负载到 75 上时则会出现连接连接超时。
现场更换 MES 中的 ESB 地址为 74,进行网口数据检测,网络连接趋于正常,接口发送也正常,且连续运行了一个晚上和一上午无异常。
至此,MES 接口发送异常的问题基本定位清楚:客户现场网络环境和 ESB 服务负载均衡导致。
3. 问题总结和分析
3.1. 描述和分析
这个问题本身属于网络和基础设施的问题,与 MES 系统无关,问题处理周期长的主要原因是没有了解到客户现场的环境变化和对端系统的调整 (客户主观上有所回避,我们也没有详细追问),影响了相关问题判断,以致分析过程复杂化了。
然后说明下初步测试中几个现象的原因。
1) F5 中 MES 的负载均衡更多的是影响别的系统或客户端访问 MES 服务,而与 MES 访问其它系统关系不大。
2) 有两个点,一是 ping 测试只能测试服务器本身网络,并不能代表服务的正常运行,如果测试服务的连通行,需要持续发送 http 请求,例如可以在 linux 下用 shell 脚本持续发送 curl 命令。而是在硬件负载均衡的情况下,ping 的 F5 本身的服务器,并不能测试其代理的服务。
3)基本上同 1( 关的是 MES 的负载,不是 ESB 的)
4) 问题重现的概率与 F5 的负载策略有关,在相对短的时间内,F5 会持续负载到正常的服务,问题比较难重现。
5) 同 4
3.2. 补充
针对网络不稳定的环境,可以适当进行网络参数的调优,比如上述例子中,TCP 请求超时,重发的次数是两次 (系统默认),可以通过修改注册表将 TcpMaxConnectRetransmissions 参数调大。具体参数可参考微软官网:
实际操作可使用辅助工具,如 optimizer.exe