一:说明

模拟客户端发包,压测服务器性能

服务器:8核  +  4g

二:压测过程

1.玩家登陆、创建

2.玩家瞬时登陆上限(主要使用j.u.c信号量CountDownLatch)

3.战斗

4.移动

5.自动任务

6.场景无缝切换(暂未做验证)

 

三:技术过程

1.设置program argumetns,比如3000人战斗,参数:1,3000

2.加载配置文件,包括客户端需要的配置文件,主要目的是寻路、任务、采集、副本等

3.机器人的线程模型:

  机器人客户端只需要设置io worker线程数量,一般是:cpu*2

  netty inbound事件中接受服务器的返回消息,如果是机器人感兴趣的事件,抛到业务线程中处理,处理的业务线程数量:cpu

  移动任务、攻击任务等在机器人客户端都是统一的task,增加任务执行的schedule线程,线程数量:cpu

  机器人客户端模拟机器人的移动,类似定时移动任务帧,线程数量:1

  如果机器人有移动的队列信息,在上一步会轮训到,取出队列头信息,更改客户端机器人的位置

  所有机器人的状态变更,都是在业务线程中处理。

 

四:遇到的坑点

  消息的解码,由于是页游,之前用到了policy文件,定长为:162.具体的解码过程,后面文章中会详细说到。现在走843,已不用。

  消息的回调,新增了MessageCallBack,具体使用j.u.c的lock和condition

  机器人客户端的位置与服务器位置不统一,修正机器人的位置,并移动发送到服务器位置。

  读写操作导致机器人掉线,单独一个线程,每30S发送一次心跳包。

  服务器初始化脚本,导致somaxconn变大,临时更改:echo 32768 > /proc/sys/net/core/somaxconn

 

五:如何分析问题?

  使用Java命令:

    jps -l:查看Java的pid

    jstat -gc pid 1000:每1s查看一次垃圾回收情况

    jmap -dump:format=b,file=a.bin pid:dump出bin文件,可以结合MemoryAnalyzer.exe一起使用

    jmap -histo:live pid(根据情况看live是否使用),查看当前jvm占用的大对象

    cpu过高:

      top -Hp pid:查看当前占用最高的tid,线程ID

      printf "%x\n" tid:16进制转换

      jstack pid|grep tid -A 30:查看线程栈信息

  远程监控工具的使用:

    JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9998 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=xxx"

    JMC="-XX:+UnlockcommercialFeatures -XX:+FlightRecorder"

  可视化工具的额使用:

    jconsole

    jvvm

    jmc飞行记录仪

    eclipse memory analyzer 分析bin文件

 

六:程序中集成SocketMBean接口,监控stat信息

 

程序的优化:

writeAndFlush还是write,单独线程flush?

是使用buffer还是directBuffer?

堆外内存大小的设置? -XX:MaxDirectMemorySize=256m

posted on 2017-05-26 15:00  二周目赤  阅读(472)  评论(0编辑  收藏  举报