• 微信
    咨询
    微信在线咨询 服务时间:9:00-18:00
    纵横数据官方微信 使用微信扫一扫
    马上在线沟通
  • 业务
    咨询

    QQ在线咨询 服务时间:9:00-18:00

    选择下列产品马上在线沟通

    纵横售前-老古
    QQ:519082853 售前电话:18950029581
    纵横售前-江夏
    QQ:576791973 售前电话:19906048602
    纵横售前-小李
    QQ:3494196421 售前电话:19906048601
    纵横售前-小智
    QQ:2732502176 售前电话:17750597339
    纵横售前-燕子
    QQ:609863413 售前电话:17750597993
    纵横值班售后
    QQ:407474592 售后电话:18950029502
    纵横财务
    QQ:568149701 售后电话:18965139141

    售前咨询热线:

    400-188-6560

    业务姚经理:18950029581

  • 关注

    关于纵横数据 更多优惠活动等您来拿!
    纵横数据官方微信 扫一扫关注官方微信
  • 关闭
  • 顶部
  • 您所在的位置 : 首页 > 新闻公告 > 云主机连接超时如何解决?摸清这些“元凶”,让超时不再成心病

    云主机连接超时如何解决?摸清这些“元凶”,让超时不再成心病

    半夜十二点,我正在刷手机准备睡觉,突然收到值班同事发来的消息:“出事了,用户那边连不上我们的服务了,SSH也上不去,一直提示连接超时。”我翻身下床打开电脑,试着连了一下云主机,确实是超时。这种事经历过的人都知道,连接超时和访问失败感觉差不多,但仔细一想又不太一样。访问失败往往能立刻得到回应,比如“拒绝连接”或者“找不到主机”;而超时则是让你等啊等,等到花儿都谢了,最后告诉你“没等来回应”。

    云主机连接超时,简单来说就是你发出的请求,石沉大海,没有任何回应。这种“无声的拒绝”比直接的报错要难排查得多,因为它没有给你明确的错误信息,你需要自己去推测到底是哪里出了问题。今天我就结合自己这些年的实战经验,把连接超时的各种原因和解决办法好好梳理一遍,让各位在遇到这种情况时能有个清晰的排查方向。

    先说一个我自己的真实故事,这件事情让我对连接超时有了刻骨铭心的认识。那是我第一次负责一个线上项目,产品上线后的第三天早上,客户说网站打不开了。我试着用SSH连接云主机,等了半天,最后弹出一个“Connection timed out”。我第一反应是服务器挂了,赶紧去云控制台重启。重启之后,等了十几分钟,还是超时。我又检查了安全组,入站规则里22端口和80端口都是放行的,看起来没问题。我接着检查了系统监控,CPU、内存、磁盘都正常。折腾了将近两个小时,我甚至开始怀疑是不是云服务商的问题。后来我一个经验丰富的同事过来,让我从本地ping一下云主机的IP。我ping了,结果丢包率百分之百。他又让我traceroute追踪一下路由,结果发现数据包在某个运营商的骨干节点上就停止前进了。最后确认,是运营商骨干网出现了故障,我们什么都做不了,只能等运营商修复。这件事给我的教训是,连接超时有时候不是你服务器的问题,也不是你配置的问题,而是你和服务器的“路”上堵住了。

    连接超时的本质是什么?是你的客户端发出了一个请求,比如TCP SYN包等着服务器回应SYN+ACK,但是等了规定的时间没有等到,系统就放弃了。这个等待时间在操作系统内核参数里有定义,通常是几十秒到几分钟。超时和拒绝连接的区别在于,拒绝连接是服务器明确告诉你“我不听这个端口”,而超时是根本没人搭理你。所以排查连接超时,核心是找出来是谁“截胡”了你的请求,或者说谁没有把请求送到目的地。

    接下来我把导致连接超时的常见原因分成几个层面,每个层面都有具体的案例和处理方法。

    第一个层面,网络路径不通或者不通畅。

    你和云主机之间的网络不是直接的,而是经过无数个路由器、交换机、光缆。任何一个中间节点出了问题,都可能导致你的请求无法到达云主机,或者云主机的回应无法返回给你。这种现象在长距离跨地域访问时尤其常见。

    怎么判断是不是路径问题?一个很实用的工具是traceroute。在Windows上是tracert命令,在Linux和Mac上是traceroute。这个命令会列出从你的电脑到目标云主机经过的每一个路由器节点,并且显示每一跳的延迟时间。如果某一条突然出现超时或者星号,而且之后的节点全都不通了,那问题往往就出在这个节点上。

    我遇到过这样一个案例。一个做跨境电商的公司,他们的员工在美国访问部署在新加坡的云主机,经常连接超时。他们以为是服务器性能问题,升级了配置还是不行。后来我用traceroute从美国那台电脑测试了一下,发现数据包在美国西海岸的一个运营商的节点上延迟突然飙升到几百毫秒,然后后面的节点全部超时。等了几分钟后,有时候能通,但延迟很高。这就说明是跨太平洋的海底光缆拥堵或者运营商之间互联带宽不足。解决方案他们采用了折中的方法,在新加坡和美国之间建立了一条专线,关键业务走专线,普通访问走公网。成本上去了,但问题解决了。

    如果你自己也遇到了这种路径上的问题,除了联系宽带运营商投诉之外,有时候换个网络环境会有意想不到的效果。比如从家里的宽带切换到手机热点,如果手机热点的运营商不同,走的路径可能就不一样。或者使用一些合法的网络加速服务,本质上就是帮你找一个更好的路由路径。

    第二个层面,安全组或者防火墙直接丢弃了你的请求包。

    这是云主机连接超时最常见的人为原因。当你在安全组里没有放行某个端口时,云服务商的基础设施会直接把发往这个端口的包丢弃,既不回应拒绝,也不回应接受,就让它消失。客户端等不到回应,自然就超时了。这和前面说的“拒绝连接”不一样,拒绝连接通常是服务器上服务没监听,内核会回应RST包,但安全组这种前置防火墙是静默丢弃。

    举个例子,你买了一台云主机,想要通过SSH登录。如果你没有在安全组的入方向规则里添加22端口,或者你添加了但是来源IP写成了192.168.0.0/16,而你的真实公网IP不在这个范围内,那么你的SSH请求到达云服务商的虚拟交换机时,直接被丢弃了。你会一直在那里等,直到连接超时。解决办法很简单,登录云控制台,检查安全组规则,确保你要访问的端口已经添加了入方向规则,并且来源IP正确。如果实在不确定来源IP,可以暂时设置为0.0.0.0/0,但这只是为了测试,测试通过后要改回你自己的IP段或者更严格的规则。

    第三个层面,云主机操作系统内部的防火墙或者策略路由丢弃了包。

    包通过了云服务商的安全组,到达了云主机的虚拟网卡,然后进入操作系统的网络协议栈。这时候操作系统自带的防火墙,比如iptables或者firewalld,还有机会对这个包进行处置。如果你在iptables的INPUT链上设置了DROP策略,但是没有放行相应的端口,那么包也会被丢弃,客户端同样会超时。

    我帮一个客户排查过一个典型的案例。他的云主机突然无法从外网访问80端口了,但是安全组是放行的,而且用curl命令在服务器本机访问127.0.0.1的80端口是正常的,说明Web服务没问题。但是从他办公室访问云主机的公网IP,却一直超时。他一度以为是云服务商的问题。后来我让他登录服务器,执行iptables -L -n -v看一下规则计数。结果发现INPUT链的第一条规则就是拒绝所有来自eth0外部接口的包,只放行了SSH端口。他回忆说前几天装了一个安全脚本,脚本自动配置了防火墙规则,忘记把80端口添加进去了。添加放行80端口的规则之后,保存并重启防火墙,问题解决。

    还有一个更隐蔽的原因,是云主机的网络配置文件里设置了错误的网关或者路由策略。比如你手动修改了网络配置,default gateway写错了,那么请求能进来,但是回应的包不知道发往哪里,客户端同样会超时。这种情况比较少见,通常出现在你手动配置静态IP的时候。如果怀疑是这个问题,可以登录云控制台的远程管理终端检查/etc/sysconfig/network-scripts/ifcfg-eth0或者/etc/netplan/下的配置文件,确保网关地址和子网掩码正确。

    第四个层面,云主机上的目标服务没有启动或者崩溃了。

    包经过了安全组和防火墙,顺利到达了云主机,内核也把这个包交给了监听在相应端口上的应用程序。但如果这个应用程序没有在监听,或者虽然监听了但是已经崩溃不再处理请求,情况会怎样?这取决于应用程序的具体行为。有些服务没有运行时,内核会直接回应RST包,客户端会收到“连接被拒绝”,而不是超时。但是也有些服务因为各种原因处于半死不活的状态,比如进程还在但是假死了,或者监听队列满了,这时候内核可能不会立即回应RST,客户端就有可能超时。

    有一个真实案例让我印象深刻。一个Node.js写的聊天室应用,运行一段时间后,用户突然连不上了,浏览器一直在转圈,最后报连接超时。我用netstat检查端口监听情况,发现3000端口确实有node进程在监听。但是用curl试了一下,也是超时。然后我查看进程的CPU和内存,发现内存占用率极高,已经接近云主机的上限了。再看错误日志,发现Node进程因为内存不足频繁触发GC,导致事件循环被阻塞,无法响应新的连接请求。重启Node进程之后,连接恢复,但这不是长久之计。后来我增加了Node进程的最大内存限制,并且优化了代码中的内存泄漏点,问题才根治。所以服务“存在”不代表服务“可用”,进程僵死也会导致连接超时。

    第五个层面,云主机资源耗尽,无法处理新的连接请求。

    当云主机的CPU长时间跑满,或者内存耗尽导致系统开始疯狂使用交换分区,或者磁盘IO负载过高,系统的响应能力会急剧下降。这时候,即使服务进程还在监听,新的TCP连接也可能无法在超时时间内完成三次握手。客户端发送的SYN包被内核接收了,但是因为CPU繁忙,内核没有及时处理这个握手包,或者没有及时分配资源给这个连接,客户端就会一直等,直到超时。

    曾经有一个做图片处理的网站,用户上传图片后服务器要进行压缩和裁剪。某一天,有用户一次性上传了上千张高清图片,服务器瞬间CPU爆满。这时候其他用户访问网站首页,发现连接超时。我登上去用top命令看,平均负载已经飙升到几十,可用的CPU几乎为零。因为处理图片的进程占用了所有CPU核心,导致网络协议栈的软中断和系统调用得不到调度。解决方法就是先终止掉那些处理图片的进程,让系统恢复响应,然后修改代码,将图片处理改为异步队列,不要让处理任务阻塞主线程。同时也可以考虑将图片处理单独迁移到另一台服务器上。

    第六个层面,云主机公网IP被误判为攻击源而限速或封锁。

    云服务商为了保护整个网络,会对异常的流量进行监测。如果你的云主机突然发出了大量异常流量,比如被植入了挖矿木马或者成为了DDoS攻击的肉鸡,云服务商的监控系统可能会对你的IP进行限速甚至封禁。这时候你从外网连接这台云主机,可能会发现连接超时或者极其缓慢。但是云控制台显示的实例状态可能还是正常的。

    我处理过这样一个事件。一位用户的云主机SSH连接时总是超时,偶尔能连上但是特别卡。他检查了安全组、防火墙、资源使用情况,都没发现问题。后来他看了云服务商给的事件通知,有一条内容是他的云主机疑似被入侵,正在向外发起暴力破解攻击,所以云平台对该实例的出方向做了限制。因为他没有留意这条通知,所以一直蒙在鼓里。后来他按照指导重置了系统,重新部署了应用,并且加强了安全措施,云平台解除了限制,连接就恢复正常了。所以遇到莫名其妙连接超时的时候,别忘了去云控制台的消息中心或者安全中心看一眼,也许平台已经告诉了你答案。

    第七个层面,云服务商自身的基础设施故障。

    这个层面的问题,你是完全没有办法在服务器上解决的。比如某个可用区的虚拟交换机故障,或者机房的汇聚交换机宕机,或者DDos攻击导致骨干网拥堵。这种故障通常影响范围比较大,同一个可用区的很多用户都会遇到问题。你可以看看云服务商的健康状态页面,或者去开发者社区看看有没有人也在抱怨。

    我经历过一次可用区级别的网络故障。某云服务商的一个可用区因为软件升级出了问题,导致内部网络全部中断。在那个可用区里的所有云主机,都无法从外部访问,甚至同一可用区内的不同主机之间也无法通信。但是云控制台显示实例运行正常,监控数据也正常。云服务商在半小时后发布了故障公告,又过了一个多小时才修复。这种事情谁都不想遇到,但它确实会发生。作为用户,我们能做的是在设计架构时考虑高可用,不要把所有的鸡蛋放在一个可用区里,最好是多可用区部署,并且配置负载均衡。当某个可用区出现故障时,流量自动切换到其他正常的可用区。

    第八个层面,DNS解析导致的假性超时。

    这个情况很多朋友可能也遇到过。你输入域名访问网站,浏览器一直在加载,最后显示连接超时。但是你用IP地址直接访问,却能很快打开。这就是DNS解析出现了问题。可能是你的域名解析服务商出了问题,无法把域名转换成IP地址,也可能是你本地的DNS缓存有问题,或者是你的电脑配置了不稳定的DNS服务器。

    有一个案例是这样的,一家小公司的网站从某个域名注册商那里买了域名,解析用的是注册商自带的DNS服务。有一天,网站突然打不开了,浏览器提示超时。他们检查了云主机,一切正常。后来发现是域名注册商的DNS服务被攻击,导致全球很多地方的解析请求都超时了。用户访问网站时,浏览器先要去查询域名对应的IP,但是DNS服务器迟迟不回应,浏览器就一直等着,最后报了连接超时。他们后来把域名的DNS服务迁移到了更稳定的第三方DNS服务商上,问题就再也没有出现过。所以当你遇到连接超时的时候,也可以尝试直接用IP地址访问,如果IP地址能连通,那就要考虑DNS层面的问题了。

    第九个层面,客户端或者本地网络的ARP或者路由问题。

    有时候问题出在客户端自己的电脑或者局域网内部。比如你的电脑IP地址设置冲突,或者你连的公司网络有很严格的出口防火墙,或者你的路由器ARP表出了问题,导致数据包发错了地方。这些问题相对少见,但也不是没有。

    我遇到过一件很奇葩的事情。一位同事怎么也连不上公司的一台云主机,连接始终超时。他换了网络,用手机热点就能连上。我们排查了很久,最后发现他办公室的交换机上有一条静态ARP记录,指向了一个错误的MAC地址,而这个MAC地址对应的是一台已经不存在的设备。所有发往云主机IP的数据包,都被交换机发到了那个不存在的设备上,自然没有回应。交换机上的网络管理员清理了错误的ARP记录之后,他的连接立刻恢复了。这个案例告诉我们,有时候问题真的非常隐蔽,需要结合网络抓包来分析。

    最后,我想分享一个综合性的排查流程,当你遇到云主机连接超时时,按照这个顺序来操作,大部分问题都能定位到。

    第一步,先确认是不是自己电脑网络的问题。换一个网络环境试试,比如手机热点。如果能连上了,那就是你原来的网络有问题,检查路由器、宽带、或者公司防火墙。

    第二步,尝试用其他设备或者从其他地点访问你的云主机。如果有朋友在其他城市,让他帮忙试一下。如果别人能通而你不能通,那问题在你这边或者你和服务器之间的路径上。

    第三步,登录云服务商控制台,查看云主机的运行状态,确保实例是“运行中”而不是“已停止”。同时检查安全组入方向规则,看看你要访问的端口是否被放行,来源IP是否正确。

    第四步,通过云控制台的远程管理终端登录到云主机内部。先查看系统防火墙规则,确保没有拦截你需要的端口。然后查看目标服务是否在运行,以及监听的地址是否是0.0.0.0或者你期望的公网IP。可以用netstat -tunlp确认。

    第五步,在云主机内部,用curl或者wget测试本机的服务是否正常。比如访问http://localhost:80,如果本机正常但外网超时,那就是网络层面的问题,不是服务本身的问题。

    第六步,检查云主机的资源使用情况。用top看CPU和内存,用df -h看磁盘使用率,用uptime看平均负载。如果资源紧张,先找到消耗资源的大户,终止掉或者优化。

    第七步,使用traceroute从你的客户端到云主机IP,看看在哪一跳卡住了。如果卡在某个运营商节点,可以试着用VPN或者换个宽带试试。如果卡在云服务商的节点上,可以联系云服务商的技术支持,提供traceroute结果让他们排查。

    第八步,如果以上都正常,但还是超时,考虑是不是云服务商层面的故障。查看官方状态页,或者提工单询问。

    连接超时问题排查起来需要耐心,因为它不像明确的错误日志那样直接给你答案。但是它恰恰是锻炼你网络知识和对云主机理解的好机会。每解决一次超时问题,你对网络的认知就会更深一层。下次再遇到的时候,你的脑子里会自然而然地浮现出这些原因和排查步骤,不会再像第一次那样手足无措。



    最新推荐


    微信公众帐号
    关注我们的微信