很晚了,同样也很累,这边还很冷。本来窝在被窝里看会小说睡觉算了。可是我不能,今天就没什么收获了,不否和咱做人的原则。还是写点东西吧。
这几天服务器的问题完全爆发了,就是客户端在网络最差的时间里连续登陆不上去,导致玩家抱怨声非常强烈。公司对这样的事非常重视,要求程序这边立马解决。其实之前D哥就对这事进行过一次比较完善的分析。主要从三个方面方向出发:
1、 查看程序的bug,之前没出现问题,可能那次跟新新添的功能有bug。这些bug包括内存泄露,短时间内发大量的数据包。
2、 攻击,日志显示有客户端在短时间发送大量的请求,不符合常理。
3、 查看底层的网络库问题,可能是网络库的bug指导服务器底层处理数据出现问题。
我当时负责的攻击这块,主要查的syn,就是半连接攻击。因为对网络编程不是很熟悉,就找了一些别人写好的工具。结果一事无成,浪费好长时间这些工具都不好使,其实是操作系统不支持这些工具。最后司徒也找了个这样的开源工具,改装了一下。也不好使,最后说明Microsoft的操作系统很好的防攻击能力。
S和Z哥检查程序也没发现什么,然后D哥将网络库的一些参数改了。后来证明问题没有实际解决。该卡还是卡,问题严重了必须大家给个说法。这时候客户端参与进来了。大boss也参与进来了。感觉大boss确实不是菜鸟级的,有两把刷子。看问题很透彻,并且动手能力很强,已经到了手中无剑,心中有剑了。呵呵,就是高手范畴了,首先他在家里没有任何工具的情况下,通过简单的360估计还有就是ping了吧,判断出客户端与login服务器断开了却和lobby服务器继续连接着。后来客户端频繁登陆报错的原因就是出在这。很厉害,很佩服。但今天开会呢,讨论结果呢,问题不是那么简单,为什么lobby返回结果那么慢。呵呵仔细看这句话,问题就出在慢上。那慢在那里了,这是问题的本质,这时候解决问题的思路就是想法子记录客户端到login然后再到lobby再到global再到dbserver这个过程中都费了多长时间,问题被分解了。最后发现是dbserver的查询量太大了,可能平常遍历上万级的数据,咱感觉不出来,可是要是上百万,还能感觉不出来吗?这时候有什么办法呢,自然是数据库遍历的范围尽量小呗,这时发现数据库有很多垃圾数据,那就清理了。晚上测试很顺畅,不卡了,可问题不一定完全解决了。但是找到问题的源头了,就好办多了。
说了这么多,总结两点。一是要将手上的工具发挥到最高性能,做最多的事,这就是最大的成功,在一个要时刻注意这些东西运行的环境。很重要的。另外一点就是大家思考问题,总是习惯站在自己熟悉的领域思考问题,这样其实就是绕进死胡同了,有种身在此山中,不识庐山真面目的感觉了。这次问题根源发现不就是客户端反馈的结果慢吗。而之前分析的是lobby为什么突然收不到数据库的返回的结果了,数据库这时候干什么去了,错误提示是队列已满。确实把请求都积压到数据库,自然就处理不过来了,为什么这么多队列呢,是数据库性能达不到,还是说其他原因,之前就没想到是因为查询的量太大了。专业术语忘了。
就写这么多了,很困了,先睡了,等连上网了,在慢慢整理。