前言:
计算机是一个多层的结构,计算机领域的好多问题是通过增加一层中间层还解决,悲剧的是这样上层发生问题得时候,没有头绪的时候,我们得通过了解底层,熟悉底层来定位和解决,或许这也是成长为nb程序员的道路吧.
问题:
服务器抽象后架构如上:
12月份底我们的游戏服务器出现了卡的情况,
服务器在某个时间点全区出现卡,表现为客户端的人物不动,npc不动,
但是服务器的cpu和内存资源占用都很低.
分析:
第一阶段: 定位为网关的问题
定位方式: 游戏客户端设置了ping指令, 记录了客户端到每个服务器一个来回的时间,而且在服务器内部收到消息的时候打了日志
出现卡现象的时候网关发消息到逻辑服务器,到收到逻辑服务器的消息时间时间没多少延时
但是用户收到ping消息的延时很长,初步定为了网关的出现了卡的情况.
对比了网关服务器最近提交的代码,发现有增加读写锁的情况,写了测试代码,发现多线程情况下有时候开销很大
具体这边
修改了相关代码
第二阶段:继续优化代码
上面的问题提交了,问题没有得到解决,当时就没有方向了
猜测可能是逻辑瞬间发送的消息很多,导致网关处理不过来,另外生成图形验证码耗时,可能导致消息的堆积
屏蔽了相关代码,继续观察
第三阶段: tcpdump定位问题
通过抓包分析网关和客户端直接通讯的情况,详细这边
问题定位为客户端到服务器的这条线出问题,最后发现是客户端在网络卡的情况下,会超量发包,网络越卡发包越多
服务器socket接受缓冲区被占满,问题得到了解决.
总结mark下,借助优秀的工具,能让我们更好的定位分析问题,还是要多学习啊