[ 출처 : http://zeous.egloos.com ]
지난 2주간 자바로 만들어진 application에서 hang이 걸리는듯한 현상이 발생을 하여서
이것저것 분석가능한 팁 &
Tool을 찾아서 테스트 해보았고 정리본을 공유한다.
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
장단점
- 돈이 든다 ^^
- 실시간 경고 및 모니터링에 뛰어난 장점을 보여준다.
댓글 없음:
댓글 쓰기