0. Java Profiling API란?
프로파일러라고 함은 application의 문제를 진단하고 성능을 측정하기 위해서 사용하는 도구임.
Java관련한 application은 JVM의 정보를 가져와야 하는데 이를 위해서 자바에서 제공하는 API이다.
JVMPI for Java 1.3, 1.4
- 클래식 자바 가상머신에서 잘 동작하도록 설계되어 있음
- 이벤트 기반 모델 방식
- Sun에서 실험적이라는 표현을 사용하기도 하고 Java 1.6에서부터는 사용하고 있지 않음
- 이번 application에서는 Java 1.6이라 이 방식을 활용한 tool에 대한 조사는 하지 않음
JVMTI for Java 1.5 이상
- ByteCode Instrumentation(BCI)라는 방법을 통하여 사용함
- 모니터링하고자 하는 바이트 코드의 정확한 위치에 프로파일링 코드를 추가함으로써 수행함
- 아래에 설명되는 거의 모든 기술이 이 방식을 통해서 사용하고 있음
Profiling Tool은 정보수집/분석/정보수집 & 분석 을 담당한다.
따라서 수집만 하는 툴은 눈으로 직접 분석하던지 분석을 하는 툴을 따로 써야 한다.
관련자료 :
http://openframework.or.kr/Wiki.jsp?page=JvmtiNjvmpi
1. Jstack
1.1 정보를 수집하는 Tool이다.
1.2 Thread Dump를 뜨는 자바의 기본적인 명령어이다.
1.3 윈도우는 Java 1.6에서부터 사용가능, 리눅스용은 Java 1.4부터 가능
1.4 사용방법
- jps 를 이용해서 java의 프로세스를 찾는다 : C:\Java\jdk1.6.0\bin>jps -v
- 발견한 PID를 이용해서 Thread Dump를 뜬다 : C:\Java\jdk1.6.0\bin>jstack 4740 > st.txt
- Dump 내용 예시
"hmux-127.0.0.1:6802-9" daemon prio=10 tid=0x9e3ad400 nid=0x17b9 runnable [0x9d3fd000..0x9d3fdfa0]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.caucho.vfs.SocketStream.read(SocketStream.java:175)
at com.caucho.vfs.ReadStream.readBuffer(ReadStream.java:1012)
at com.caucho.vfs.ReadStream.waitForRead(ReadStream.java:336)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:598)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:690)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:612)
at java.lang.Thread.run(Thread.java:619)
1.5 Dump 내용을 분석하는 법 :
http://www.j2eestudy.co.kr/lecture/lecture_read.jsp?db=lecture0201_1&table=j2ee&id=24
1.6 장단점
- 특별한 Coding 을 필요로 하지 않는다.
- 문제가 발생한 시점에 명령어를 수행해서 Hang이 걸린 Thread의 정보를 찾아낼수 있다.
- 눈으로 찾아야 하기에 연습을 통한 숙달이 필요하다.
1.7 참고자료 :
http://kwon37xi.egloos.com/2871508
2. HPRof
2.1 정보를 수집하는 Tool이다.
2.2 Heap And CPU Profilling Agent 의 약자, JDK에서 기본적으로 제공해준다.
2.3 HPRof로 수집된 데이터를 Heap Analyzer로 다시 분석한다.
2.4 사용방법 (resin 3.1.X 기준)
- resin.conf 파일을 오픈한다
- JVM arguments 항목에 <jvm-arg>-agentlib:hprof=heap=sites,cpu=samples,file=d:\zeous\profiling.txt</jvm-arg> 넣는다.
2.5 수집데이터 예시
TRACE 300539:
java.security.ProtectionDomain.getCodeSource(ProtectionDomain.java:Unknown line)
java.lang.ClassLoader.postDefineClass(ClassLoader.java:Unknown line)
java.lang.ClassLoader.defineClass(ClassLoader.java:Unknown line)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:Unknown line)
2.6 장단점
- 데이터가 엄청나게 많이 생성된다 (모든 데이터를 다 기록하는듯)
- JVM 옵션을 주고 서버를 구동시키면 한참 느려진다
- 프로파일 데이터에 실시간 기록이 아니라 서버를 종료하거나 action (Ctr+break)을 해줘야 기록된다.
2.7 참고자료 :
http://wiki.ex-em.com/index.php/HProf
3. ASM
3.1 정보를 수집&분석하는 Tool 이다.
3.2 BCI의 API 를 이용해서 가장 low 레벨로 컨트롤하는 방법임
3.3 HPRof가 모든 class에 대한 분석임에 반해 이 방법은 특정 클래스에 대한 action을 원하는 형태로 지정(코딩)할수 있다.
3.4 장단점
- 특정 class에 대한 컨트롤이 가능하다(예, connection 연결이 몇번 호출되었는지 카운트가능)
- 자유도가 높은 만큼 처음부터 코딩해야 한다.
3.5 참고자료
-
http://somnusong.tistory.com/275
-
http://asm.objectweb.org/index.html
4. Jconsole
4.1 정보수집 & 분석해주는 Tool이다.
4.2 JDK1.5 부터 포함된 로컬, 원격 자바 application 분석툴
4.3 자료수집 및 Swing으로 구성된 분석 UI까지 제공한다
4.4 사용법 (resin 3.1.X 기준)
- resin.conf 파일을 오픈한다
- JVM argument 항목에
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.port=1403</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.ssl=false</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote.authenticate=false</jvm-arg> 넣는다
4.5 장단점
- 자료를 수집하는 과정에서도 서버의 부하가 거의 없다.
- 특별한 코딩을 하지 않고 분석된 자료까지 UI를 통해서 제공 받는다
- id/password를 설정해서 입력받기도 가능한데 설정이 조금 까다롭다. (성공못하였음)
- Jstack으로 생성되는 Thread Dump 의 자료는 모두 포함하고 있음
- Jconsole을 다시 실행시키면 지금까지의 내용이 저장되지 않고 처음부터 다시 시작한다
4.6 참고자료
-
http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html
-
http://sjchoi.wordpress.com/2007/01/10/jconsole-사용하기/
-
http://www.mimul.com/pebble/default/tags/jmx/
5. Jennifer
5.1 정보수집 및 분석을 해주는 상용 Tool이다
5.2 2주간의 무료 라이센스를 얻어서 테스트 가능하다.
5.3 Jconsole은 자료를 저장할 수 없는 단점을 상용 Tool답게 분석된 로그를 저장해서 가지고 있다.
5.4 사용법 (resin 3.1.x기준)
- 설치메뉴얼 :
http://www.jennifersoft.com:8080/man/viewer/DocumentViewer.jsp?id=abc385f1-e652-48e5-8616-e24b13014734
- 설치메뉴얼 이외에 http_service_class = javax.servlet.http.HttpServlet;com.caucho.jsp.JavaPage 를 W11.conf에 넣어줘야 한다
- localhost로 나와있는 정보를 모두 IP정보로 셋팅해준다
5.5 사용메뉴얼 :
http://www.jennifersoft.com/docs/ko/77.html
5.6 장단점
- 돈이 든다 ^^
- 실시간 경고 및 모니터링에 뛰어난 장점을 보여준다.