WRY

Where Are You?
You are on the brave land,
To experience, to remember...

0%

云服务器下载时网络莫名中断的问题排查

问题描述

  • 在使用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协议栈,在主机开启BBRdocker同样受益。
  • iptables在主机开启之后,对于docker的虚拟网络没有影响,对于host的网络连接是有影响的。这也解释了docker部署的nextcloud同样出现问题的原因:反代理使用了host网络

排查反思

  • 对于服务器的操作改动,没有记录,压根就没有想到近期改过iptables
  • 不熟悉的命令先花点时间了解它,在自己学着用,只为实现目的,copy and paste是不对的。
  • 排查问题,并不是上述过程那样目的明确,很多时候都是想着尽快换掉坏的模块是不对的,因此也记录下这篇日记,日后出现问题,希望条理清晰,不要惧怕打开黑盒子。
  • 先分析自己的问题,再考虑外界调节的影响,牢记!
  • 重中之重,学会停下来,而不是陷进去。这个问题占用了大量的时间,拖延了英语课程学习!