游戏版本更新出错排查
最近有一次游戏服务器更新了一个版本之后,很多玩家反映游戏“很卡”,连接出现问题,游戏更新出错了。
作为运维人员,得到报告后,通过以下步骤处理问题:
1、先登录游戏服务器,执行命令 ps -ef |grep ### 查看游戏进程,还好,发现几个游戏进程都存在,netstat -tlnp 发现几个游戏端口都处于监听的,说明更新后游戏进程启动正常。
2、查看进程的启动时间
ps -p PID -o lstart
发现进程的启动时间正好是本次更新的时间,基本上可以判断游戏更新没有问题,因为都是脚本更新,以前没有问题,这次应也不会有问题(侥幸心理不应有的)...
3、使用top命令查看机器性能,cpu平均负载,内存使用都不高,在top命令里按1键,发现其中一个逻辑CPU的用户空间的使用率经常会达到99%以上,在top命令的进程表中发现一个twisted进程CPU使用率经常会达到99,初步判断原因在这里。这里对twisted说明下:游戏使用python开发的,网络通信使用的是twisted模块,twisted使用事件通知机制模型,在一个进程中异步处理大量用户的连接请求,特点是可以处理大量I/O操作(如果使用同步模型就会在因为任务阻塞而浪费大量的时间),且任务之间相互独立,即一个用户请求出错不会影响其他用户请求。
4、通过top命令得到该twisted的进程号
5、跟踪该进程,先介绍一个强大命令:strace
strace命令: strace - trace system calls and signals 追踪系统调用和信号。能够侦听和记录进程的系统调用,和进程接收到的信号。当程序无法启动或运行变慢时可以使用此命令跟踪程序。 -o 返回值可以通过这个参数重定向到一个文件中。 -p 参数指定pid开始跟踪,跟踪可以通过键盘中断信号Ctrl-C结束。strace命令可以在进程运行的情况下得到相应信息
通过strace命令跟踪twisted进程,并将结果重定向到文件中
strace -p PID -o tra.txt #可以运行几十分钟,以便得到更加平均的数。PID是进程号,tra.txt是写入文件。
6、处理tra.txt文件
查看tra.txt文件可以发现存在大量字段“XXX”,分析后知道这个字段是从redis数据库中取数据,通过不同的key得到value,对此数据文件进行处
more tra.txt | grep XXX | awk '{print $2}' | sort | uniq -c | sort -nr
得到排行靠前的多个key,最大的都有几十万了,然后可以将得到的数据给开发,让他们根据数据进行代码排查。
7、由于是代码出错,排查肯定要大量时间,所以要进行回滚,数据、代码回滚等等等。
最后还是游戏代码中循环出错,导致玩家进行某个操作时,要进行大量实时值获取并进行循环计算。
总结下,上面的步骤都是总结的,中间肯定也绕了一些路,但都是判断错误的一些常见步骤,如查看网络连接,查看磁盘使用情况等等。总的来说,就是遇到问题,一步一步进行排查,从服务器到进程,然后取得可靠数据,一切用数据说话。
本文出自 “阿三哥” 博客,谢绝转载!