메뉴 건너뛰기

Bigdata, Semantic IoT, Hadoop, NoSQL

Bigdata, Hadoop ecosystem, Semantic IoT등의 프로젝트를 진행중에 습득한 내용을 정리하는 곳입니다.
필요한 분을 위해서 공개하고 있습니다. 문의사항은 gooper@gooper.com로 메일을 보내주세요.


#참고 : http://bcho.tistory.com/789


*주의 : 모니터링 하려는 어플리케이션의 실행계정과 rmiregistry, jstatd실행 계정이 같아야함


JVM 1.4 버전대에만 해도 GUI 기반으로 JVM을 모니터링 하는 도구는 거의 없었다. 콘솔로 접속해서 Thread dump나 GC 로그등을 분석하거나 필요할 경우 JMX 기반의 모니터링 명령어등을 만들어야 했는데, 근래에는 좋은 모니터링 도구들이 많이 나와서, 쉽게 JVM의 상태를 모니터링 할 수 있고, 메모리,CPU 사용률, Thread 현황들을 매우 쉽게 분석할 수 있다.

여기에, 여러개의 VM을 동시에 중앙에서 매우 세세하게 모니터링이 가능하게 되었다.

여기서는 몇가지 자주 사용되는 JVM 모니터링 툴을 소개하고자 한다. 

VisualVM

대표적인 도구로는 오픈소스 기반의 Visual VM이라는 도구가 있다. http://visualvm.java.net/

에서 다운로드 받을 수 있다. 여러개의 VM을 동시 모니터링이 가능할 뿐만 아니라, profiling도 가능하고, eclipse 안에 embed 해서 사용할 수 도 있다.

먼저 사용법을 알아보자. VisualVM을 다운받은 후에, 압축을 풀어놓는다.다음은 원격지에 있는 VM을 모니터링 하는 설정이다. 모니터링할VM 서버에서 먼저 rmiregistry 서버를 기동한다.


1. rmiregistry 실행

C:devlangjdk1.7bin> nohup rmiregistry 1099 & (root로 실행하는 경우)

(linux에서는 root로 jdk를 설치하고 root이외의 계정으로 실행하는 경우는 실행 계정(예, hadoop)의 home디렉토리에서 nohup $JAVA_HOME/bin/rmiregistry 1099 &를 실행시켜준다.)


2. tools.policy파일 생성(root로 생성)

다음으로는 VM에 대한 정보를 접근할 수 있도록 permission을 허용해야 하는데 JDK를 설치한 계정(예, root)로 ${java.home}/bin 디렉토리에 tools.policy라는 파일을 다음과 같이 만든어 저장한다.

grant codebase "file:${java.home}/../lib/tools.jar" {

   permission java.security.AllPermission;

};


3. jstatd 실행

C:devlangjdk1.7bin> nohup jstatd -p 1099 -J-Djava.security.policy=tools.policy & (root로 실행하는 경우) 

(linux에서는 root로 jdk를 설치하고 root이외의 계정으로 실행하는 경우는 실행 계정의 home디렉토리에서 nohup $JAVA_HOME/bin/jstatd -p 1099 -J-Djava.security.policy=$JAVA_HOME/bin/tools.policy &를 실행시켜준다.)


위의 설정까지 하면 기본적인 VM에 대한 상태 정보 (메모리)를 모니터링할 수 있는데, 조금 더 상세한 모니터링을 위해서, JVM의 JMX 설정을 on 한다.

(com.sun.management.jmxremote.port는 각각 다르게 해야함)

다음은 Tomcat의 JMX 설정을 하기 위해서 ${tomcathome}/bin/catalina.bat를 수정한 내용이다.

JVM옵션에 다음과 같은 내용을 추가 하면 된다.


set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9981


export JAVA_OPTS="-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9982"


# tomcat의 경우 설정

CATALINA_OPTS="-Djsse.enableSNIExtension=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9983"


* fuseki/jena의 경우 설정

JVM_ARGS="-Xms1g -Xmx2g -Djsse.enableSNIExtension=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9984"


* 최초 기동시 아래와 같은 오류가 발생할 수 있는데 이때는 --jdkhome옵션을 주고 실행하면 된다.

C:UsersgooperDownloadsvisualvm_139visualvm_139binvisualvm.exe --jdkhome c:devjdk1.8.0_60



여기 까지 했으면 모든 준비가 끝났다.


주의할점은, 실제 운영이나 개발 환경들에 이러한 설정을 적용할때, 포트가 외부에 오픈 되기 때문에, 보안상 문제가 될 수 있다. 그래서 반드시 OS (Linux)의 iptable 설정등에서, VisualConsole이 인스톨 되는 서버로 부터의 inbound connection 만 오픈하도록 하는 것이 좋다.

Visual VM을 실행하고, Remote Host를 Add하고, ip 주소와 위에서 지정한 포트를 지정하면 아래와 같이 VM을 모니터링 할 수 있다.

아래 그림은 편의상 local에 있는 JVM을 모니터링 하도록 설정하였다.



여기서는 전체 VM에 대한 Thread 개수, Class개수와 기본적인 CPU와 JVM 메모리 상황을 모니터링 할 수 있다.

 

다음은 Thread를 모니터링 하는 화면이다. time frame에 따라서 어떤 thread가 있고,어떤 상태인지를 모니터링이 가능하다.



 

아래는 Thread dump 추출 화면이다. 좌측 메뉴에서 JVM을 선택하고 오른쪽 마우스 버튼을 이용하면 Thread dump 추출 메뉴가 나오는데, 아래 그림과 같이 추출한 Thread dump를 저장해서 보여준다. Bottleneck 분석등에 매우 유용하게 사용할 수 있다. 



다음은 성능 튜닝 부분에서 유용하게 사용할 수 있는 기능인데, profiling 기능을 제공한다.

우측 상자에 profiling하고 싶은 class 명(패키지명)을 지정해놓고, start를 하게 되면, 각 패키지 또는 클래스에서 소요되는 CPU 사용량을 보여준다. 


이를 이용하면 손쉽게 CPU 소모가 많은 모듈을 찾아낼 수 있다.


 

JConsole

참고로, JVM을 인스톨 하면 default로 인스톨 되는 GUI 기반의 JVM 모니터링 툴이 있는데, ${java.home}의 jconsole이라는 유틸리티이다.

VMConsole 처럼 permission이나 rmi setting이 필요 없고, JMX를 이용해서 통신을 한다.

기능상으로나 UI 면에서는 개인적으로는 Visual VM이 더 났다고 판단하는데, 단 JConsole의 경우에는 모니터링 대상 VM이 제공하는MBean(JMX)를 모니터링 할 수 있다.

Tomcat이나 각종 자바 서버들은 MBean을 통해서 서버의 상태나 Configuration  정보를 저장하기 때문에 이 MBean 만 모니터링 하더라도 서버의 상태를 알아내는데 매우 유용하게 사용할 수 있다.

아래 그림은 JConsole을 이용하여, Tomcat의 MBean을 모니터링 하는 화면이다.

 


 


 2013.9.12 추가. Oracle JVM 7 최신 버전에 multiple JVM을 monitoring 할 수 있는 JMC 라는 것이 포함 되었음

http://www.oracle.com/technetwork/java/javase/2col/jmc-relnotes-2004763.html

번호 제목 글쓴이 날짜 조회 수
421 github에 있는 프로젝트와 로컬에서 작업한 프로젝트 합치기 총관리자 2016.11.22 40
420 원격의 origin/master를 기준으로 dev branch를 만들어 작업후 원격의 origin/dev에 push하는 방법 file 총관리자 2016.11.22 44
419 Mountable HDFS on CentOS 6.x(hadoop 2.7.2의 nfs기능을 이용) 총관리자 2016.11.24 174
418 S2RDF를 이용한 다른 버젼의 github링크 총관리자 2016.12.02 51
417 Jena 2.3를 Hadoop 2.7.2의 NFS로 mount하고 fuseki를 이용하여 start할때 오류 메세지 총관리자 2016.12.02 1557
416 jena의 data폴더를 hadoop nfs를 이용하여 HDFS상의 폴더에 마운트 시키고 fuseki를 통하여 inert를 시도했을때 transaction 오류 발생 총관리자 2016.12.02 82
415 hbase startrow와 endrow를 지정하여 검색하기 샘플 총관리자 2016.12.07 70
414 ResultSet에서 데이타를 List<Map<String,String>>형태로 만들어서 리턴하는 소스(Collections.sort를 이용한 정렬 가능) 총관리자 2016.12.15 244
413 Collections.sort를 이용한 List<User>형태의 데이타 정렬(숫자, 문자에 대해서 각각 asc/desc및 복합정렬) 총관리자 2016.12.15 114
412 Collections.sort를 이용한 List<Map<String, String>>형태의 데이타 정렬 소스 총관리자 2016.12.15 45
411 mongodb aggregation query를 Java code로 변환한 샘플 총관리자 2016.12.15 777
410 MongoDB에 있는 특정컬럼의 값을 casting(string->integer)하여 update하기 java 소스 총관리자 2016.12.19 88
409 like검색한 결과를 기준으로 집계를 수행하는 java 소스 총관리자 2016.12.19 129
408 Class.forName을 이용한 메서드 호출 샘플소스 총관리자 2016.12.21 100
407 new Gson().toJson(new ObjectId())을 사용하면 값이 다르게 나오는 경우가 있음 총관리자 2016.12.23 44
406 List<Map<String, String>>형태의 데이타에서 중복제거 하는 방법 총관리자 2016.12.23 1705
405 Halyard - RDF4J와 Apache HBase를 이용하여 구현된 TripleStore이며 SPARQL 1.1쿼리를 지원한다. 총관리자 2016.12.29 630
404 eclipse 3.1 단축키 정리파일 총관리자 2017.01.02 38
403 [MemoryLeak분석]다수의 MongoCleaner 쓰레드가 Sleep상태에 있으면서 Full GC가 계속 발생되는 문제 해결방법 file 총관리자 2017.01.11 264
402 spark 2.0.0를 windows에서 실행시 로컬 파일을 읽을때 발생하는 오류 해결 방법 총관리자 2017.01.12 106

A personal place to organize information learned during the development of such Hadoop, Hive, Hbase, Semantic IoT, etc.
We are open to the required minutes. Please send inquiries to gooper@gooper.com.

위로