기본 콘텐츠로 건너뛰기

ubuntu 에서 원격 JMX(Java Management Extensions) 모니터링 가능하게 하기

원격 JMX 모니터링 가능하게 하기

 

정리



  1.  설정 파일 수정
    • 관련 파일
      • $JAVA_HOME/jre/lib/management/management.properties
    •  내용추가
      • com.sun.management.jmxremote.port=8991
      • com.sun.management.jmxremote.ssl=false
  2. 톰캣 설정 수정
    • 관련 파일
      • /etc/default/tomcat7
    • JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote 
  3. password 파일 소유자 및 권한 수정
    • sudo chown tomcat7.tomcat7 /etc/java-7-openjdk/management/jmxremote.password
    • sudo chmod 600 /etc/java-7-openjdk/management/jmxremote.password
  

원격 JMX 모니터링 시 설정


설정이 필요한 파일

$JAVA_HOME/jre/lib/management/jmxremote.access
$JAVA_HOME/jre/lib/management/jmxremote.password

두 파일이 필요하다는데.

Ubuntu 14.04 Java Home Directory에서 JAVA_HOME은 /usr/lib/jvm/default-java임을알아냈다.

물론,

/usr/lib/jvm/default-java/jre/lib/management/jmxremote.access와 같은 직접적인 접근도 가능하다.

linux의 주 설정파일 들이 모여있는 디렉토리는 /etc이며, 위의 파일 또한 실제로는 /etc/java-7-openjdk/management/jmxremote.access라는 실제 파일에 대한 링크이다.

원격 JMX 모니터링 시 java 시작 옵션

 

1. 모든 프로그램에 적용 시


  • 설정 항목
    • com.sun.management.jmxremote
    • com.sun.management.jmxremote.port=8991
    • com.sun.management.jmxremote.ssl=false
  • 관련 파일
    • $JAVA_HOME/jre/lib/management/management.properties

Ubuntu tomcat 시작 시 com.sun.management.jmxremote 은 반드시 -Dcom.sun.management.jmxremote 형식으로 사용해야함.

/etc/init.d/tomcat7 참고하면 

if [ -f "$DEFAULT" ]; then
        . "$DEFAULT"
fi


처럼 $DEFAULT 파일을 실행하며, 이는

PATH=/bin:/usr/bin:/sbin:/usr/sbin
NAME=tomcat7
DESC="Tomcat servlet engine"
DEFAULT=/etc/default/$NAME


처럼 /etc/default/tomcat7이다.

/etc/default/tomcat7 파일 내용 수정


  • JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC -Dcom.sun.management.jmxremote"

tomcat을 시작하면 패스워드 파일 관련 에러를 뱉어내는데, 이는 보안을 위해 tomcat 을 실행하는 사용자의 소유여야 하며 다른 사용자의 접근 권한은 막혀있어야 한다는 것이다.


  • sudo chown tomcat7.tomcat7 /etc/java-7-openjdk/management/jmxremote.password
  • sudo chmod 600 /etc/java-7-openjdk/management/jmxremote.password
위 두 명령을 실행해서 소유자를 tomcat7, 권한을 소유자만 읽기/쓰기가 가능하도록 변경한다.


2. 해당 프로그램에 적용 시

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8991
-Dcom.sun.management.jmxremote.ssl=false

위 세 줄을 1.모든 프로그램에 적용 시를 참고하여 JAVA_OPTS에 추가한다.




ps.

JMX를 이용한 모니터링을 구현할 때 고려해야 할  프로그램 개발 구조.


http://www.zohocorp.com.cn/webnms/javaagent/images/multi-protocol-runtime-architecture.jpg

댓글

이 블로그의 인기 게시물

Example of java class transform with java agent and BCI

Dynamic transform   예제 시나리오 원하는 작업  DB에 요청하는 모든 쿼리를 출력 작업 순서 Agent 작성 ClassFileTransformer 구현 Agent 작성 Java Agent 구성도 Manifest 파일 Manifest-Version: 1.0 Premain-Class: sample.bci.Agent Agent-Class: sample.bci.Agent Can-Redefine-Classes: True must be end with new line - http://docs.oracle.com/javase/tutorial/deployment/jar/modman.html Agent.java /** * example for bci with java agent */ package sample.bci; import java.lang.instrument.Instrumentation; /** * @author k * */ public class Agent { public static void premain(String args, Instrumentation inst) { inst.addTransformer(new JdbcQueryTransformer()); } public static void agentmain(String args, Instrumentation inst) { inst.addTransformer(new JdbcQueryTransformer()); } } JdbcQueryTransformer. java /** * example for bci with java agent */ package sample.bci; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.IllegalClassFormatException; impor...

tkinter한줄 입력받아 출력하기

from tkinter import * class App: def __init__(self, master): frame = Frame(master) frame.pack() #한줄 입력을 위한 위젯, Entry self.input = Entry(frame) self.input.pack(side=LEFT) self.button = Button(frame, text="입력", command=self.output) self.button.pack(side=LEFT) def output(self): #입력받은 내용을 출력 #Entry.get() print(self.input.get()) def main(): root = Tk() app = App(root) root.mainloop() if __name__ == '__main__': main()