Jmxterm – 커맨드 라인 JMX
JAVA 에는 JMX(Java Management Extension) 이라고해서 JAVA 애플리케이션을 관리하기 위한 확장을 제공합니다. JAVA 애플리케이션을 시작할때에 다음과 같이 JVM 옵션을 주게되면 사용할 수 있습니다.
- -Dcom.sun.management.jmxremote
- -Dcom.sun.management.jmxremote.port
- -Dcom.sun.management.jmxremote.authenticate
- -Djava.rmi.server.hostname
- -Dcom.sun.management.jmxremote.ssl
hostname, port 그리고 authenticate 을 설정하면 특정 호스트에서 특정포트를 통해서 인증을 통해서 JMX 클라이언트를 통해서 접속할 수 있는데, JMX 클라이언트로 가장 유명한 것이 JConsole 입니다.
그런데, 보안상의 이유로 JMX 는 활성화하되 접속은 로컬호스트에서만 되도록 설정을 해놓는 경우가 많습니다. 다음과 같이 말입니다.
1 2 3 4 5 |
export JMX_OPTS=" -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=8090 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=localhost \ -Dcom.sun.management.jmxremote.ssl=false " |
대부분의 로컬호스트가 리눅스일 경우에는 JConsole 을 이용하기 위해서는 터미널의 터널링을 해주는 방법등을 동원하는데 JConsole 이 아닌 jmxterm 프로그램을 이용하면 리눅스 터미널에서 jmx 를 활용할 수 있습니다.
jmxterm
jmxterm 은 JMX Terminal 로 자바로 작성된 커맨드 라인 JMX 클라이언트 입니다. 다른 추가적인 라이브러리가 필요없이 jdk 만 있으면 동작하고 사용자와 상호작용을 할수 있도록 Interactive 하게 동작합니다.
또, JMX 서버 설정대로 인증을 할 수 있고 로컬호스트라면 JAVA 애플리케이션의 PID 를가지고 접속을 할수 있습니다.
Interactive 작업시 탭키(Tab key) 를 이용한 자동완성기능(Auto completion)을 제공합니다. 따라서 MBean domain 이나 Beans 들을 전부 외울 필요가 없습니다.
다운로드
다운로드는 다음의 주소에서 다운받을 수 있습니다.
- 다운로드: jmxterm
사용방법.
이제부터 간단한 예제를 통해서 어떻게 사용하는지 알아보겠습니다. 먼저 Tomcat 을 실행하는데, JMX 를 로컬호스트를 통해서만 접속할 수 있도록 옵션을 주고 실행했습니다. 다음과 같이 말이지요.
1 2 3 4 5 6 7 8 9 10 11 |
export JMX_OPTS=" -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=8090 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Djava.rmi.server.hostname=localhost \ -Dcom.sun.management.jmxremote.ssl=false " export JVM_OPTS="-XX:NewRatio=3 -XX:ParallelGCThreads=4 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/instance1/logs -verbosegc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/home/instance1/logs/gc_`date "+%Y%m%d%H"`.log" export CATALINA_OPTS=" ${JMX_OPTS} ${CATALINA_OPTS} ${JVM_OPTS}" /bin/su -p -s /bin/sh $INSTANCE_OWNER $CATALINA_HOME/bin/startup.sh |
JMX 포트는 8090 이고 인증은 없으며 로컬호스트에서만 접속되도록 했습니다.
이제 jmxterm 을 실행합니다.
1 2 3 |
]$ java -jar jmxterm-1.0-alpha-4-uber.jar Welcome to JMX terminal. Type "help" for available commands. $> |
위와같이 $> 프롬프트가 나옵니다. 여기서 이제 JMX로 접속을 해야 합니다. 프롬프트에서 다음과 같이 입력을 합니다.
1 2 3 4 5 |
]$ java -jar jmxterm-1.0-alpha-4-uber.jar Welcome to JMX terminal. Type "help" for available commands. $>open 127.0.0.1:8090 #Connection to 127.0.0.1:8090 is opened $> |
접속방법은 위와같이 “open 로컬아이피:포트” 형식입니다. 만일 Tomcat 의 PID 를 알고 있다면 “open PID” 형식으로도 접속을 할 수 있습니다.
이제부터는 JMX 의 MBeans Domain, Beans 를 이용해서 JMX 의 속성들을 찾을 수 있습니다. 먼저 Domain 목록은 다음과 같이 조회를 합니다.
1 2 3 4 5 6 7 8 |
$>domains #following domains are available Catalina JMImplementation Users com.sun.management java.lang java.util.logging |
domain 리스트를 확인했으니 domain 을 지정할려면 “domain 도메인명” 을 입력해주면 됩니다.
1 2 3 4 |
$>domain Catalina domain Catalina #domain is set to Catalina $> |
domain을 지정했으니 이제는 bean 들을 볼 수 있습니다. 다음과 같이 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$>beans beans #domain = Catalina: Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=default . . . . Catalina:type=Server Catalina:type=Service Catalina:type=StringCache $> |
그럼 Bean 을 지정할려면 어떻게 해야할까요? 짐작대로 “bean 빈명” 해주면 됩니다.
1 2 3 4 |
$>bean Catalina:name=tomcatThreadPool,type=Executor bean Catalina:name=tomcatThreadPool,type=Executor #bean is set to Catalina:name=tomcatThreadPool,type=Executor $> |
bean 은 각종 속성과 액션들을 가지고 있는 셋트입니다. 이들을 보기 위해서는 info 명령어를 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$>info info #mbean = Catalina:name=tomcatThreadPool,type=Executor #class name = org.apache.tomcat.util.modeler.BaseModelMBean # attributes %0 - activeCount (int, r) %1 - completedTaskCount (int, r) %2 - corePoolSize (int, r) %3 - daemon (boolean, rw) %4 - largestPoolSize (int, r) %5 - maxIdleTime (int, rw) %6 - maxQueueSize (int, rw) %7 - maxThreads (int, rw) %8 - minSpareThreads (int, rw) %9 - modelerType (java.lang.String, r) %10 - name (java.lang.String, rw) %11 - namePrefix (java.lang.String, rw) %12 - poolSize (int, r) %13 - prestartminSpareThreads (boolean, rw) %14 - queueSize (int, r) %15 - stateName (java.lang.String, r) %16 - threadPriority (int, rw) %17 - threadRenewalDelay (long, rw) #there's no operations #there's no notifications $> |
위와같이 bean 에 속하는 속성들을 볼 수 있고 액션도 볼수 있습니다.(위 예제에서는 액션은 안나왔네요.)
속성이 가지고 있는 값을 보기 위해서는 “get 속성” 을 해주시면 됩니다.
1 2 3 4 5 6 7 8 9 |
$>get activeCount get activeCount #mbean = Catalina:name=tomcatThreadPool,type=Executor: activeCount = 0; $>get poolSize get poolSize #mbean = Catalina:name=tomcatThreadPool,type=Executor: poolSize = 0; |
각 속성들은 리턴타입에 맞게 화면에 표시됩니다.
이렇게 리눅스 터미널에서도 얼마든지 JMX 를 이용할 수 있습니다.