一:说明
模拟客户端发包,压测服务器性能
服务器: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