这个问题是我在面试相关资深服务器工程师时必问的,我想得到的答案不一定要求全面。
其实我最关心的是:作为一个服务器端的工程师,咱们应该具备在遇到问题时能有效的处理这个问题的能力和自信。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
凌晨0:31,刚上床的苦逼服务器电话铃声又响了,论坛刷爆了....
游戏进不去了。。。。战斗卡的一逼。。。。
我X。。。。尼玛。。。什么破玩意儿。。。。靠。。。。给劳资赔偿。。。。
大伙,一起告他Y的去,找工信部投诉。。。。给咱们赔偿。。。
微信里面老板咬牙切齿的说:“什么情况,怎么又是问题,什么时候可以解决!!!???”
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个场景我相信做过几年游戏的应该都不陌生。
下面我就谈谈自己的见解,当然一个人的想法肯定是不全面的,还请大家多指教.
1:针对玩家所说的卡,首先我们得确认一个事实:卡顿和延迟
卡顿:是客户端由于某种逻辑处理不当造成的界面UI反映慢,或者点击没反应,甚至导致客户端直接崩溃。
延迟:一般的表现是,界面操作顺畅,但是数据反映慢,最直接的就是像按钮点过之后要等一段时间才能看到结果。
这个问题一般的方法就是让自己的人进游戏看一眼,同时检查一下服务器负载、数据库压力;
一般情况下3、5分钟就可以得到准确的答案。
之所以这个放在第一步:是应为只有确认了这个之后,咱们至少不会在客户端卡顿的情况下乱查一顿服务器log,因为一般情况下服务器都会有那么一两个慢操作的log记录,
这回很影响咱们的嗅觉,总觉得这里有问题,但是又不能确定。最终在这里耗费了很长时间都得不到结果。
而且最烦的是运营的同学老是在追问进度 —— “问题查的怎么样了? 什么时候能好? 要不要回档?”
2:在弄清楚第一个问题后,如果排除了客户端的卡顿,那么咱们就可以断定这个“卡”至少不是客户端的同学造成的。
那么现在还有两个可能,A:服务器反映慢、B:网络慢
最直接的办法就是看下top信息,看下服务器负载,如果当时的负载很高,那么8成就是A了。
如果发现负载很低,接下来就要想办法查一下网速了,如果发现网速确实不正常,那你就可以联系运维的同学,让他们帮忙联系机房那边协同处理
3:在第二步排除网速问题之后
我一般是直接tail一下log,一般数据库要是有问题我们的log应该是最能说明问题的了。
如果定位到是哪个表出问题了(mysql有时候会有表损坏的情况)如果你的服务器有对于的防护措施的话,可以直接修复这个表。
如果没有防护措施,那就只好关服,修复数据库,然后在开服
4:在第三步排除了数据库问题后,这时候估计已经过了大概10-15分钟了。
老板有点等不及了,因为对于一个游戏来讲,时间直接影响这个月的流水。
如果你的服务器是多进程的,在不影响游戏的情况下你可以采取重启部分问题进程的方法暂时解决这个问题。如果只有一个进程,那就只好重启游戏了。
当然在这之前,你应该花1-2分钟的时间来做下面这几件事情。
找2到3个服务器(最好能找一个正常的)
a、查看一下当时Java进程的gc情况,并把它记录下来。
b、把这几个服务器的整个堆dump下来。
c、保存log信息(这个一般服务器都会有相应的保存机制的,不过安全起见,最好还是留一个心眼).
d、如果可能,记录一下当时的在线人数等信息。
e、通知运维和运营,准备重启问题服务器。
有人可能要说了,这问题还没找到,就重启了???
我的答案是,如果咱们有自己的测试流程,已经在测试环境下测过是没有问题的。
那么它可能就是一个比较隐藏的bug,或者是内存问题,短时间内不会暴露出来。那我们就可以利用这个时间和之前得到的这些信息来排查问题
我相信,对于一个有几年经验的Java工程师来说,在有足够的信息的前提下,排查一个问题不会花很长时间。
如果在一个通宵后,你定位到了这个问题,那么恭喜你。第二天你可以堂而皇之的倒半天休。
接下来就是安排一次服务器维护了....
-----------------------------------------------------------------------------------
未完待续。。。