【网络】一次文件上传慢/失败问题的排查处理

2022-06-25  本文已影响0人  Bogon

一、问题背景

OA系统部署完毕,小范围上线使用后,收到用户反馈,说是通过消息对话框或者其他一些涉及文件上传如审批的模块,上传文件速度非常慢,2M的文件上传要几分钟,几十兆的文件基本就失败了。

客户OA 系统 web端地址: https://oa.example.com

文件上传链路:

用户 -----> https://oa.example.com:443  ---- >客户网络设备(NAT)----> 外部反向代理 outer_nginx_vip:443  -------> 文件服务A ---->内部反向代理  inner_nginx_vip:80 ----> 文件服务B ----> mongoDB

二、问题排查

客户网络是电信 100M带宽。

我用账号测试在公司网络(电信网)涉及文件上传的地方都测试上传了,没问题。

另一位同事也做了测试没问题,但是如果用笔记本连公司wifi(移动网),就能复现这个问题。

这个问题并不是所有用户都有反馈,只有一定比例的用户,说明并不是全局性的。

1. 初步认为文件上传过程中 移动/联通/电信之间的转网导致上传速度慢

分别用 在移动/电信网络下, tracert  oa.example.com  没发现有什么问题,在移动网络下测试电信地址,经过的路由当然要多,说明不了什么,而且反馈的客户本身使用电信网络的也不少,所以排除这个原因。

2. 可能是服务器时间同步、OA系统文件模块问题

2.1. 发现代理服务器、文件服务器和数据服务器之间有几十秒的时间差,于是搭建内网ntp服务器,将所有服务器全部同步一遍,然后将反向代理、文件服务相关工程,文件存储相关数据库全部重启一遍,问题依然存在

2.2.  测试上传几个文件,跟踪文件上传日志,从nginx反向代理日志到文件服务工程日志,没发现有什么问题

2.2.  不经客户外网接入设备,直接通过与内网OA 服务器同一个网段的Windows服务器,将域名oa.example.com 写hosts解析到 nginx_vip 上传文件,非常快

说明不是OA系统文件模块本身问题。

3. 因为是有一定概率出现问题,怀疑问题出在客户网络设备的负载均衡器上

客户方网络人员于是将 NAT 映射的内网地址从 nginx_vip 改为 nginx01_ip,测试发现问题依然存在,问题不在这里。

4. 在内网服务器上搭建其他服务,将端口映射出去,测试文件上传

4.1 在 nginx01 服务器上使用nexus搭建一个web服务,将 8081端口映射到 oa.example.com,通过登录 http:// oa.example.com:8081测试文件上传。

那么, 这个服务经过的 客户网络设备跟OA文件服务是相同的。

测试发现,不同用户上传,有人快,有人慢/失败;同一个用户某天快,某天慢/失败。

4.2. 将内网的  nginx01 、db01 两台服务器的 22 端口分别临时映射到 oa.example.com,通过 ssh  username@oa.example.com 直接SSH 远程到内网服务器

使用 SSH 客户端工具通过 sftp直接上传文件,发现 几十k的小文件可以,几兆、几十兆的文件上传一会,就直接中断了,不只是慢,而是直接失败

5.  怀疑客户接入层网络设备中使用了ECMP,且某条链路有问题

测试用nexus上传文件发现一个非常诡异的现象:在家里通过vpn接入客户网络,大小文件,上传一定成功;如果直接通过公网,会某天成功,某天会失败。

这就很让人不可思议了,开始怀疑接入设备对接收的请求报文,使用了某种调度算法,当来源不变,调度走的链路不变,而来源ip是其中一个因子。

家里宽带的出口公网ip,每天都是变化的,对客户接入设备而言可以理解为 源ip变了,那么请求报文被调度走的链路可能不一样。

当某天在家通过浏览器上传失败时,改为接口调用命令行接口调用上传:

curl -v -u username:password --upload-file file.zip http://oa.example.com:8081/repository/test/ file.zip

在家里Windows电脑上执行失败,但是登录我的一台云主机执行同样的命令是成功的。

我们做了如下测试:

nexus 文件上传, http协议

SSH  文件上传,sftp协议

OA 文件上传,http协议

通过上述测试,不管使用什么协议,都有失败的概率,那么底层问题应该出在tcp上。

当然在做nexus 、sftp文件OA系统文件上传时间,同时开启了客户端Wireshark抓包,抓包条件为 ip.host == xx.xx.xx.xx

xx.xx.xx.xx 为 oa.example.com 的公网ip

当文件上传慢/失败时,有大量的 乱序、丢包,从而导致tcp层的大量的重传,进而导致文件上传慢/失败。

当文件上传正常时,乱序、丢包是偶现,影响不大。

三、 客户网络设备问题排查

从上面测试结果看,基本可以确认问题出在客户的接入网络设备上了。

通过跟客户网络人员逐层设备抓包测试,发现问题可能是负载和汇聚直接互联的接口,两个一组聚合,协商出了问题。

注: 深信服网络设备上,可以直接通过设备的管理界面,设置抓包参数开启抓包,生成抓包文件,用wireshark分析。

负载  和 汇聚层  ,负载模式下,2X2  有4条线路

当关闭 链路3时,原来上传有问题,上传都ok了,通过公网上传100M左右的文件也很快了,这也解释了问什么一定概率的用户文件上传失败了。

四、问题处理反思

一开始就应该开启wireshark 抓包,就能知道文件上传慢、失败是因为 底层tcp报文 大量的 乱序、丢包和重传,这样就不用做那么多后面的文件上传测试了。

当然,如果没有那么多的链路段测试,客户网络人员不会如此配合,毕竟经过这些测试之后,问题都指向了接入层网络设备,跟上层应用没有关系!

五、参考

Nexus REST and Integration API

https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api

Wireshark网络抓包(一)——数据包、着色规则和提示

https://www.cnblogs.com/strick/p/6261463.html

Wireshark网络抓包(二)——过滤器

https://www.cnblogs.com/strick/p/6261915.html

Wireshark网络抓包(三)——网络协议

https://www.cnblogs.com/strick/p/6262284.html

Wireshark网络抓包(四)——工具

https://www.cnblogs.com/strick/p/6344486.html

上一篇 下一篇

猜你喜欢

热点阅读