Chinaunix首页 | 论坛 | 博客
  • 博客访问: 535842
  • 博文数量: 80
  • 博客积分: 1496
  • 博客等级: 上尉
  • 技术积分: 1292
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-18 11:24
个人简介

IT码农一个~

文章分类

全部博文(80)

文章存档

2020年(3)

2019年(7)

2017年(1)

2016年(2)

2015年(2)

2014年(26)

2013年(26)

2012年(2)

2011年(1)

2010年(1)

2008年(9)

我的朋友

分类: C/C++

2013-09-03 14:07:21

本人游戏编程,今天客服反应,某区玩家普遍反应比较卡,而且个别玩家登陆不上。
一开始是查对应玩家的日志,没发现任何异常日志,但是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) |
给主人留下些什么吧!~~