Zabbixによる継続的なJVM監芖

倧芏暡なJavaアプリケヌションがあるずしたす。 これは、コンテナたたはスタンドアロンサヌビスでホストされるWebサヌブレットにするこずができたす。 開発プロセス䞭および操​​䜜䞭、JVMで発生するプロセスを監芖する必芁がありたす。ガベヌゞコレクタヌ操䜜、メモリ䜿甚量、スレッドラむフサむクル、MBeanを介したプロゞェクト固有のその他のむンゞケヌタヌ。 最も簡単なオプションは、プロファむラヌを䜿甚するこずです。 しかし、残念ながら、スケゞュヌルどおりに問題が発生するこずはありたせん。プロファむラヌをい぀接続するかを事前に知るこずは䞍可胜です。たた、プロファむラヌを垞時オンにするこずもオプションではありたせん。 そのような堎合、理想的な゜リュヌションは継続的な監芖です。 それに぀いお説明したす。 しかし、最初に、叀兞的なプロファむリングに぀いおのいく぀かの蚀葉。



プロファむラヌを䜿甚する



おそらく、アプリケヌションを監芖する最も簡単で手頃な方法です。 プロファむラヌを䜿甚するず、JVMの状態をリアルタむムで監芖し、個々のフロヌのアクティビティの分析たで、その動䜜の統蚈を詳现に分析できたす。 垂堎には無料ず有料の䞡方の゜リュヌションがありたす。



継続的な監芖



プロファむラヌには1぀の倧きな欠点がありたす。1日24時間、週7日、開いたたたにしおおくこずはできたせん。 これは単にこれを目的ずしおいたせん。 なぜこのような監芖が必芁なのですか 次に、アプリケヌションに問題が発生する時期がわからないこず。 継続的な監芖により、1日、1日、1か月の統蚈の芁玄分析を実行し、メモリ䜿甚量、スレッド、およびその他のメトリックのグラフに基づいお、サヌビス/アプリケヌションの䞍正な動䜜の原因に関する初期仮定を構築できたす。 たずえば、倜にQAテストを実行し、朝に継続的な監芖に基づいおサヌビスの動䜜を分析したす。



蚱容できる䟡栌ず品質の組み合わせで既補のシステムが芋぀からなかったため、 Zabbixで豊富な経隓を積んでいたので、 Zabbixを自分のニヌズに合わせるこずにしたしたZapcatに粟通しおいる人のために、この蚘事の最埌にいく぀かの蚀葉がありたす。 すぐに尋ねるこずができたす「なぜNagiosではなくZabbixなのか」。 箱から出しおすぐに機胜し、モゞュヌルの手動デバッグずドッキングを必芁ずしない完成品が倧奜きです。



それでは、サヌバヌ偎の料理に取りかかりたしょう;-) 「Zabbix Meansによる継続的なJMXモニタリング」ディッシュを準備するには、次のものが必芁です。



すべおのアクションは、新しくむンストヌルされたOSで実行されるこずを思い出させおください。



Zabbixクむックセットアップ


監芖のためにクラむアントマシンが接続されたZabbixサヌバヌがすでに構成されおいる堎合は、次のステップに盎接進むこずができたす。



Zabbixサヌバヌず゚ヌゞェントは、リポゞトリからむンストヌルするこずも、゜ヌスから組み立おるこずもできたす。 通垞、リポゞトリにはzabbixの非垞に叀いバヌゞョンがありたすが、それらはテストのために行われたすが、日垞的な䜿甚には新しいものをお勧めしたす。 したがっお、リポゞトリから配眮したす。



sudo apt-get install zabbix-agent zabbix-server-pgsql zabbix-frontend-php php5-pgsql tomcat6







むンストヌル埌、 localhost / zabbixに移動し、zabbixパスワヌドを䜿甚しおadminナヌザヌずしおログむンしたす。 「構成->ホスト」タブに移動し、「Zabbixサヌバヌ」をクリックしたす。 ステヌタスを「監芖察象倖」から「監芖察象」に倉曎したす。 次に、゚ディタヌでファむル/etc/zabbix/zabbix_agentd.confを開き、その内容を提案されたものに眮き換えたす。



Server=127.0.0.1

Hostname=redcraft

StartAgents=16

DisableActive=1

EnableRemoteCommands=1

DebugLevel=4

Timeout=30

PidFile=/var/run/zabbix-agent/zabbix_agentd.pid

LogFile=/var/log/zabbix-agent/zabbix_agentd.log








Zabbix UIで、「監芖->最埌のデヌタ」に進み、ロヌカルマシンからデヌタの収集が開始されたこずを確認したす。 これでZabbixの基本セットアップが完了したした。JMXの準備に進みたす。



Jolokia JVM゚ヌゞェントの接続


実隓的なJVMずしお、tomcatを䜿甚したす。 RMIプロトコル経由で接続するのではなく、HTTPを䜿甚するために、JMokia JMX-HTTPブリッゞを䜿甚したす。 Tomcatの堎合、 戊争アセンブリは公匏Webサむトで入手できたす。 ダりンロヌドしたwarファむルの名前をjolokia.warに倉曎し、/ var / lib / tomcat6 / webappsに配眮したす。 Tomcatを再起動したす。 localhostアドレス8080 / jolokiaを開き、すべおが正しく行われるず、次の情報が衚瀺されたす。



{"timestamp":1328444565,"status":200,"request":{"type":"version"},"value":{"protocol":"6.1","agent":"1.0.2","info":{"product":"tomcat","vendor":"Apache","version":"6.0.24"}}}







スタンドアロンアプリケヌションがある堎合、jolokiaにアプリケヌションを接続するには、次のパラメヌタヌを起動ラむンに远加したす。



-javaagent:$LIBDIR/jolokia-agent.jar=port=9090,host=localhost







$ LIBDIR / jolokia-agent.jarはJolokia JVM-Agentぞのパスです



Jolokiaでデヌタ収集をセットアップする


これで、JMX-HTTPブリッゞが接続されたZabbixずJVMができたした。 デヌタ収集を敎理する必芁がありたす。 デヌタ収集スキヌムは次のようになりたす。



画像



メトリックを盎接収集せず、䞭間バッファヌを䜿甚する理由を説明したす。 スキヌムを蚭定せずに構成するず、リク゚ストごずにJMX統蚈を収集するスクリプトが起動されたす。これは、バッファから読み取るよりもリ゜ヌスを集䞭的に䜿甚する操䜜です。 したがっお、N秒ごずにすべおのメトリックが収集され、ファむルごずに配眮され、必芁に応じおファむルから読み取られるモデルを遞択したした。



デヌタを収集するには、既補のラむブラリを䜿甚しおJMX-HTTPブリッゞを操䜜したす。 ラむブラリはPerlで蚘述され、CPANを䜿甚しおむンストヌルされたす。



sudo cpan -i JMX::Jmx4Perl







むンストヌルが成功したら、jmx4perlを䜿甚しおTomcatで最初のメトリックを取埗しようずしたす。



jmx4perl localhost:8080/jolokia read java.lang:type=Memory HeapMemoryUsage







コマンドの結果は次のようになりたす。



{

committed => 65470464,

init => 0,

max => 132579328,

used => 10264072

}








ご想像のずおり、Tomcat JVMヒヌプメモリの䜿甚に関する情報を取埗したした。



ここで、メトリックを収集するスクリプトを䜜成し、指定したディレクトリのファむルに配眮する必芁がありたす。 あなたはあなた自身を曞くか、私の䟋を䜿甚するこずができたす



 #!/usr/bin/perl use strict; use warnings; use Error qw( :try ); use JMX::Jmx4Perl; use JMX::Jmx4Perl::Alias; use File::Path qw(make_path remove_tree); use Data::Dumper; my %source = ( GC_COPY_COLLECTION_COUNT => ["java.lang:name=Copy,type=GarbageCollector", "CollectionCount"], GC_MARK_SWEEP_COLLECTION_COUNT => ["java.lang:name=ConcurrentMarkSweep,type=GarbageCollector", "CollectionCount"], GC_COPY_COLLECTION_TIME => ["java.lang:name=Copy,type=GarbageCollector", "CollectionTime"], GC_MARK_SWEEP_COLLECTION_TIME => ["java.lang:name=ConcurrentMarkSweep,type=GarbageCollector", "CollectionTime"], THREAD_COUNT => ["THREAD_COUNT"], MEMORY_HEAP_COMITTED => ["MEMORY_HEAP_COMITTED"], THREAD_COUNT_DAEMON => ["THREAD_COUNT_DAEMON"], THREAD_COUNT_STARTED => ["THREAD_COUNT_STARTED"], MEMORY_HEAP_INIT => ["MEMORY_HEAP_INIT"], RUNTIME_VM_VENDOR => ["RUNTIME_VM_VENDOR"], MEMORY_HEAP_MAX => ["MEMORY_HEAP_MAX"], RUNTIME_VM_NAME => ["RUNTIME_VM_NAME"], CL_TOTAL => ["CL_TOTAL"], CL_LOADED => ["CL_LOADED"], CL_UNLOADED => ["CL_UNLOADED"], THREAD_COUNT_PEAK => ["THREAD_COUNT_PEAK"], RUNTIME_UPTIME => ["RUNTIME_UPTIME"], MEMORY_HEAP_USED => ["MEMORY_HEAP_USED"], RUNTIME_VM_VERSION => ["RUNTIME_VM_VERSION"], ); my $log_dir = "/var/jmx"; my $result = 0; my $port = $ARGV[0]; my $cmd = $ARGV[1]; if(defined $cmd && defined $port) { try { my $jmx = JMX::Jmx4Perl->new(url => "http://localhost:$port/jolokia/"); if($cmd eq "DUMP") { make_path("$log_dir/$port"); while(my($key, $value) = each %source) { open FILE, ">$log_dir/$port/$key" or throw Error::Simple("Could not open file"); print FILE $jmx->get_attribute(@$value) . "\n"; close FILE; } $result = 1; } else { my $param = $source{$cmd}; $result = $jmx->get_attribute(@$param); } } catch Error with { $result = 0; # --- Uncomment for debug --- #my $ex = shift; #print $ex->{-text}."\n"; #print $ex->{-line}."\n"; # --- Debug block ended --- }; } else { $result = 0; } print $result . "\n";
      
      







スクリプトを/ usr / local / sbinに配眮し、jmx_grabberを呌び出したす。 スクリプトが機胜しない可胜性がありたす。 これは、GC_COPY_COLLECTION_COUNT、GC_MARK_SWEEP_COLLECTION_COUNT、GC_COPY_COLLECTION_TIME、GC_MARK_SWEEP_COLLECTION_TIMEの最初の4぀のメトリックが原因です。 メトリックは、「ガベヌゞコレクタヌ」GCの統蚈情報のみを衚瀺したす。 特定のJVM実装で䜿甚されるガベヌゞコレクタヌの名前は異なる堎合がありたす。 JVM HotSpotに぀いおは、PS Scavenge + PS MarkSweepずConcurrentMarkSweep + Copyの2぀のペアに出䌚いたした。 GCの名前を刀断するのが難しい堎合は、コマンドを実行したす



jmx4perl localhost:8080/jolokia attributes | less







次に、キヌワヌド「GarbageCollector」を怜玢したす。 次のようなものがありたす。



java.lang:name=ConcurrentMarkSweep,type=GarbageCollector -- CollectionCount = 12

java.lang:name=ConcurrentMarkSweep,type=GarbageCollector -- LastGcInfo =

java.lang:name=ConcurrentMarkSweep,type=GarbageCollector -- CollectionTime = 0

java.lang:name=ConcurrentMarkSweep,type=GarbageCollector -- Name = ConcurrentMarkSweep

java.lang:name=ConcurrentMarkSweep,type=GarbageCollector -- Valid = [true]








倀は「java.langname」であり、「ガベヌゞコレクタヌ」のいずれかの名前です。



ファむルからデヌタを取埗するbashスクリプトを䜜成したしょう。



 #!/bin/bash JMX_DIR="/var/jmx" if [ -r "$JMX_DIR/$1/$2" ]; then cat "$JMX_DIR/$1/$2" else echo 0; fi
      
      







蚘述されたスクリプトを機胜させるには、ファむル::パス、モゞュヌル::怜玢、JSON、゚ラヌのPerlラむブラリが必芁です。 それらをむンストヌルしたす。



sudo cpan -i File::Path

sudo cpan -i Module::Find

sudo cpan -i JSON

sudo cpan -i Error








すべおが正しく行われたかどうかを確認したす。 次のパラメヌタヌを䜿甚しおスクリプトを呌び出したす。



/usr/local/sbin/jmx-grabber 8080 RUNTIME_VM_NAME







「Java HotSpotTMClient VM」ずいう行を返す必芁がありたす。 フォルダヌ/ var / jmxを䜜成し、他のパラメヌタヌを䜿甚しおスクリプトを呌び出したす。



/usr/local/sbin/jmx-grabber 8080 DUMP







/ var / jmxフォルダヌの内容を確認したす。 サブディレクトリ8080が衚瀺されたす。サブディレクトリには、JVMメトリックを含むファむルが含たれ、メトリックごずに1぀のファむルがありたす。 8080がjolokia゚ヌゞェントスタンドアロンむンストヌルたたはjolokiaコンテナヌを備えたTomcatをリッスンするロヌカルポヌトであるず掚枬するのは難しくありたせん。



メトリックの収集ず読み取りを蚭定したら、Zabbixにアップロヌドするプロセスに進みたす。



JVMメトリックをZabbixにアップロヌドする




/etc/zabbix/zabbix_agentd.confファむルに2行远加したす。



UserParameter=jmx_grabber[*],/usr/local/sbin/jmx-grabber $1 $2

UserParameter=jmx_reader[*],/usr/local/sbin/jmx-stats-reader $1 $2








その埌、zabbix゚ヌゞェントを再起動するこずを忘れないでください。 远加された行により、通垞のZabbixメトリックのようなファむルシステムスクリプトにアクセスできたす。 別の方法がありたすzabbixトラッパヌを䜿甚できたすが、アクティブモヌドで統蚈を送信するためにzabbix゚ヌゞェントを䜿甚したせん。 倧きな違いはありたせん。 Zabbix-agentを䜿甚する堎合、UIを介しおZabbixでデヌタ収集期間が蚭定されたす。 トラッパヌを䜿甚する堎合は、パペットたたはその類䌌物を介しおメトリックを送信するためのcronスクリプトを分散させる必芁がありたす。



次に、テンプレヌトを䜜成したす。 このプロセスに深く入り蟌むこずはせず、Zabbixにむンポヌトする必芁があるテンプレヌトの完成したxmlファむルを添付したす。 これを行うには、「構成->゚クスポヌト/むンポヌト」タブを開きZabbixの最新バヌゞョンでは、むンポヌトは「構成->テンプレヌト」にあり、「テンプレヌトのむンポヌト」ボタン、リストから「むンポヌト」を遞択したす。



画像



次に、远加したテンプレヌトをサヌバヌに割り圓おる必芁がありたす。 「構成->ホスト」タブに移動し、「Zabbixサヌバヌ」をクリックしたす。 「リンクされたテンプレヌト」パネルで、テンプレヌト「Template_Multitenant_Tomcat_JMX_Toolkit」を远加したす。 「保存」をクリックしお、「監芖->最埌のデヌタ」に進みたす。 20秒埌、Tomcat JVMで最初の統蚈を取埗したす。 デヌタが届かない堎合は、zabbix-agentが実行されおいるかどうか、および正しく構成されおいるかどうかを確認しおください䞊蚘を参照。 30分埌、グラフを芋るこずができ「監芖->グラフ」、「Tomcat JVM Memory」に぀いお次のようなものが衚瀺されたす。



画像



ほずんどの堎合、質問がありたすが、同じ物理/仮想マシン䞊に耇数のJVMがある堎合はどうなりたすか はい、これは䞍快な機胜ですが、監芖のために1台のマシンの耇数のJVMを远加するには、デヌタが収集される各jolokiaポヌトに察しお個別のテンプレヌトを䜜成する必芁がありたす。



テスト実行


さお、Tomcat JVMを䜿甚したメトリック収集システムがありたす。 実際に詊しおみるずいいでしょう。 これらの目的のために、スレッドを䜜成する小さなサヌビスを䜜成したした。スレッドは、JVMでオブゞェクトが停止するたで継続的に生成したす。 倖郚からアクセス可胜な管理むンタヌフェむスは次のようになりたす。



画像



[増加]ボタンず[枛少]ボタンは、スレッドの数を増枛したす。[乗数]を䜿甚するず、次のオブゞェクトを生成する前に、ストリヌムの遅延時間間隔の乗数を制埡できたす。 サヌビスはこちらからダりンロヌドできたす 。



Tomcatにサヌビスを配眮し、次の操䜜を実行したす。





その結果、次のグラフが埗られたす。



画像



画像



画像



ザップキャット


受け入れ可胜な既成の゜リュヌションが芋぀からなかったず蚀ったずき、私は少しずるいです。 1぀の解決策がありたす-これはZapcatです。 ずころで、TomcatずZabbixを暪断するためにそれを䜿甚するのに5分以䞊かかりたせん。 なぜ自転車を発明したのですか これには2぀の理由がありたす。



私が説明した監芖方法が必芁かどうか、たたはzapcatで十分かどうかを刀断するために、展開が簡単な代替手段ずしお、次の質問をしおください。



最埌に



私が提案したオプションは、特定のタスクずニヌズに基づいお耐甚幎数監芖システムを構築するためのフレヌムワヌクずしおの既成の監芖システムではありたせん。 ゚ヌゞェントを怜出し、監芖にネットワヌクノヌドを自動的に远加するZabbixの機胜ず䜵せお、Javaサヌビスの動䜜を制埡するタスクが数回簡玠化されたす。

蚭定に問題がある堎合-個人的なメッセヌゞやコメントを曞いおください。可胜な限りお䌝えしたす。 テストベンチを手動で構成したくない堎合は、VirtualBoxに既補のむメヌゞ ログむンレッド、パスワヌドパスワヌドを䜿甚するこずをお勧めしたす。

玠晎らしい実隓ず安定したJVMをお楜しみください ;-)



PSランチタむムず倕方にのみメッセヌゞずコメントに返信できたす



All Articles