问题描述
- 在使用
h5ai
或者nextcloud
下载文件时都会出现突然的连接中断,下载假死的现象h5ai
是直接部署在服务器上的服务nextcloud
是基于docker
搭建的服务,并有nginx
进行反代理
排查过程
分析过程:本着尽可能缩小问题范围的思路,先拿直接部署在服务器的h5ai
服务进行排查
- 通过在客户端抓包分析,传输过程中包含大量的传输错误的信息,最后都是客户端发送大量的重传请求后,网络开始安静,推断出网络状况不佳,可能是因为TCP的传输错误导致的。
- 开始排查客户端和服务端的网络连接质量,发现某些节点丢包严重,开始怀疑是入境的时候,服务商在搞鬼。
- 为了确信是服务商搞鬼,在服务器之间传输文件,确保服务器是正常的。此时发现服务器之间的文件下载也会出现假死状况,这才发现服务器是有问题的。
- 为了简化问题,使用python搭建简单文件服务器在服务器之间进行传输,传输依旧有中断的问题,开始怀疑是近期开启的
BBR
拥塞控制或者是Azure
的服务稳定性的问题。 - 为了排除控制问题范围,创建新的
Ubuntu 16
系统和Debian 9
系统,文件传输正常,排除掉是Azure
基础服务的问题。 - 问题聚焦到最近更改的
BBR
,开始尝试恢复原来的设置,将更改恢复之后,问题依旧,此时接近崩溃,几度想使用新的系统盘替换掉原来的系统盘。 - 绝望之后,尝试最后一次服务器上进行抓包分析(服务器之间互传,网络错误很少),此时发现
- 中断都是服务器端突然停止了包的发送引起的
- 经过一段时间,客户端发送
FIN
报文,服务器端依旧无响应,使用lsof
命令发现服务器端为close_wait
状态,客户端则已经关掉了对应的端口 - 一段时间后,服务端报
error: [Errno 32] Broken pipe
的错误,python服务器杀掉连接,并接受客户端重新发送的连接请求 - 传输几个报文后,问题依旧
- 经过上述过程定位到了问题,是服务器端突然停止包的发送造成的传输中断引起的,开始怀疑是
IO
问题引起的,但是经过新虚拟机测试,虽然IO很慢,但是没有问题。 - 此时开始想是什么阻止了服务器的包发送,防火墙!!!
- 关掉同是近期开启的
iptables OUTPUT
拦截,问题解决。- 拦截命令
iptables -A OUTPUT -m string --string "WEB_SITE" --algo bm -j DROP;
- 拦截命令
排查工具
- 查看端口对应的TCP链接状态
lsof -i:YOURPORT
- 抓包
tcpdump -iany tcp port YOURPORT
- 查看系统tcp状态
netstat -stcp
- 查看网卡网络包情况
ifconfig eth0
- 快速启动python 但进程文件服务
python -m SimpleHTTPServer 6080
iptables
常用命令概览
知识积累
docker
默认使用和主机一样的TCP
协议栈,在主机开启BBR
,docker
同样受益。iptables
在主机开启之后,对于docker
的虚拟网络没有影响,对于host
的网络连接是有影响的。这也解释了docker
部署的nextcloud
同样出现问题的原因:反代理使用了host网络
。
排查反思
- 对于服务器的操作改动,没有记录,压根就没有想到近期改过
iptables
。 - 不熟悉的命令先花点时间了解它,在自己学着用,只为实现目的,
copy and paste
是不对的。 - 排查问题,并不是上述过程那样目的明确,很多时候都是想着尽快换掉坏的模块是不对的,因此也记录下这篇日记,日后出现问题,希望条理清晰,不要惧怕打开黑盒子。
- 先分析自己的问题,再考虑外界调节的影响,牢记!
- 重中之重,学会停下来,而不是陷进去。这个问题占用了大量的时间,拖延了英语课程学习!