메뉴 건너뛰기

Cloudera, BigData, Semantic IoT, Hadoop, NoSQL

Cloudera CDH/CDP 및 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

번호 제목 날짜 조회 수
302 mybatis와 spring을 org.apache.commons.dbcp2.BasicDataSource의 DataSource로 연동할때 DB설정(참고) 2016.10.31 1146
301 Caused by: java.sql.SQLNonTransientConnectionException: Could not read resultset: unexpected end of stream, read 0 bytes from 4 오류시 확인/조치할 내용 2016.10.31 4211
300 VisualVM 1.3.9을 이용한 spark-submit JVM 모니터링을 위한 설정및 spark-submit실행 옵션 2016.10.28 2378
» VisualVM 1.3.9을 이용한 JVM 모니터링 file 2016.10.27 877
298 운영중인 상태에서 kafka topic삭제하고 재생성하여 처리되지 않은 메세지 모두 삭제하기 2016.10.24 1195
297 producer / consumer구현시 설정 옵션 설명 2016.10.19 720
296 java.lang.OutOfMemoryError: unable to create new native thread오류 발생지 조치사항 2016.10.17 1115
295 동시에 많은 요청이 endpoint로 몰려서java.net.NoRouteToHostException가 발생하는 경우의 처리방법 2016.10.17 779
294 AIX 7.1에 Python 2.7.11설치하기 2016.10.06 1141
293 프로그래밍 언어별 딥러닝 라이브러리 정리 file 2016.10.05 683
292 모두를 위한 머신러닝과 딥러닝의 강의 file 2016.09.27 668
291 DBCP Datasource(org.apache.commons.dbcp.BasicDataSource) 설정 및 속성 설명 2016.09.26 937
290 AIX 7.1에서 hive실행시 "hive: line 86: readlink: command not found" 오류가 발생시 임시 조치사항 2016.09.25 964
289 hive기동시 Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D 오류 발생시 조치사항 2016.09.25 1043
288 schema설정없이 hive를 최초에 실행했을때 발생하는 오류메세지및 처리방법 2016.09.25 1362
287 파일끝에 붙는 ^M 일괄 지우기(linux, unix(AIX)) 혹은 파일내에 있는 ^M지우기 2016.09.24 237
286 AIX 7.1에 MariaDB 10.2 소스 설치 2016.09.24 2723
285 ./hadoop-daemon.sh start namenode로 namenode기동시 EditLog의 custerId, namespaceId가 달라서 발생하는 오류 해결방법 2016.09.24 289
284 hadoop 어플리케이션을 사용하는 사용자 변경시 바꿔줘야 하는 부분 2016.09.23 819
283 format된 namenode를 다른 서버에서 다시 format했을때 오류내용 2016.09.22 326
위로