среда, 16 февраля 2011 г.

Этот безумный JMX, jconsole и 127.0.1.1

В моем сервере на платформе Reddwarf для мониторинга производительности сервера используется JMX.
Для этого добавляю в параметры запуска java-машины -Dcom.sun.management.jmxremote.port=3333 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false . В результате сервер запускается с JMX-агентом, к которому можно подключиться с помощью JConsole.

После успешных экспериментов с JConsole я настроил выгрузку данных в cacti. Для этого использовал jmxtrans. Он делает запрос к серверу, получает данные и сохраняет и в архив. Всё замечательно...

Проблемы начались при попытке подключиться к JMX-агенту на боевом сервере. Параметры добавил, перезагрузил...

JConsole подключаться не хочет:

Connection failed: Retry?
The connection to mygameserver.ath.cx:3333 did not succeed.
Would you like to try again?

Без объяснения причин.

Попробовал подсоединиться с помощью VisualVM. В результате в логе исключение:

INFO [com.sun.tools.visualvm.jmx.impl.JmxModelImpl]: connect(service:jmx:rmi:///jndi/rmi://mygameserver.ath.cx:3333/jmxrmi)
java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:352)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:809)
Caused: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:828)
...


jmxtrans выдает следующее исключение:

[15 фев 2011 18:28:13] 930 ERROR (com.googlecode.jmxtrans.util.JmxUtils:348) - Problem processing queries for server: mygameserver.ath.cx:3333
java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
...

Какой ещё 127.0.1.1? Зачем он пытается подсоединиться к локальной машине?
При этом если сервер отключить, выдается другое сообщение:

java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: mygameserver.ath.cx; nested exception is:
java.net.ConnectException: Connection refused]
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:342)
...

Полдня шаманства с файрволом ничего не дали: порт открыт, подключение к нему телнетом проходит.
Вооружившись сниффером, я обнаружил, что при общении jmx-клиента с сервером соединение все-таки создается, но почти сразу обрывается... Причем в данных, перехваченных сниффером, в явном виде присутствует строка "127.0.1.1", которую сервер передает клиенту...

Тогда я начал сравнивать, чем отличаются два сервера, на одном из которых всё работает, а на другом - нет (оба сервера работают под Ubuntu).
Там где работает:
user@cs:~$ hostname -i
188.93.32.114

а на том, где не работает:
user@cs:~$ hostname -i
127.0.0.1


Оказывается, всё дело было в ip сервера, возвращаемого системой по имени компьютера.
Для этого надо было исправить одну строчку в /etc/hosts.
Было:
127.0.0.1       localhost
127.0.0.1       cs2621
Стало:
127.0.0.1       localhost
188.93.32.114   cs2621
После этого надо было перезагрузить java-приложение, которое мониторилось - и всё заработало! И JConsole, и VisualVM, и jmxtrans!

Комментариев нет:

Отправить комментарий