2023년 4월 10일 월요일

자바 어플리케이션 원격 모니터링

[ 출처 : http://freegram.egloos.com/ ]

Jconsole, MC4J 를 사용한 자바 어플리케이션 원격 모니터링(JMX)

 

JMX(JavaManagement Extensions)는 실행중인 자바 어플리케이션을 외부에서 모니터링하고 관리하는 기능을 제공한다. 실제로 이 API는 웹서버에서 네트워크 디바이스, 웹폰에 이르기까지 자바로 이용 가능한 것은 어느 것이든 로컬 혹은 원격으로 처리 할수 있게 한다. JMX 기술은 JCP(Java Community Process)에 의해 개발된 밀접한 관계의 두 스펙, Java Specification Request (JSR) 3: Java Management Extensions (JMX) SpecificationJSR 160: Java Management Extensions (JMX) Remote API 1.0에 의해 정의된다.

J2SE platform 5.0 부터 JMX기술은 Java SE 플랫폼의 하나로 통합되었다. 이전 버전에서 JMX 기술의 구현은 해당문서를 참조하도록 한다.

 

이러한 JMX 프로토콜을 사용하여 실행중인 어플리케이션의 메모리 및 스레드등에 대한 그래피컬한 정보를 보여주는 툴로는 JDK에 기본 내장된 JConsole 과 오픈소스 프로젝트에 하나인 MC4J 가 있다.

MC4J는 여러개의 서버 및 JVM 리소스들을 동시에 관리할 수 있는 편리함이 있지만 JConsole 도 버전업이 되면서 그에 못지않게 편리해졌다. 개인적으로 일반적인 용도로 사용할때는 JConsole이 좀 더 직관적이고 편리한 것 같다.

 

Tomcat 5.5 버전 이후부터 JDK 1.5에서 기본지원하는 JMX 프로토콜을 사용함으로 추가적인 연결아답터를 설치할필요가 없다. 이전버전의 JMX 연결설정은 이 문서에서 설명하지 않는다.(일반적으로 5.5 이전 버전에서는 MX4J JMXConnector 를 사용하였다)

 

JDK 설정

원격 모니터링을 활성화하기 위해서 JDK 의 JMX 관련설정을 해주어야 한다.

1) JDK5 이후버전만 가능

2) "JAVA_HOME/jre/lib/management/" 폴더에 있는 "jmxremote.password.template" 파일을 복사해서 "jmxremote.password" 파일을 만든다.

3) "jmxremote.password" 파일을 열고 밑의 계정들에 달린 주석(#)을 제거한다.

monitorRole  QED

controlRole   R&D

4) "jmxremote.password" 파일을 읽기전용으로 만든다.

chmod 400 jmxremote.password

선택)"management.properties" 파일에 아래설정을 추가하면 해당 JDK로 실행되는 모든 프로그램에 해당 JMX 옵션이 디폴트로 일괄적용된다.

com.sun.management.jmxremote
com.sun.management.jmxremote.port=8999
com.sun.management.jmxremote.ssl=false

 

JAVA 프로그램 실행(톰캣 등)

자바 어플리케이션을 실행할때 해당 옵션을 추가한다.

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false ...

 

톰캣의 경우도 마찬가지로 JAVA_OPTS 환경변수에 위의 옵션을 추가하여 실행시 반영되도록 설정한다.

예-윈도우) 톰캣 bin폴더에 run.bat 파일을 생성하고 아래의 내용을 추가한다.

setJAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false

startup.bat

예-리눅스) 톰캣 bin폴더에 run.sh 파일을 생성하고 아래의 내용을 추가한다.

JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false"

export JAVA_OPTS

./startup.sh

 

관련옵션

-Dcom.sun.management.jmxremote.port=8999 : 8999는 포트번호로 시스템에서 사용하지 않는 포트를 임의로 지정하면 된다.

-Dcom.sun.management.jmxremote.ssl=false : ssl를 비활성화 한다. ssl을 활성화하여 보안연결을 사용하고자 한다면 몇가지 추가적인 설정들을 필요로 한다. 이 문서에서는 설명하지 않는다.

-Dcom.sun.management.jmxremote.authenticate=false : JMX연결과정에서 인증을 요청하지 않는다.(누구나 접근가능)

-Dcom.sun.management.jmxremote.password.file=파일경로: JMX 인증관련 설정파일을 따로 지정한다. 유닉스 등 멀티유저 환경에서 자바 어플리케이션을 실행할때 패스워드파일은관리자계정에게만 읽기전용의 속성을 가지고 있으므로 다른 사용자들은 권한문제로 어플리케이션 실행이 실패한다. 따라서 각 사용자마다자신만의 jmxremote.password 파일을 생성해서 명시적으로 사용할 수 있도록 지원한다.

 

프로그램을 실행한 뒤 JMX 포트가 정상적으로 열려있는지 확인하기 위해 아래 명령을 사용한다.

netstat -anp | grep LISTEN

 

원격 모니터링 접속

JConsole 의 경우 간단하게 아이피:포트 로 접속하면 된다. jmxremote.password 파일을 수정하지 않았다면 monitorRole:QED, controlRole:R&D 두가지 계정으로 접근할 수 있을것이다.


MC4J 는 연결을 생성할때 JDK5를 선택하고 localhost:포트번호 를 상황에 맞게 수정해서 접속하면 된다.

톰캣서버가 클러스터링 되어있는 경우라면 연결의 속성을 TOMCAT5.5+ 로 선택하여 접속하면 클러스터링 관련의 특화된 관리기능이 활성화된다.


톰캣 이외에 웹로직, 웹스피어, 제우스등의 WAS들도 기본적으로 JDK5 이상버전에서 작동중이라면 위에서 설명한 JMX옵션을 통해 외부 모니터링이 가능하고 MC4J에서는 연결종류에 따라 특화된 관리기능을 제공한다.

 

리눅스에서 JMX 버그

이 글을 포스팅하게 만든 주 원인으로 리눅스상에서 JMX 포트가 열려있더라도 원격에서 접속이 실패하는 현상이 발생한다.리눅스의 호스트테이블을 JDK에서 잘못 인식하여 발생하는 버그로 추정된다. 해결방법은 /etc/hosts 파일을 편집하여

127.0.0.1      localhost.localdomain localhost

실제아이피   호스트명

형식으로 수정한다. 내 경우

127.0.0.1        smbServer localhost.localdomain localhost

::1                 smbServer

로 되어있던 것을 아래와 같이 수정해주었다. 127.0.0.1에 중복정의되어 있던 호스트명(smbServer)를 실제아이피에만 사상한것을 볼 수 있다.

127.0.0.1        localhost.localdomain localhost

192.168.1.40   smbServer


유동아이피라면 굳이 ::1 을 실제아이피로 수정하지 않더라도 localhost와 호스트명(smbServer)만 분리하여 사상하면 정상작동 하리라 본다(미확인)

 

또한 리눅스 방화벽이 JMX 포트에 대해 열려있는지도 확인해야 한다.(etc/rc.d/init.d/iptables --list) 역시나 본 문서에서는 설명하지 않는다.

 

댓글 없음:

댓글 쓰기