游戏版本更新出错排查


    最近有一次游戏服务器更新了一个版本之后,很多玩家反映游戏“很卡”,连接出现问题,游戏更新出错了。
    作为运维人员,得到报告后,通过以下步骤处理问题:

   

    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、由于是代码出错,排查肯定要大量时间,所以要进行回滚,数据、代码回滚等等等。

  

    最后还是游戏代码中循环出错,导致玩家进行某个操作时,要进行大量实时值获取并进行循环计算。
    

    总结下,上面的步骤都是总结的,中间肯定也绕了一些路,但都是判断错误的一些常见步骤,如查看网络连接,查看磁盘使用情况等等。总的来说,就是遇到问题,一步一步进行排查,从服务器到进程,然后取得可靠数据,一切用数据说话。