콜트리분석
- 특정 프로세스가 현재 어떤 콜 트리 구조를 가지고 있는지 분석하는 기법
- 프로세스가 특정 함수를 호출하면서 행(Hang)상태에 빠지거나 CPU와 같은 자원을
과다하게 사용하는 현상을 분석할 때 유용.
콜 트리 분석 기초
콜 트리 얻는 법
gms-jwkim9990:ora11g:SYS >
l oradebug setmypid
명령문을 처리했습니다.
gms-jwkim9990:ora11g:SYS >
l oradebug short_stack
ksedsts()+585<-ksdxfstk()+44<-ksdxen_int()+6463<-ksdxen()+17<-opiodr()+1662<-ttcpip()+1325<-opitsk()+2040<-opiino()+1258<-opiodr()+1662<-opidrv()+864<-sou2o()+98<-opimai_real()+158<-opimai()+191<-OracleThreadStart()+724<-000000007682652D<-0000000076D0C521
- 왼쪽에 있을수록 가장 현재 실행 중인 함수
- 오른쪽에 있을수록 현재 함수를 실행하기 위해 이전 단계에서 실행된 함수에 해당
gms-jwkim9990:ora11g:SYS >
l oradebug dump callstack 1
명령문을 처리했습니다.
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedst1()+129 CALL??? skdstdst() 00C465990 00C2F7FE0 300000048
0FFFFFFFD
ksedst_tracecb()+69 CALL??? ksedst1() 000000000 01CF59CC1
243AAE1482B7 01CF5DB58
ksdxfdmp()+1909 CALL??? ksedst_tracecb() 01CF5A020 000000000 000000000
000000000
ksdxen_int()+6463 CALL??? ksdxfdmp() 01CF5C160 000000010 000000003
01CF5AFE0
ksdxen()+17 CALL??? ksdxen_int() 7FF00000056 000000011
01CF5E100 000000001
opiodr()+1662 CALL??? ksdxen() 000000001 243A0000001C
01CF5E100 01CF5B350
ttcpip()+1325 CALL??? opiodr() 000000056 000000011 01CF5E100
000000000
opitsk()+2040 CALL??? ttcpip() 0195AD8A0 000000000 000000000
000000000
opiino()+1258 CALL??? opitsk() 000000000 000000000 000000000
01CF5F9F8
opiodr()+1662 CALL??? opiino() 00000003C 000000004 01CF5FAB0
000000000
opidrv()+864 CALL??? opiodr() 00000003C 000000004 01CF5FAB0
6F5C3A6300000000
sou2o()+98 CALL??? opidrv()+150 00000003C 000000004 01CF5FAB0
000000000
opimai_real()+158 CALL??? sou2o() 1CD2444417AAA62 000000000
10001B000407DC 5035600170006
opimai()+191 CALL??? opimai_real() 000000000 01CF5FC68 00E07B510
01CF5FC68
OracleThreadStart() CALL??? opimai() 000000000 006DF0B34 0000000E8
+724 000000878
000000007682652D CALL??? OracleThreadStart() 00DA9FF18 000000000 000000000
000000000
0000000076D0C521 CALL??? 0000000076826520 000000000 000000000 000000000
000000000
----- End of Call Stack Trace -----
- 콜 스택의 위에 있을수록 현재 실행 중인 함수에 가까운 단계
함수명의 의미
- 함수명 앞의 세자리에서 네자리 정도는 Prefix로 각 함수가 사용되는 코드 영역을 가르킨다.
(kks로 시작하는 함수는 Kernel Kompile Shared SQL 영역에 해당하는 함수) - p.420 ~ 439 참고
OS의 명령어를 이용한 콜분석
- Strace, truss, tusc 와 같은 명령어들은 특정 프로세스가 호출하는 시스템 콜(System Call)을 추적하는데 사용합니다.
서버 프로세스의 비정상적인 I/O 문제나 행(Hang) 문제를 분석하기 위한 용도로 종종 사용됩니다. - 일부 OS가 제공하는 pstack과 같은 명령은 오라클의 콜 스택 덤프와 거의 동일한 기능을 제공합니다.
오라클 서버에서의 접속이 불가능할 정도의 상황이라면 이러한 명령을 사용해서 동일한 분석을 수행할 수 있습니다.
strace
strace -ttT -o strace.txt -p 32319
strace -c -ttT -o strace.txt -p 32319
17:30:42.799348 read(16, 0x133ba626, 2064) = ? ERESTARTSYS (To be restarted) <2.806911>
17:30:45.615125 --- SIGALRM (Alarm clock) @ 0 (0) ---
17:30:45.615308 rt_sigprocmask(SIG_BLOCK, [], NULL, 8) = 0 <0.000031>
17:30:45.615465 gettimeofday({1335515445, 615508}, NULL) = 0 <0.000022>
17:30:45.615578 gettimeofday({1335515445, 615620}, NULL) = 0 <0.000024>
17:30:45.615688 gettimeofday({1335515445, 615717}, NULL) = 0 <0.000020>
17:30:45.615782 rt_sigprocmask(SIG_BLOCK, [ALRM], NULL, 8) = 0 <0.000021>
17:30:45.615883 gettimeofday({1335515445, 615911}, NULL) = 0 <0.000020>
17:30:45.615994 setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0 <0.000026>
17:30:45.616109 rt_sigprocmask(SIG_UNBLOCK, [ALRM], NULL, 8) = 0 <0.000020>
17:30:45.616198 gettimeofday({1335515445, 616225}, NULL) = 0 <0.000020>
17:30:45.616291 rt_sigprocmask(SIG_BLOCK, [ALRM], NULL, 8) = 0 <0.000019>
17:30:45.616376 gettimeofday({1335515445, 616403}, NULL) = 0 <0.000019>
17:30:45.616464 setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0 <0.000021>
17:30:45.616561 rt_sigprocmask(SIG_UNBLOCK, [ALRM], NULL, 8) = 0 <0.000024>
17:30:45.616664 setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0 <0.000022>
17:30:45.616765 rt_sigprocmask(SIG_UNBLOCK, [], NULL, 8) = 0 <0.000028>
17:30:45.616859 rt_sigreturn(0x1) = 0 <0.000023>
17:30:45.616958 read(16, <unfinished ...>
Truss
truss -adD -o <output_file> -p <pid>
truss -c -adD -o <output_file> -p <pid>
Tusc
tusc -aT -o <output_file> <pid>
tusc -c -aT -o <output_file> <pid>
pstack
- Process Stack Trace를 보여주는 OS 명령어
- 오라클이 제공하는 콜 스택 명령과 거의 동일
pstack 32319
#0 0x000000355980d590 in __read_nocancel () from /lib64/libpthread.so.0
#1 0x000000000497201e in snttread ()
#2 0x000000000496f059 in nttrd ()
#3 0x000000000485ddca in nsprecv ()
#4 0x0000000004861a0f in nsrdr ()
#5 0x000000000483b750 in nsdo ()
#6 0x000000000483b032 in nsbrecv ()
#7 0x0000000004878e7e in nioqrc ()
#8 0x000000000130dc7f in opikndf2 ()
#9 0x000000000130b807 in opitsk ()
#10 0x000000000130e9e4 in opiino ()
#11 0x00000000013103f4 in opiodr ()
#12 0x0000000001301e13 in opidrv ()
#13 0x0000000001e8ca2a in sou2o ()
#14 0x00000000006e901b in opimai_real ()
#15 0x00000000006e8f6c in main ()