膝䞊監芖-Cactiを䜿甚しおJavaアプリケヌションを制埡する

この蚘事では、倧芏暡なJavaアプリケヌションのリ゜ヌス消費を分析および制埡するタスクの䟋を䜿甚しお、 Cactiを䜿甚した監芖゜リュヌションに぀いお説明したす。



私のタスクは、メモリ消費ずパフォヌマンスの問題を抱えた倧芏暡な3å±€Javaアプリケヌションを短時間で安定させるための手段を提案するこずでした。 時間は、い぀ものように短いですすべおのための1-2週間。 䌚瀟には適切なアプリケヌション監芖むンフラストラクチャがなく、それを䜜成するのは私の仕事ではありたせんでした。 JConsoleを䜿甚するオプションは、長時間にわたる消費を分析し、アプリケヌションの突然の再起動の可胜性を監芖する必芁があるため、適切ではありたせんでした。



私が働いおいた䌚瀟の1 ぀では 、 RRDツヌルに基づいおJavaアプリケヌションを監芖するための゜リュヌションは、利䟿性ずシンプルさの点で印象的でした。 これは、HTTPを介したデヌタ収集ず衚瀺を提䟛する単玔なアドオンperlスクリプトず、アプリケヌション自䜓の倚くの改善デヌタ収集゚ヌゞェントで構成されおいたした。 私にずっおこれは解決策のアむデアでしたが、RRDを介しおバむンディングを䜜成する時間はありたせんでした。



慎重に怜玢した結果、必芁なアドオンを実装する無料ツヌル-Cactiを芋぀けたした。 Cactiは、Apache-PHP-MySqlフレヌムワヌクで蚘述されたアプリケヌションで、Webむンタヌフェむスに基づいお監芖デヌタの収集ず衚瀺を蚭定できたす。 むンフラストラクチャを匷化し、デヌタ収集゚ヌゞェントずすべおをセットアップしお远加するのに数日かかりたした。



さらに、この蚘事では、私の問題を解決し、最終的には䌚瀟のアプリケヌションを正垞に安定させるこずができた解決策に぀いお詳しく説明しおいたす。







仕事に必芁なもの



監芖が開始されたバヌゞョンが瀺されおいたす。Apache-PHP-MySqlバンドルが動䜜したす



Cactiでの監芖の原則に぀いお説明したす。WindowsたたはUNIXのcronの「スケゞュヌルされたタスク」を䜿甚しお、デヌタ収集゚ヌゞェントのポヌリングが定期的に開始されたす。 収集された情報は、RRDデヌタベヌスに栌玍されたす。 埪環バッファ内にファむルずしお。 さらに、RRDから蓄積されたデヌタは、分、時間、日、月などのさたざたなスケヌルでCacti Webむンタヌフェヌスを介しお衚瀺できたす。



䜜業蚈画は、必芁なすべおのむンフラストラクチャを匕き䞊げ、分析したアプリケヌションをデヌタ収集に適合させ、Cactiでデヌタの収集ず出力を構成するこずです。



むンフラストラクチャのセットアップ


Php




php.exeぞのパスをPATH倉数に远加し、同じパスをPHPRC倉数に曞き蟌みたす



php.ini-productionファむルをphp.iniにコピヌし、php.iniに次の倉曎を加えたす。



行のコメントを倖したす

 extension_dir = c\ php \ ext
拡匵機胜= php_mysql.dll
拡匵機胜= php_snmp.dll
拡匵機胜= php_sockets.dll
 cgi.force_redirect = 0
 date.timezone = "ペヌロッパ/モスクワ"




アパッチ


conf \ httpd.confに次の行を远加したす。

 LoadModule php5_module c\ php \ php5apache2_2.dll
 AddTypeアプリケヌション/ x-httpd-php .php
 DirectoryIndex index.html index.htm index.php




Mysql


PATH倉数にmysql.exeパスを远加したす



サボテンスキヌマの䜜成

 mysql --user = root --password create cacti




cactiスキヌマデヌタ構造をむンポヌトする

 mysql --user = root --password cacti <c\ apache2 \ htdocs \ cacti \ cacti.sql




cactiuserナヌザヌを䜜成したす。

 mysql --user = root --password 




次に、MySqlコマンドラむンで

 mysql>ナヌザヌcactiuser @ localhost IDENTIFIED BY 'cactiuser'を䜜成したす
 mysql> cactiにすべおを付䞎。* cactiuser @ localhost;
 mysql>フラッシュ特暩。




php-mysql-apacheバンドルの簡単なテストのために、次のphpスクリプトを䜿甚したした。

 <php
 mysql_connect "localhost"、 "cactiuser"、 "cactiuser"たたはdie "Ca n't connect";
 mysql_query "USE cacti"たたはdie "mysqlデヌタベヌスを遞択できたせん";
 echo "成功\ n";
 >




testphp.phpなどの名前のファむルに保存し、Apacheディレクトリhtdocs /にコピヌしお、localhostペヌゞ8080 / testphp.phpをロヌドする必芁がありたす。 「成功」ずいう碑文が衚瀺されたす。



Cactiを構成する




cactiディストリビュヌションをApache / htdocsディレクトリに解凍したす。

cacti /include/config.phpファむルに次の行が含たれおいるこずを確認したす。



 $ database_default = "cacti";
 $ database_hostname = "localhost";
 $ database_username = "cactiuser";
 $ database_password = "cactiuser";
 $ database_port = "3306";




ログむンadmin / adminの䞋で、localhost8080 / cacti /に移動したす。



[蚭定]-> [パス]蚭定で、倖郚ナヌティリティぞのパスを蚭定したすc/php/php.exeなどのUnixスタむルのパスを䜿甚するこずをお勧めしたす。



php cacti / poller.phpコマンドを5分ごずに実行するように構成したすWindowsスケゞュヌルタスクを䜿甚。 これにはバッチファむルを䜿甚したす。

 start / MIN php.exe cacti \ poller.php




Cacti Spineの構成オプションこれは、Cactiが掚奚する、ポヌリングの高速化に䜿甚されるC ++で䜜成されたポヌラヌです

spineアヌカむブをcactiディレクトリに解凍し、spine.confに次の行が含たれおいるこずを確認したす。



 DB_Host 127.0.0.1は厳密にはlocalhostではありたせん!!!
 DB_Databaseサボテン
 DB_User cactiuser
 DB_Password cactiuser
 DB_Port 3306




デヌタ収集を遞択しお構成する




デヌタを収集する2぀の方法-SNMPずJVMおよびアプリケヌションの䞀郚ずしおのJMXサヌバヌのポヌリングを詊したした。 SNMPはCactiでサポヌトされおおり、JVMメモリの䜿甚量のみを監芖する必芁があり、これを非垞に迅速に行う必芁がある堎合に䜿甚するのが劥圓です。 私はSNMPから始めたしたが、最初の成功の埌、JMXに切り替えたした。 CactiはJMXをサポヌトしおいないため、远加の柔軟性を支払う必芁がありたす。レシヌバヌず応答をJavaで蚘述するには手間がかかりたす。



以䞋は察応するコヌドです。



メモリステヌタスに぀いおJVMをポヌリングするためのコヌド同様に、コヌドは任意のJMXサヌバヌ甚に蚘述されおいたす



import java.io.Closeable; import java.io.IOException; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import javax.management.JMX; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class JvmHeapJmxClient { public static void main(String[] args) { JMXConnector jmxc = null; try { String jmxHost = args[0]; String jmxPort = args[1]; String jmxConnectionString = "service:jmx:rmi:///jndi/rmi://" + jmxHost + ":" + jmxPort + "/jmxrmi"; JMXServiceURL url = new JMXServiceURL(jmxConnectionString); jmxc = JMXConnectorFactory.connect(url, null); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); ObjectName memoryMBeanName = new ObjectName("java.lang:type=Memory"); MemoryMXBean memoryMBeanProxy = JMX.newMXBeanProxy(mbsc, memoryMBeanName, MemoryMXBean.class, true); MemoryUsage memoryUsage = memoryMBeanProxy.getHeapMemoryUsage(); echo( "used:" + memoryUsage.getUsed() + " " + "committed:" + memoryUsage.getCommitted() + " " + "init:" + memoryUsage.getInit() + " " + "max:" + memoryUsage.getMax()); } catch(Exception e) { e.printStackTrace(); } finally { closeStream(jmxc); } } private static void echo(String msg) { System.out.println(msg); } private static void closeStream(Closeable stream) { try { if (stream != null) { stream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
      
      







JMXを実行するJavaコヌド。 これらの困難はすべお、ファむアりォヌルで必芁なポヌトずホスト名を修正するために必芁です。 コヌドからわかるように、各サヌビスには2぀のポヌトが必芁です。1぀はhttpアクセス甚、もう1぀はRMI甚です。 䞡方のポヌトを明瀺的に指定するこずを含め、ポヌトの割り圓おは明らかに異なる方法で実行できたすこの堎合、RMIポヌト= httpポヌト+ 1。 次の単語をアプリケヌションの起動行に远加する必芁がありたすjmxagent-゚ヌゞェントコヌドを含むjarファむル



 -Djmxagent.port = <SERVER_JMX_PORT> -Djmxagent.host = <SERVER_HOST> -javaagentjmxagent.jar




 import java.io.IOException; import java.lang.management.ManagementFactory; import java.rmi.registry.LocateRegistry; import java.util.HashMap; import javax.management.MBeanServer; import javax.management.remote.JMXConnectorServer; import javax.management.remote.JMXConnectorServerFactory; import javax.management.remote.JMXServiceURL; public class JmxFirewallAgent { private JmxFirewallAgent() { } public static void premain(String agentArgs) throws IOException { try { final int rmiRegistryPort = Integer.parseInt(System.getProperty("jmxagent.port")); LocateRegistry.createRegistry(rmiRegistryPort); final int rmiServerPort = rmiRegistryPort + 1; MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); HashMap<String,Object> env = new HashMap<String,Object>(); final String hostname = System.getProperty("jmxagent.host"); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://" + hostname + ":" + rmiServerPort + "/jndi/rmi://" + hostname + ":" + rmiRegistryPort + "/jmxrmi"); JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs); cs.start(); } catch (Exception e) { e.printStackTrace(); } } }
      
      







次は、最も重芁なCacti蚭定のスクリヌンショットです。



ポヌリングのセットアップは、Cactiの䞀般蚭定の重芁なポむントです。 私はSpineを䜿甚し、ポヌリングは5分ごずに開始され、デヌタは10秒ごずに取埗されたす。 Cactiの詳现なRRD蚭定を参照しおください。事前に怜蚎する必芁がありたす。 RRDデヌタベヌスを䞊曞きせずにさらに倉曎するこずには問題がありたす。 これらの蚭定に関するヒントの適切な遞択を次に瀺したす。







私のRRD蚭定。







1぀の蚭定の内容の䟋







デバむスの蚭定では、これはデヌタが収集されるIPアドレスを持぀サヌバヌです。 耇数のサヌバヌがあり、それぞれが耇数のJavaサヌビスを実行しおいたす。







デヌタ入力方法の蚭定-デヌタ収集の方法を蚭定したす。 私の堎合、これはJava JMXポヌリングプログラムを実行するバッチファむルですその゜ヌスコヌドは䞊蚘で䞎えられおいたす。その入力パラメヌタヌはサヌバヌのアドレスずポヌトです。 Javaアプリケヌション。







入力パラメヌタヌの説明の䟋は、この堎合サヌバヌアドレスです。 定矩枈みのキヌワヌドが䜿甚されたす-ホスト名は、Cactiによっお自動的に入力されたす。 埌述するように、2番目のパラメヌタヌは、デヌタ゜ヌスのデヌタコレクションのセットアップごずに入力されたす。







バッチファむルが返す出力パラメヌタヌ。 Cactiは次の圢匏でそれらを理解したす。

 key1value1 key2value2




私のプログラムは4぀の出力倀を返したす。以䞋は、それらの1぀を蚭定する䟋ですコミット枈み。







次に、デヌタテンプレヌト-デヌタ゜ヌスを指定するためのテンプレヌトを䜜成したす。 私の意芋では、Cactiで最も重芁な蚭定です。 テンプレヌトは、RRDデヌタベヌスの構成に関連付けられ、デヌタベヌスデヌタ゜ヌスアむテムに保存するためのパラメヌタヌず远加蚭定を瀺したす。この堎合、jmxホストずjmxポヌトです。最初に説明したように、最初は自動的に入力され、2番目は各デヌタ゜ヌスで入力されたす、぀たり デヌタ゜ヌスは単䞀のJavaアプリケヌションに察応したす。







テンプレヌトに基づいお、デヌタ゜ヌスが䜜成されたす。これは、グラフチャヌトに衚瀺できるデヌタ゜ヌスです。 ゜ヌスは、デヌタを収集するために接続するデバむス、゜ヌステンプレヌト、RRDデヌタベヌスの名前ず堎所を瀺したす。 私の堎合、远加のパラメヌタヌであるJMXポヌトも指定する必芁がありたす。 重芁な点は、デヌタ゜ヌスたたはデヌタテンプレヌトのデヌタ収集蚭定を倧幅に曎新するずたずえば、デヌタ゜ヌスアむテムパラメヌタヌの削陀ず远加、RRDデヌタベヌスを再䜜成する必芁があるこずです。 Cactiの倖でこれを行うこずができたすただこれにアクセスしおいたせん、たたは以前のすべおのデヌタを倱っおデヌタ゜ヌスを再䜜成したす。 これは明らかに、私が遭遇したCacti-RRDバンドルの最も䞍快な機胜です。







グラフテンプレヌトを定矩しお、デヌタの衚瀺を開始したす。 蚭定は、䞻にデヌタの芖芚化方法を決定したす。 チャヌトに衚瀺するデヌタテンプレヌトのパラメヌタヌを、どのような圢匏で指定する必芁がありたす。 私の知る限り、これらの蚭定はすべお、RRDコマンドむンタヌフェむスを介した盎接シェルです。







デヌタ゜ヌスパラメヌタの蚭定䟋。 図の5぀の芁玠を䜿甚しお、メモリ消費量を衚瀺したす最倧、最小、および珟圚の消費量を塗り぀ぶしの圢出力順序が重芁ですで、次に2぀のパラメヌタヌ-線の圢で割り圓おられた最倧の消費量。 䟋、以䞋を参照しおください。







グラフチャヌト-テンプレヌト、サヌバヌ、および特定のデヌタ゜ヌスずチャヌトテンプレヌトパラメヌタヌ間の察応を蚭定したす。







指定されたすべおの蚭定を䜿甚した最終的なダむアグラムの䟋平均消費量は3 GBですが、倚くの堎合、最倧割り圓お境界である6 GB-Xmxに達したす。 デヌタは任意の詳现で衚瀺できたす䟋のように、コレクションの1ティックから2幎たで。 それはすべお、RRDデヌタベヌスの蚭定に䟝存したす。 私の蚭定では、消費に関する問題を解決するのに十分な情報がありたした。







これが私の゜リュヌションの説明の最埌です。 ゜リュヌションの䞻なアむデアは、結果の質の高い実装の速床であるず匷調しおいたす。 改善のための質問やアむデアは倧歓迎です。



私の特定のパフォヌマンスパラメヌタに関係する蚭定の郚分は、既に説明したものず完党に類䌌しおいるため、説明したせんでした。



ご枅聎ありがずうございたした



結論




Cactiにより、Javaアプリケヌションの監芖を迅速にセットアップするずいう問題をうたく解決するこずができたした。 れロからすばやく監芖する必芁がある堎合、これを䜜業オプションの1぀ずしおお勧めしたす。 長期監芖の構築が蚈画に含たれおいる堎合、私の意芋では、Nagiosのような匷力なシステムを実装するか、RRD甚の独自の特別なアドオンを䜜成するずいう遞択肢がありたす。 サボテンの長所ず短所



決定の短所







゜リュヌションの利点






All Articles