2023.3.2 【某游戏】排位赛无法进入且重启无效
背景
13:48,客服反馈移动端排位赛进不去。内心OS:小场面小场面,重启a、c服务器就OK了。果然重启之后就正常了
17:32,客服又反馈排位赛进不去。不~会~吧~ 再重启!然鹅,这次重启也无效了。无奈中只好去翻服务端日志,翻了半天,也没有什么收获,日志都比较正常
17:58,本来今天有个约会的,看来要泡汤了。于是果断推掉约会,启动大法,找运维帮忙截了两个服务的fulldump,同时自己也准备好pdb文件
分析过程
首先分析a服务
1、用windbg打开dmp文件,加载符号表
2、~*kv 命令查看所有线程,每个线程看似都比较正常
3、!runaway 命令查看所有线程花费的时间
4、好像也没什么异常
没什么头绪,再分析分析c服务吧
1、用windbg打开dmp文件,加载符号表
2、~*kv 命令查看所有线程,这次终于不正常了
3、好几个线程都显示停在DB操作的逻辑块
4、!runaway 命令查看所有线程花费的时间
5、可以看到排名第一的30号线程刚好在等待DB操作完成
6、用 ~[33]s 命令切到33号线程,kv 命令查看该线程,也是等待DB操作,其他耗时较多的线程也都是如此
分析结果
分析到了这里,基本上可以推断是数据库性能出现了问题。于是联系运维,果然数据库CPU过高,重启数据库,问题解决!
问题反思
1、服务应该尽可能接入ELK模块,这样可以让我们更好的监控到服务状态,防患于未然
2、我们写代码的时候,不能仅考虑实现,也要多关注性能。尤其数据表的设计和数据库操作,设计不好,一旦短时间内有大量请求进来,就会将服务工作线程占满,消息堆积,最终导致服务卡住甚至崩溃