本人游戏编程,今天客服反应,某区玩家普遍反应比较卡,而且个别玩家登陆不上。
一开始是查对应玩家的日志,没发现任何异常日志,但是gate上登陆后,再无其他任何关于他的日志。
然后top了一下,发现logic服务器占用cpu一直在99%~100%之间,
当时就怀疑哪里有了死循环。
先是用 strace -p pid 查看了下,基本都是epoll_wait(), sendto, write 之类的系统调用,还算比较正常。
接着再用 pstack pid 连续查看几次,发现大部分线程都是在wait状态,只有一个线程7每次的栈都在 Load_equipment
查看逻辑,外部也没有多次调用这个函数的地方;
cpu还是一直居高不下,但是内存属于缓慢增长,没有太明显。
没有办法,就只有祭出 gcore pid 生成了一个core文件,然后gdb logic core.pid
跳到对应的栈上,发现row_count竟然有33w之多,而迭代器已经执行到11w多的地方。
查了下装备的id,发现是前几天由于策划配置的物品价钱有问题,导致部分玩家利用此漏洞买卖物品刷金币。
最终,由于停服压力太大,没有停服,直至线程自动加载完毕;
但是这个问题却敲响了几个警钟,
首先是 写这部分代码的程序在load db的时候,没有加limit保护。 我们不应该妄自的揣测某种数据量不会达到某个极限。
如果真的可能是大数据,那么需要分批加载; 如果不是,那么需要一些警告日志,并且添加相应的处理方法。
其次是 数据库某类数据最好能有个异常的监控脚本,定期检测玩家的数据;
最后就是 程序和策划都要小心、小心再小心。
阅读(1419) | 评论(0) | 转发(0) |