web-dev-qa-db-ja.com

WindowsベースのJVMのメモリ使用量を監視し、高すぎる場合にアラートをトリガーするにはどうすればよいですか?

私はWindows 2008でJVMとして実行するアプリを持っています。メモリ使用量を監視し、メモリ使用量が特定のしきい値に達した場合にメールを送信します。これを行うための無料のユーティリティまたは方法はありますか?

5
Mike B

Win2008 OSは、パフォーマンスカウンターのしきい値条件のアラートを送信できます。

Part 1 # Perfmon
Launch Performance Monitor (perfmon.msc)
Create a new User Defined Data Collector Set
Choose to create manually after naming
Select Performance Counter Alert
Click Add - choose the Object, Counter and Instance to monitor. Process/Java.exe/Working Set
Specify the alert threshold
Choose "open properties for this data collector set"
Specify a start schedule if the server is on a reboot schedule
Change the sample interval. Alert repeats at this interval when value it above threshold
Under Alert task, give it a name (like sendMail)
Start the Data Collector Set

Part 2 # Schedule Tasks
Open up scheduled tasks (compmgmt.msc/configuration/task scheduler)
Create a task, not a basic task
Name it the exact same name you did in the above section (like sendMail)
Check "user is logged in or not" so that it runs all the time. Change username if necessary.
Create a new email action under the Action tab
Enter all the info for from, to, subject, etc.
Enter the SMTP server.
You will be Prompt for the password to run the task when you are not logged on.
4
Clayton

実際、JVMメモリー境界は-Xmx2048m -Xms256m -XX:MaxPermSize=512m(例)のような起動パラメーターによって制御されます。 JVMは許可されたメモリを使用します。リークのない安定したアプリケーションは、その境界を超えません。

監視に戻ると、JVM内部SNMPエージェントをオンにして、ヒープとPermGenのメモリ使用量を監視し、プライベートSNMPコミュニティを介して、超過したJVMがSNMPトラップを送信する場合のしきい値を設定できます。実際、これはHP OpenViewなどのツールによる「エンタープライズモニタリングソリューション」です。関連するコマンドラインパラメータ:

-Dcom.Sun.management.snmp.port=10001 -Dcom.Sun.management.snmp.acl=/home/liferay/snmp.acl -Dcom.Sun.management.snmp.interface=0.0.0.0

それらは自明です。 ACLファイルテンプレートはJRE_HOME/lib/management/snmp.acl.templateにあります。 SNMP OIDだけでなく、読み取り可能な回答を取得するには、 JVM-MANAGEMENT-MIB.mib をダウンロードしてください。簡単な説明は ここではOracleサイト です。 SNMPが有効な場合、次のコマンドを実行して、返されたゲージを確認できます。

snmpwalk -v2c -c public YourWinHost:10001 -m JVM-MANAGEMENT-MIB jvmMgtMIB

すでにJVM-MANAGEMENT-MIB.mibをデフォルトのNet-SNMP MIBディレクトリ(UnixまたはCygWinコマンドライン)に配置していると想定しています。

メール送信を忘れないように、私は Zabbix でJVMモニタリングを、Post Officeの全国規模のバックエンドクラスターを実行しているクラスターでSNMPと組み合わせて行っています。すべてのランタイム監視要件をカバーしています。 Zabbixは、トリガーが発生した場合にメールまたはJabber IMメッセージを送信できます。 ZabbixはSNMPエージェントの監視とSNMPトラップもサポートしています。監視されているJVMが米国のどこかとアイルランドのZabbixサーバーであったとき、私はクラウドでサービスの月間テストを実行しました...それはそのような距離/遅延でもうまく機能しました。バージョン2.0以降ではJMXモニタリングが可能ですが、安全な環境では複雑になる可能性があるため、JMX-RMIで一部のポートをランダムにセットアップします。

一般に、SNMPはJVMランタイムの監視に十分であり、JMXは開発/テストマシンを支援し、アプリケーションのニュアンスを監視できます。

Windowsマシンでクラウドを使用している場合は、SaaS監視サービスのいずれかを使用できます。 NewRelic サービスにかなり感銘を受けました。セットアップが簡単で、本当に開発/テストフェーズに役立ちます。原因は、スレッドダンプ、遅いSQLクエリなどを実行できます。しきい値に達したときにメールを送信できます。

4
nudzo

Windows 2012 Serverで「電子メールの送信」タスクタイプが廃止されたため、電子メールを送信するスクリプトが必要になります。たとえば、VBScript:

Set Msg = CreateObject("CDO.Message")

With Msg

 .To = "[email protected]"
 .From = "[email protected]"
 .Subject = "low memory"
 .TextBody = "low memory, check the server now"
 .Send
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/sendusing") = 2 
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserver") = "mail.yourserver.com"
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserverport") = 25
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpusessl") = False
 .Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/sendusername") = "smtp-user"
 .Configuration.Fields.Item ("http://schemas.Microsoft.com/cdo/configuration/sendpassword") = "smtp-password"

End With

他の手順はほとんど同じです。詳細については、これを参照してください ブログ投稿

2
jitbit

JMXを使用して監視を設定できます。

これはTomcatで実行されているサーバーアプリですか、それともJEEアプリケーションサーバーですか?または、これはコマンドラインですかJava application?or Windows Service Wrapped Java app?What JVM?What settings?Oracle JDK Rockit has a great memory monitor、 Oracle JRockit Mission Control 4.1または http://visualvm.Java.net/index.html

アプリ内で、メモリをチェックするためにスリープして目覚めるスレッドを作成できます。

これらの投稿を参照してください: https://stackoverflow.com/questions/1058991/how-to-monitor-Java-memory-usage または https://stackoverflow.com/questions/74674/how-to-do-i-check-cpu-and-memory-usage-in-Java

1
Tim Spann

JMXを実行できますが、表示されません。ガベージコレクター。ログファイルを監視することもできます。メモリ不足時にJavaを再起動するユーティリティはありません。しかし、Javaだけでコーディングしてサーバーとして実行するのは簡単です。サーバーで実行すると、アプリが正常に実行されているかどうか、および自分で発明する必要があるビジネスロジックをチェックします。 if(TotalCPUTime > 1d) restartJava();

とにかく、JMX経由でリモートでJavaを再起動するには、サーバーにアクセスする必要があるため、これら2つを同時に実行するユーティリティはありません-実際に実行、監視、再起動、監視するためにJava 処理する。このJavaを別のJavaでも実行できるため、監視と再起動を同時に実行し、小さなJava.exeを実行して実行します。

1
Andrew Smith