반응형

이번엔 AIX... Thread Dump 분석 방법이다.

최근에 발견한 최고의 포스팅.

 

http://blog.naver.com/bumsukoh/110114573021

 

 

안녕하세요. 이번에는 AIX에서 제공하는 Thread 모니터링 관련 툴을 소개하겠습니다.

AIX에서 가장 유용하게 사용할 수 있는 프로세스와 Thread 모니터링 툴로는 ps 명령어입니다.

"왠 ps 명령어 !" 라고 하실 수 있을텐데요.

 

사실 ps 명령어는 생각보다 굉장히 많은 정보를 제공하고 있습니다. man page를 보시면 더욱 실남나게 느기실텐데요.

그래도 ps 하면 가장 많이 사용하는 명령어가 "ps -ef" 정도겠죠.

 

AIX에서는 ps 명령어를 통해 Thread 레벨의 정보를 확인할 수 있는 기능을 제공합니다.

Solaris의 prstat이나 HP-UX의 glance처럼 막강하지는 않지만 나름대로 프로세스의 Thread레벨에 대한 정보를 확인하는데는 유용하게 사용하실 수 있습니다.

 

ps를 통한 Thread 레벨 모니터링 방법은 다음과 같습니다.

# ps -mp [프로세스 IDs] -o THREAD

ps 명령어는 다들 잘 아실테니 옵션부분만 설명하도록 하겠습니다.

- "m" 은 프로세스 뿐만 아니라 Kernel Thread에 대한 리스트를 출력합니다.

"-o" 옵션과 같이 사용하면 다양한 정보를 출력할 수 있습니다.

- "p" 는 프로세스 ID를 설정합니다. ","를 사용하여 여러개의 프로세스 ID를 지정할 수 있습니다.

- "o" 는 Format 지정을 지정합니다. Thread는 "THREAD"로 지정합니다.

다음은 ps -mp 명령어의 출력 결과 예입니다.

 

 

위와 같이 프로세스의 전체 정보와 그 밑으로 Thread 별(TID)로 정보가 출력됩니다.

구분 설명
TID Kernel thread ID for threads
ST The state of the process or kernel thread
CP The CPU utilization of the process or kernel thread
PRI The priority of the process or kernel thread
SC The suspend count of the process or kernel thread

그외 WCHAN, F, TT, BND, COMMA 정보가 있습니다.

자세한 사항은 ps man page나 메뉴얼을 참조하시기 바랍니다.

명령어 결과에서 Thread 상태 항목인 "ST" 부분과 CPU 사용율 항목인 "CP" 부분, 그리고 Thread의 Suspend 횟수 항목인 "SC" 부분을 주의깊게 볼 필요가 있습니다. 그 이유는 성능에 관련된 항목들이기 때문입니다.

위의 항목 중 Thread 상태 항목인 "ST" 부분에는 다음과 같은 상태 코드가 있습니다.

 

- "O" 는 Nonexistent 상태입니다.

- "R" 은 Running 상태입니다.

- "S" 는 Sleeping 상태입니다.

- "W" 는 Swapped 상태입니다.

- "Z" 는 Canceled 상태입니다.

- "T" 는 Stopped 상태입니다.

Java 프로세스의 경우 대부분이 "R" 또는 "S" 상태입니다.

TID(Thread ID)는 Java Thread dump 분석 시 Java Thread와 매핑하기 위한 key가 됩니다.

이 부분은 차후에 Thread dump 분석 시 설명드리도록 하겠습니다.

그 다음으로는 Solaris와 HP-UX에서 살펴보았던 pstack과 유사한 procstack 명령어입니다.

procstack 은 Solaris와 HP-UX에서 프로세스의 Native Stack을 확인할 수 있듯이 AIX에서 프로세스의 Native Stack을 확인하기 위한 명령어 입니다.

Solaris와 HP-UX에서는 p로 시작하는 프로세스 명령어 대신 AIX에서는 proc로 시작하는 프로세스 명령어가 있습니다. 두 종류가 거의 비슷한 기능을 제공합니다.

자세한 사항은 다음 포스트를 참고하시면 됩니다. (http://blog.naver.com/bumsukoh/110098535739)

명령어 사용법은 다음과 같습니다.

 

# procstack [프로세스 ID]

 

출력 결과는 다음과 같습니다.

 

위와 같이 JVM을 구현한 Native Stack 입니다. Java 1.6(64bit) 버전의 Jeus 서버에 대한 Thread Native Stack 입니다.

각 Thread 별로 tid와 pthread id 에 대한 내용이 출력되며, 여기서의 tid는 위에서 "ps -mp"의 TID와 동일한 값을 나타냅니다.

 

"ps -mp"의 모니터링 결과 CPU 점유가 높은 Thread에 대해 procstack으로 Native Stack 확인이 가능하게 됩니다. 물론 Java 프로세스의 경우 procstack으로 Java Stack 확인이 불가능하지만 그런데로 도움은 됩니다. 그 이후에 필요하다면 Thread dump(javacore 파일)을 생성하여 Java Stack을 확인할 수 있습니다.

 

위의 Native Stack은 모두 Java의 SocketInputStream의 socketread() 부분에서 대기중(상태"SLEEP")이며, 최종 Native Stack은 poll() 함수인 것을 알 수 있습니다.

 

poll()함수는 Thread를 즉시 "SLEEP"시키고 해당 STREAM(파일 FD)에서 Data input event가 감지되면 Thread를 wake-up시켜 데이터를 처리할 수 있도록하는 기능을 하는 함수입니다.

 

즉, Java의 socket read는 내부적으로 poll() 함수로 구현되었다는것을 알 수 있는 부분입니다.

그 외에 프로세스에 대한 degugging을 위한 dbx나 프로파일 툴인 tprof등을 사용할 수 있습니다.

프로파일 툴인 tprof는 java 기반(java stack 제공)의 프로파일을 할 수 있어 전문적인 프로파일링 툴이 없을 경우 유용하게 사용할 수 있습니다. (tprof 참고 : http://blog.naver.com/bumsukoh/110104594318)

 

이것으로 AIX에서 유용하게 사용할 수 있는 Thread 관련 명령어에 대해 알아 보았습니다.

다음 포스트에서는 본격적으로 Thread dump에 대한 내용을 설명드리도록 하겠습니다.

어제 엄청난 호우로 많은 지역이 피해를 입은 것 같습니다. 저도 어제 비와 천둥소리로 잠을 설칠 정도 였습니다. 모두들 호우에 피해를 입지 않도록 각별히 신경 쓰셔야 할 것같습니다.

그럼 이만.. 다음에 뵙겠습니다.

 

반응형

'OS > AIX::' 카테고리의 다른 글

AIX의 2가지의 프로그래밍 모델  (0) 2014.01.09
AIX 컴파일 정보 2  (0) 2012.12.05
AIX 라이브러리 버전 확인  (0) 2012.07.12
AIX 컴파일 정보  (0) 2011.10.05
AIX malloc - free 시 혹은 new - delete 시의 메모리 반환  (0) 2011.08.21

+ Recent posts