Frage Wie kann ich die Speicherauslastung für eine Windows-basierte JVM überwachen und eine Warnung auslösen, wenn sie zu hoch wird?


Ich habe eine App, die unter Windows 2008 als JVM ausgeführt wird. Ich möchte die Speicherbelegung überwachen und eine E-Mail senden, wenn die Speicherbelegung einen bestimmten Schwellenwert erreicht. Gibt es ein kostenloses Dienstprogramm oder eine Methode, um dies zu tun?


5
2017-07-03 17:48


Ursprung


Können Sie die maximalen JVM-Speicherparameter nicht unterhalb der Schwelle einstellen, die für das System "exzessiv" wäre? - Mat
@Mat Yup. Aber ich bin auf der Suche nach einer Möglichkeit, benachrichtigt zu werden, wenn sich die Speicherbelegung dem maximalen JVM-Speicherwert nähert, den ich eingestellt habe. - Mike B
Wie würden Sie reagieren, wenn Sie eine solche Warnung erhalten, wie wäre es umsetzbar? Oder wäre es eher zum Nachverfolgen / Sehen, wie schnell das Ding seine Zuteilung verbraucht? (Nur neugierig, Entschuldigung für den Lärm.) - Mat
@Mat genau. Es wäre eine zusätzliche vorbeugende Sicherheitsmaßnahme, um mich zu warnen, wenn eine JVM mehr Speicher verwendet, als ich normalerweise erwarten würde (aber immer noch unter dem JVM-Maximalwert, den ich eingestellt habe). - Mike B


Antworten:


Das Betriebssystem Win2008 kann Warnungen für Schwellenwerte für den Leistungsindikator senden.

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
2017-07-18 20:20



Dies ist definitiv möglich, aber ich möchte hier darauf hinweisen, dass das Einrichten von Leistungsindikator-Alarmen / Triggern etwas grob ist, da es einen Alarm auslöst, sobald dieser Schwellenwert erreicht wird, auch wenn es nur für 10 Sekunden erfüllt wurde. Dies kann für Counter, die sich nicht häufig ändern (z. B. Speichernutzung), etwas gut funktionieren, aber für volatilere Counter wie CPU-Auslastung nicht sehr gut funktionieren. Überwachungslösungen wie EventSentry sind ein wenig intelligenter und ermöglichen es Ihnen, den Zeitraum zu konfigurieren, über den der Schwellenwert einen Grenzwert überschreiten muss, bevor er eine Warnung auslöst. Dies hilft, falsche Positive zu reduzieren. - Lucky Luke


Tatsächlich werden JVM-Speichergrenzen durch Startparameter wie z -Xmx2048m -Xms256m -XX:MaxPermSize=512m (Es ist ein Beispiel). JVM wird diesen erlaubten Speicher benutzen. Stabile, nicht leckende Anwendungen werden diese Grenzen nicht überschreiten.

Zurück zur Überwachung ist es möglich, den JVM-internen SNMP-Agenten zu aktivieren und dann die Speicherauslastung von Heaps und PermGen zu überwachen und über die private SNMP-Community können Schwellenwerte eingerichtet werden, wenn JVM SNMP-Traps sendet. In der Tat ist es "Enterprise-Lösung des Monitorings" von Tools wie HP OpenView. Cmdline-Parameter beteiligt:

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

Sie sind selbsterklärend. ACL-Dateivorlage ist um JRE_HOME/lib/management/snmp.acl.template. Um nicht nur SNMP-OIDs lesbar zu bekommen, laden Sie diese herunter JVM-MANAGEMENT-MIB.mib. Eine kurze Erklärung ist hier auf Oracle Website. Wenn SNMP aktiviert ist, können Sie die zurückgegebenen Messgeräte überprüfen, indem Sie Folgendes ausführen:

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

Es erwarten Sie schon JVM-MANAGEMENT-MIB.mib Standard-Net-SNMP-MIB-Verzeichnis (Unix- oder CygWin-Kommandozeile).

Nicht zu vergessen Mailversand, ich mache JVM-Überwachung von Zabbix in Verbindung mit SNMP auf dem Cluster, der den landesweiten Backend-Cluster von Post Office ausführt. Es deckt alle Anforderungen an die Laufzeitüberwachung ab. Zabbix kann Ihnen E-Mails oder Jabber IM-Nachrichten senden, wenn ein Auslöser ausgelöst wird. Zabbix unterstützt auch SNMP-Agentenüberwachung und SNMP-Traps. Ich habe Monatstest der Dienste in der Wolke durchgeführt, als JVM irgendwo in USA und Zabbix Server in Irland überwacht wurde ... es hat sogar für solche Entfernungen / Verzögerungen gut gearbeitet. Seit der Version 2.0 ist JMX-Überwachung möglich, aber für sichere Umgebungen könnte es kompliziert sein, weil JMX-RMI einige Ports zufällig eingerichtet hat.

Im Allgemeinen reicht SNMP für die JVM-Laufzeitüberwachung aus, und JMX kann mehr auf Entwicklungs- / Testmaschinen helfen, da es Anwendungsnuancen überwachen kann.

Wenn Sie sich mit Ihrem Windows-Computer in der Cloud befinden, können Sie einen der SaaS-Überwachungsdienste verwenden. Ich war ziemlich beeindruckt von NewRelic Dienstleistungen. Es ist einfach einzurichten und wirklich hilfreich für Entwicklungs- / Testphasen, da es Dinge wie Thread-Dumps, langsame SQL-Abfragen a.s.o. Es kann E-Mails senden, wenn der Schwellenwert erreicht ist.


4
2017-07-15 21:03





Da Windows 2012 Server den Task-Typ "E-Mail senden" nicht mehr unterstützt, benötigen Sie jetzt ein Skript, das eine E-Mail sendet. Zum Beispiel ein VBScript:

Set Msg = CreateObject("CDO.Message")

With Msg

 .To = "MySelf@gmail.com"
 .From = "from@address.com"
 .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

Die anderen Schritte sind ziemlich gleich. Siehe hierzu Blogeintrag Für mehr Information


2
2018-04-25 21:56





Sie können die Überwachung mit JMX einrichten.

Ist dies eine Server-App, die auf Tomcat oder einem JEE-Anwendungsserver ausgeführt wird? oder ist das eine Befehlszeilen-Java-Anwendung? oder eine Windows Service Wrapped Java App? Welche JVM? Welche Einstellungen? Oracle JDK Rockit hat einen großartigen Speichermonitor, Oracle JRockit Mission Control 4.1 oder http://visualvm.java.net/index.html.

Du könntest einen Thread in deiner App schreiben, der schläft und erwacht, um den Speicher zu überprüfen.

Sieh diese Beiträge: https://stackoverflow.com/questions/1058991/how-to-monitor-java-memory-usage oder https://stackoverflow.com/questions/74674/how-to-do-i-check-cpu-and-memory-usage-in-java 


1
2017-07-13 20:05





Sie können JMX ausführen, aber z. Müllsammler. Sie können auch die Protokolldatei überwachen. Es gibt kein Dienstprogramm, um Java neu zu starten, wenn nicht genügend Arbeitsspeicher zur Verfügung steht. Aber es ist einfach, nur in Java zu programmieren und als Server zu laufen, der nach den Apps sucht, wenn sie OK haben, und die Geschäftslogik, die Sie selbst erfinden müssen, z. if(TotalCPUTime > 1d) restartJava();

Wie auch immer, um Java remote über JMX neu zu starten, benötigt man Zugriff auf den Server, also gibt es kein Dienstprogramm, um diese beiden gleichzeitig auszuführen, um den Java-Prozess tatsächlich auszuführen, anzusehen, neu zu starten und zu überwachen. Sie können dieses Java auch auf einem anderen Java ausführen, so dass es gleichzeitig überwacht und neu startet und eine kleine java.exe ausführt, um es zu tun.


1
2017-07-15 18:48