본문 바로가기

04. Secure/ii. analyze

1. WAS server dump....

최근 was 서버에 문제가 많이 생겨서 was쪽만 죽어라 파본적이 있다.

일단 was서버에는 무료로 배포중인 tomcat (톰캣...고양이다), jboss, weblogic, webshpere, JEUS 등등등등....여러가지의 종류가 있다 WAS서버라고도 하고 미들웨어라고도 하는것같더라...표현의 방식으로 치면 미들웨어에 was가 포함되어진다고 생각하면 될것 같다.

일반적으로 많이 사용하고 있는 WAS서버는 결국 JVM을 통해서 처리가 되어진다.
결국 dump분석은 tomcat의 분석이 아니라, java memory영역에 대한 분석이 되어질수도 있다는점을 생각해보자.

일단 Java의 메모리 구조
넓게만 생각하고 설명을 하는것이 편할것 같다
Heap영역이라고 불리는 JVM의 메모리 구조는 YongGen, Eden, OldGen 그리고 permgen 영역으로 나눠져 있다. 이 영역에서 모든일이 처리되어지고 was 서버가 OOM (OutOfMemory)를 발생하는것은 바로 이 영역에서 처리가 되어지는 부분이 FULL되어진것이라고 판단하면 될것이다. (물론 정말로 물리적 메모리가 부족할수 있을도 있다...그런 그런경우는 여기서 생각하지 않겠다)

그럼 각 영역의 의미는?
YoungGen : 이 영역은 was서버에서 처음사용되어지는 class나 java관련 파일들을 처리한다.
Eden : 이 영역은 YoungGen 영역에서 그래도 좀 사용된다(?)싶은 녀석들이 올라와준다
Oldgen : 이 영역은 was서버에서 많이 사용되어지는 부분을 보여준다...그리고 JDK1.5 버전기준으로 가장 큰 영역을 사용하며, Full-GC가 일어나는 시간에는 이 OldGen영역에 가비지 콜렉션이 일어나는것이다

그외 영역은?
물론 존재한다 permgen영역과, 일반적으로 YoungGen영역이라 불린 이곳도 세분화되어져 나눌수 있다..하지만 여기서는 그 부분에 대한것은 제외하겠다.

위 JVM의 메모리 구조를 어느정도 머리에 두고 다음 단계로 ...

JDK 1.5이상에서는 여러가지 도구를 제공하고 있다. JVM의 정보를 알아볼수 있는것도 있고 1.5에서 처음소개(?...1.4버전일수도 있다...1.4버전에 대한 부분은 자세히 모르겠다...1.4부터 제공한다고는 써있지만 내가 실질적으로 사용한건 1.5부터이기에)되어진 부분이 있는데 GUI상으로 JVM을 모니터링할수가 있다..

1.jstat
JVM의 상태정보를 볼수 있는 프로그램이다
일반적으로 Java에서 사용되는 메모리영역은 실제로 보여지지가 않는다. 그 영역에 대한 부분은 jstat와 같은 java에서 제공되어지는 util로 분석할수가 있다.
우리가 알고 싶은 영역은 heap에 관련되어진 부분으로 보통 -gc옵션을 사용하는 정보를 확인해볼수 있을것이다. (이외도 많은 옵션이 있지만 여기서는 heap영역에 대한것만 확인하기 위해서 제외하겠다)
 
[root@nosage bin]# ./jstat -gc -h 20 -t 2749 3s
위와 같으 옵션을 주고 실질적인 JVM의 메모리 사용량을 확인해보았다.

Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
          255.3  64.0   64.0   0.0    0.0    960.0    960.0     8204.0     4921.8   16384.0 11297.7     99    0.335   5      0.440    0.775
          258.3  64.0   64.0   0.0    0.0    960.0    960.0     8204.0     4921.8   16384.0 11297.7     99    0.335   5      0.440    0.775
          261.3  64.0   64.0   0.0    0.0    960.0    960.0     8204.0     4921.8   16384.0 11297.7     99    0.335   5      0.440    0.775

자 위에서 대강대강 설명한 메모리 영역을 보고 내가위에 보여주는 화면을 보면 어느정도 감이 올것이라고 생각이 된다. S0C    S1C    S0U    S1U 이 영역이 YoungGen영역이라고 생각하면 된다 그리고 EC, EU가 Eden영역 그리고 가장 문제가 되어지는 OC,OU가 Old Gen영역, 그리고 PC와 PU가 Permgen영역이다

그 뒤에 나오는 YGC이하부분도 매우! 중요하다. 가비지 콜렉션이 일어날때의 소요되어지는 시간과, 그리고 총 몇번의 가비지 콜렉션이 일어났는지 확인을 할수있는 부분이다.
현재 보여지고 있는 이 서버는 테스트서버인고, 접속도 한번도 안한 상태여서 위처럼 아주 낮은 수치를 보여주고 있다.

그럼 어떤걸 확인해야하는건가?
-gc옵션이 조금 불편할수가 있다 그냥 -gcutil 옵션이 더 편할수가 있다.

가비지 콜렉션이 일어나는 시점에서 Full-GC (FGC)가 일어난다고 했다, 분명 그랬다 근데 Full-GC가 일어나는 시점에서 OC, OU영역이 가비지콜렉션이 되어지면서 일정 수준까지 줄어야 하지만 일정수준까지 줄지 못하였다거나, 가비지 콜렉션이 돌았음에도 불구하고 Old영역이 더 올라가있는....-_- 정말 장애 전 상황을 격을수가 있다..
(이부분은 장애시 그래프를 머리속에 Old Gen영역으로만 그려보면 충분히 장애시에 어떻게 발생되어지는 그래프인지 알것이라고 생각한다)

간단하게 jstat으로 모니터링 하는 방법을 위에서 설명하고...아래쪽은 heap dump에 관한 이야기를..

2. jmap
일반적으로 webserver를 운영하면서 불필요한 리소스를 was에 넣어두는것을 운영자들은 상당히! 싫어한다. 그래서 debug옵션을 꺼둔다..그래서 만약 어떠한 불행한 일이 일어나더라도 heap dump없이 crash dump만 남게 되어지고...추적할래야 추적이 불가능한 상황이 온다..

jmap을 통해서 간단한 정보부터~heapdump까지 얻을수가 있으니 jmap을 사용하여 활용하면 될것이다.

3. jconsole
....

'04. Secure > ii. analyze' 카테고리의 다른 글

ssh 포트포워딩 기능 관련  (0) 2009.11.24