2013-10-02 6 views
5

Ich richte JMX auf einem der Dienste auf Amazon EC2-Instanz, aber es funktioniert nicht richtig. Ich verwende VisualVM, um eine Verbindung herzustellen, und nach kurzer Zeit schlägt es mit Timeout fehl. Sieht so aus, als ob es aufgrund fehlender Antwortdaten oder Verzögerungen fehlschlägt. Ich habe überprüft, dass der JMX-Port in der Sicherheitsgruppe aktiviert ist und auch mit einem anderen Port ohne aktiviertem JMX und auch mit nicht aktiviertem Port in den Einstellungen der Sicherheitsgruppe versucht. Beides schlägt sofort fehl und sieht daher anders aus. In meiner EC2-Instanz und auf meinem Desktop sind sowohl Ubuntu 12.04 als auch JDK 7 installiert.Warum schlägt die JMX-Verbindung zu Amazon EC2 fehl?

Es stellt sich heraus, dass Ports keinen Sinn ergeben, da die Verbindung SSL-gesichert ist. Ich habe einen privaten Schlüssel und habe keine Ahnung, wie man ihn mit JConsole oder VisualVM benutzt.

+0

mögliche Duplikate von [So stellen Sie eine Verbindung zu Java-Instanzen her, die auf EC2 mit JMX ausgeführt werden] (http://stackoverflow.com/questions/13734646/how-to-connect-to-java-instances-running-on-ec2- using-jmx) – Gray

Antwort

3

Das funktioniert für mich. Stellen Sie die JMX-Optionen auf dem Server:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=<some port> 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=localhost 

einen SSH-Tunnel Aufmachen:

ssh -i /path/to/key -D <some port> [email protected]_dns_address 

starten VisualVM:

jvisualvm -J-Dnetbeans.system_socks_proxy=localhost:<some port> -J-Djava.net.useSystemProxies=true 

eine Remote-Verbindung zum Server hinzufügen. Fügen Sie eine JMX-Verbindung mit dem von Ihnen für JMX angegebenen Port hinzu.

Um klar zu sein, sollte in allen drei oben genannten Fällen der gleiche Port sein.

+0

Ich habe es nicht versucht, aber soweit ich verstehe, verwendet es ssh als lokalen Proxy. Ich habe 8 verschiedene EC2-Instanzen und das bedeutet, dass ich 8 verschiedene VisualVMs ausführen muss? –

+1

Das ist richtig. Was ich in dieser Situation getan habe, ist ein VisualVM zu öffnen, um die Details über die MBeans zu erhalten, die ich betrachten möchte, und dann ein Skript zu schreiben, um sie lokal von jedem Rechner zu bekommen. Insbesondere installiere ich JRuby und verwende das JMX-Juwel, um JMX auf dem lokalen Rechner abzufragen und die Ergebnisse auf die Konsole zu drucken oder sie an ein entferntes System zur Sammlung zu senden. Dies verursacht ein wenig Belastung auf den Systemen, auf denen das Skript ausgeführt wird, also müssen Sie das berücksichtigen. – Peter

+0

Das funktioniert für mich! Vielen Dank. –

10

JMX benötigt eine RMI-Registrierung, die auf einem offenen Port ausgeführt wird. Standardmäßig wird der RMI-Registry-Port zum Zeitpunkt des Starts zufällig ausgewählt. Bei Firewalls funktioniert er nicht gut. Seit JDK7u4 können Sie verwenden

-Dcom.sun.management.jmxremote.rmi.port=<port> 

der RMI-Port setzen verwendet werden. Dann können Sie diesen Port in der Sicherheitsgruppe aktivieren.

Beachten Sie den .rmi. Teil der obigen Einstellung, da dies normalerweise mit der com.sun.management.jmxremote.port Einstellung verwechselt wird. Sie sollten nicht!

+0

Ich stelle fest, Ports sind nicht sinnvoll, da die Verbindung SSL gesichert ist. Ich habe einen privaten Schlüssel und habe keine Ahnung, wie man es mit JConsole oder VisualVM verwendet –

+0

Dies sollte die beste Antwort sein, da es keinen SSH-Tunnel oder Öffnen des gesamten Port-Bereichs von 0-65535 (wie ich vorgeschlagen sah) anderswo). – mmindenhall