1. 程式人生 > >服務器的性能監控

服務器的性能監控

hist 初始 xxx java_opts 業務 之前 auth 初始化 ech

一:說明

模擬客戶端發包,壓測服務器性能

服務器: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

服務器的性能監控