一:說明java
模擬客戶端發包,壓測服務器性能服務器
服務器:8核 + 4geclipse
二:壓測過程jvm
1.玩家登錄、建立工具
2.玩家瞬時登錄上限(主要使用j.u.c信號量CountDownLatch)性能
3.戰鬥優化
4.移動線程
5.自動任務netty
6.場景無縫切換(暫未作驗證)orm
三:技術過程
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