早上一起来被告知昨晚有将近两个小时的游戏服务器连接失败。大概的样子是这样:

第一排查的是机房网络情况,经过询问得知网络正常。然后开始分析日志,发现如下特点:

  1. 连接失败的开始时间和结束时间差不多(夜里2点-4点)
  2. 两个机房都出现了上面的情况(国内,国外)

根据以上两条进一步分析,机房的网络问题被排除了。

排除掉机房后,我又看了下当时的cpu内存情况也没有异常。接下来只能重新掉头分析上报内容了,感觉大部分失败都是在登陆界面。游戏内玩家报告失败的情况没有。这个时候反应是不是steam平台炸了。但是这个怎么验证呢?这么大的平台炸了,为啥网上没有一点消息。。。

接着只能硬着头皮查日志了

根据日志这段时间分析也发现了几个特点:

1. 两个机房出现情况的时间点不单单是差不多,而是精确到秒级别的同步。
2. 一般的超时差不多就是几百毫秒,这段时间的超时居然高达了100秒。

根据1来推断有两种可能性。第一种是我们又被攻击了,不过我很快否定了这个想法。因为攻击不可能挑选半夜人少时候,并且只持续了2小时左右就停止了,这个不大符合规律。那么就是最不可能的肯能了:steam平台昨晚挂了。

steam平台有波动是很正常,但2个小时的时间算是一个不小的事故了。会不会是因为某次波动导致的底层bug,从而请求阻塞之类?不过经过老板提点,还是否定了这个思路,因为两个机房,相同的时间节点。由于两边环境的差异,不可能这么凑巧的。所以真相只有一个:steam 挂了2小时。

顺着这个思路,我终于找到了一个作证:

相关网站 https://outage.report/steam 。这个是一个专门给玩家们上报steam 挂机了的网站。报告的热点图几乎都在北美和欧洲,国内似乎知道的人很少,并且由于出问题时间在半夜,所以并没有人会怀疑到steam上面去。

这下一切就解释得通了:steam昨晚真得挂了2个小时!根据宕机历史来看,steam不算太靠谱。。。

隐患

当解决完上面的疑惑后,还有一个问题:为啥steam宕机时候我们居然挂机了100秒?幸亏这个问题是半夜发生,如果是高峰期,可能直接导致游戏内玩家都会无法使用。这也算是一个比较大的隐患了。当然,最后解决这个问题是比较简单,重新设置下timeout和readwritetimeout时间就好了。

对于request里面给的解释:

timeout 相当于请求发出到建立连接所花费的时间,默认100秒
readwritetimeout 相当于建立连接到下载完整个包体需要的时间,默认300秒