2023.3.2 【某游戏】排位赛无法进入且重启无效


背景

13:48,客服反馈移动端排位赛进不去。内心OS:小场面小场面,重启a、c服务器就OK了。果然重启之后就正常了
17:32,客服又反馈排位赛进不去。不~会~吧~ 再重启!然鹅,这次重启也无效了。无奈中只好去翻服务端日志,翻了半天,也没有什么收获,日志都比较正常
17:58,本来今天有个约会的,看来要泡汤了。于是果断推掉约会,启动大法,找运维帮忙截了两个服务的fulldump,同时自己也准备好pdb文件

分析过程

首先分析a服务

1、用windbg打开dmp文件,加载符号表

2、~*kv 命令查看所有线程,每个线程看似都比较正常

3、!runaway 命令查看所有线程花费的时间

苹果数据分析painc_苹果数据分析painc

4、好像也没什么异常

没什么头绪,再分析分析c服务吧

1、用windbg打开dmp文件,加载符号表

2、~*kv 命令查看所有线程,这次终于不正常了

苹果数据分析painc_苹果数据分析painc_02


苹果数据分析painc_苹果数据分析painc_03

3、好几个线程都显示停在DB操作的逻辑块

4、!runaway 命令查看所有线程花费的时间

苹果数据分析painc_运维_04

5、可以看到排名第一的30号线程刚好在等待DB操作完成
6、用 ~[33]s 命令切到33号线程,kv 命令查看该线程,也是等待DB操作,其他耗时较多的线程也都是如此

分析结果

分析到了这里,基本上可以推断是数据库性能出现了问题。于是联系运维,果然数据库CPU过高,重启数据库,问题解决!

问题反思

1、服务应该尽可能接入ELK模块,这样可以让我们更好的监控到服务状态,防患于未然
2、我们写代码的时候,不能仅考虑实现,也要多关注性能。尤其数据表的设计和数据库操作,设计不好,一旦短时间内有大量请求进来,就会将服务工作线程占满,消息堆积,最终导致服务卡住甚至崩溃