ゲームサーバJVMパフォーマンスのチューニング

4202 ワード

最近、ページゲームサービスのパフォーマンスを最適化し始め、いくつかの心得をまとめました.現在のサーバハードウェアはますます良くなり、数十Gメモリ、十数個のCPUがあります.ハードウェアがボトルネックではない場合、プログラムを最大限に活用することが考えられる問題です.ゲームサーバについては、いくつかの要件、高負荷、低遅延を満たす必要があります.特にオープン当日には、大量のユーザーが殺到し、サーバにストレスを与える可能性があります.サーバ言語としてJavaを使用すると、プログラム自体のパフォーマンスに加えて、JVMの構成もシステムのパフォーマンスに直接影響します.
パラメータチューニング
入門レベルの構成は一般的にjava-server-Xmx 5000 m Xms 5000 mサーバ側のjvm実行プログラムに加えて、-serverの多くのデフォルトパラメータがこの実行モードに基づいて最適化されていることを覚えています.ここでは最大メモリと最小メモリが設定、一般的には同じように構成されており、メモリ申請や伸縮による性能損失を低減することができる.
ごみ回収アルゴリズムを組み込む構成:java-server-Xmx 5000 m-Xms 5000 m-XX:+UseConcMarkSweepGC-XX:+UseParNewGCごみ回収に関する具体的なアルゴリズムの紹介ここでは詳しく説明しませんが、JVMのfull gcの回数と時間をできるだけ減らすという常識があります.full gcはシステム全体の一時停止を招くからです(stop the world).そのため,旧世代のためにUseConcMarkSweepGCを選択し,同時gcアルゴリズムを選択し,新生代のためにマルチスレッドの並列gcアルゴリズムUseParNewGCを選択した..
新世代のメモリサイズの設定java-server-Xmx 5000 m-Xms 5000 m-Xmn 800 m-XX:+UseConcMarkSweepGC-XX:+UseParNewGC Xmnは、新世代のメモリサイズです.(eden+2 survivor space).このパラメータ設定はシステムの応答速度に直接影響する.javaプログラムでnewのオブジェクトは、まずeden領域に置かれ、edenがいっぱいになるとgcがトリガーされ、生き残ったオブジェクトがsurvivor領域にコピーされる.何度もyong gcを通過した後も、生き残っていれば古い年代に入る.新生代設定が大きくなると、yong gcの時間の消耗が大きくて、設定が小さくて、またすぐにいっぱいになって、yong gcの周波数が高すぎることを招きます.新生代は大きすぎるべきではありません.新生代が大きくなったので、古い年代のメモリは小さくなって、古い年代のメモリは小さくて、full gcの発生する周波数が大きくなります.Xmnも正確なアルゴリズムがなくて、あなた自身の業務システムによって決定しました.私が設置したゲームサーバーの時一般に、大量の同時ユーザの動作をシミュレートし、Xmnのサイズを調整するとともに、gcの時間と周波数をモニタし、適切なサイズを選択します.次に、gcをモニタするためにツールを使用する方法について説明します.Java-server-Xmx 5000 m-Xms 5000 m-Xmn 800 m-XX:+UseConcMarkSweepGC-XX:+UseParNewGC-XX:+U seCMSCompactAtFullCollection-X:CMSInitiatingOccupancyFraction=70古い世代のgcを使用すると、メモリの破片が発生しやすくなり、メモリの使用率が低下するため、UseCMSCompactAtFullCollectionを加えることでfull gc時にメモリ圧縮を行い、メモリの断片化を減らし、システムのデフォルトはtrueをオンにします.CMSInitiatingOccupancyFraction=70は、古い年代のメモリが70%に達したときにトリガーされることを示します.このパラメータは特に注意してください.デフォルトは68%で、設定が小さすぎるとfull gcが完了しません.yong gcのオブジェクトが移行し、古い年代全体のメモリが5-X:+UseCompressedOopsでいっぱいになります JVM最適化の圧縮通常オブジェクトポインタ(CompressedOps)は、通常、64ビットのJVMが消費するメモリが32ビットより1.5倍大きくなります.これは、オブジェクトポインタが64ビットアーキテクチャの下で長さが2倍(より広いアドレス)になるためです..32ビットプラットフォームから64ビットに移植するアプリケーションでは、開発者が見たくないメモリ消費量の1/2が増加しています.システムのデフォルトはtrueをオンにします.6.X:+PrintCommandLineFlags .このパラメータの役割は、VMの初期化が完了した後、最初のデフォルト値とは異なるすべてのパラメータとその値を表示することです.  7. -XX:+PrintFlagsFinal .前のパラメータにはデフォルト値とは異なる値しか表示されませんでしたが、このパラメータには設定可能なすべてのパラメータとその値が表示されます.8.X:+PrintFlagsInitial .このパラメータは、パラメータを処理する前に設定可能なすべてのパラメータおよびその値
<span style="font-family:Microsoft YaHei">$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)
$ java -XX:+PrintFlagsInitial | grep UseCompressedOops
     bool UseCompressedOops                         = false           {lp64_product}      
$ java -XX:+PrintFlagsFinal | grep UseCompressedOops
     bool UseCompressedOops                        := true            {lp64_product}      </span>
を示す.

デフォルト値を表示する方法は次のように統一されています. 
java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads
JVMデフォルトのゴミ回収ポリシー、若い世代向け:UseParallelGC true(デフォルト)UseParNewGC false UseSerialGC false-XX:+UseParallelGC:ゴミ収集器をパラレル収集器として選択します.この構成は若い世代にのみ有効です.複数のゴミ収集スレッドを同時に並列に並列に行うことができますが、この時点でユーザースレッドは停止する必要があります.-XX:+UseParNewGC:若い世代をマルチスレッド収集として設定します.CMS収集と同時に使用できます.serialベースで実装されるマルチスレッド収集器です.
高齢者向け:UseParallelOldGC true(デフォルト)UseConcMarkSweepGC false-X:-UseConcMarkSweepGC古い世代に対して同時タグ交換アルゴリズムを使用してGC-X:+UseParallelOldGC:古い世代のゴミ収集方法を並列収集として構成します.-X:-UseParallelGCがオンの場合、このオプションは自動的に有効になります. 
ツール
jstatは、gcのステータスをリアルタイムで表示するために使用されます.使用方法:jstat-gcutilプロセス番号時間(ミリ秒)です.結果は、各区間のメモリサイズ、新生代gcの回数と時間、古い世代gcの回数と時間をリストします.ここでは、JVMの稼働状況を反映します.
jmap javaプロセスのオブジェクト状況を表示するための使用法:jmap-histo:liveプロセスid.各クラスのインスタンス数を印刷できます.メモリサイズの使用法:jmap-dump:format=b、file=log.binプロセスidというコマンドは特に役に立ち、jvmのメモリミラー全体をコピーして、各オブジェクトが占めるメモリ状況を分析することができます.javaプロセスがクラッシュしたら、これを使用します.方法は、どのオブジェクトが元凶であるかを分析することができる.
jstack javaプロセスidを表示するためのスタック情報の使い方:jstackプロセスidというツールは、デッドサイクルのスレッドを表示するのに有効であり、どのスレッドがどの方法でデッドサイクルしたかを直接見つけることができます.
まとめ
JVMのパラメータはたくさんありますが、ほとんどは設定や最適化する必要はありません.プログラムに問題がなければ、振り回さないでください.最適化するには、対応するテストプロセスが必要です.