시스템 전반의 성능에 있어 병목을 일으키는 요인을 분석하려면 다음의 명령들이 사용됩니다.
hvmstat
hsvmon
hps
htprof
hiostat
hnetpmon
hfilemon
tprof와 svmon, netpmon, filemon은 PAIDE/6000 이 설치되어 있어야 합니다.
설치여부는 다음으로 확인합니다.
#lslpp -l perfagent.tools
설치가 되어 있지 않다면, AIX 4.3.0 이상에서는 AIX Base Operating System CD에서 내리고, 이전 버전인 경우는 PAIDE/6000 CD에서 내립니다.
설명내용중에 나오는 vmtune이나 schedtune은 bos.adt.samples 파일세트를 설치해야 하고 /usr/samples/kernel 아래에 있습니다.
□ 메모리 병목
vmstat, ps, svmon 명령을 사용합니다.
1. vmstat
메모리 병목 부분이 page in/out인지 확인합니다.
다음과 같이 실행합니다.
#vmstat 1
★ pi와 po가 계속 “0”보다 크다면 시스템이 느려집니다.
pi : 페이징 공간으로부터 page in 되는 초당 페이지 수
po : 페이징 공간으로 page out 되는 초당 페이지 수
시스템의 프로세스들이, RAM에서 가능한 메모리보다 더 많은 메모리를 요구한다면 페이지들이 페이징 공간으로 page out 된 후 필요시 다시 page in 됩니다. 페이징 공간을 사용하는 것은 RAM의 메모리를 사용하는 것보다 느리기 때문에 page in, page out이 많이 일어나면 시스템 성능이 저하됩니다.
fr : free되어야 할 페이지 수
sr : fr에 지정된 수의 페이지를 free시키기 위해 조사된 페이지 수
fr:sr의 비율이 1:4라면 하나의 페이지가 free될 때 마다 4페이지가 조사되었다는 것을 뜻하는데 이것만으로는 메모리 부족이라고 볼 수는 없습니다.
po*SYS>fr 이라면 시스템이 thrash되고 있는 것입니다. 여기서 SYS는 schedtune의 결과값중 하나로, 메모리가 128MB이상이면 기본값은 “0”이고 그렇지 않다면 “6”입니다. "thrash"라는 것은 시스템이 과다한 page in/out으로 인해 프로세스가 느려지는 것을 뜻하며 시스템이 전반적으로 느려집니다.
2. svmon
메모리 병목 원인이 특정 프로세스의 메모리누수인지 확인합니다.
다음과 같이 실행합니다.
# svmon -Pau 10 | more
결과로 다음과 같은 내용이 나타납니다.
Pid Command Inuse Pin Pgspace
13794 dtwm 1603 1 449
Pid: 13794
Command: dtwm
Segid Type Description Inuse Pin Pgspace Address Range
b23 pers /dev/hd2:24849 2 0 0 0..1
14a5 pers /dev/hd2:24842 0 0 0 0..2
6179 work lib data 131 0 98 0..891
280a work shared library text 1101 0 10 0..65535
181 work private 287 1 341 0..310:65277..65535
57d5 pers code,/dev/hd2:61722 82 0 0 0..135
위에 제시된 명령을 실행하면, 메모리를 가장 많이 사용하는 상위 10개 프로세스가 나열됩니다.
내용 중에서 “Type = work”이고 “Description = private”인 부분을 보고, “Pgspace”에 몇 페이지(4096byte)가 사용되는지 확인합니다. “Pgspace”값이 감소는 되지 않고 계속 증가만 된다면 메모리가 새고 있는 것입니다. 이는 application이 메모리 deallocation 을 하지 않는 경우 나타납니다.
여기서는 1.4MB (341 * 4096 = 1,396,736)의 가상 메모리가 사용되고 있습니다.
3. ps
메모리 병목 원인이 특정 프로세스 메모리 과다사용인지 확인합니다.
다음과 같이 실행합니다.
#ps gv | head -n 1; ps gv | egrep -v "RSS" | sort +6b -7 -n -r
결과로 다음과 같은 내용이 나타납니다.
PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
16274 - A 0:00 705 20996 23420 65536 5046 2116 0.0 7.0 dsmserv q
7226 - A 0:00 0 16 15624 65536 0 15608 0.0 5.0 kproc
14964 - A 0:00 0 16 15624 65536 0 15608 0.0 5.0 kproc
0 - A 0:05 7 12 15620 xx 0 15608 0.0 5.0 swapper
1032 - A 0:00 0 12 15620 xx 0 15608 0.0 5.0 kproc
516 - A 114:53 0 8 15616 xx 0 15608 48.2 5.0 kproc
774 - A 114:54 0 8 15616 xx 0 15608 48.2 5.0 kproc
2792 - A 0:02 520 6420 7836 xx 2252 1332 0.0 2.0 /usr/lpp/
17836 - A 1:35 2125 4992 5616 65536 348 372 0.7 2.0 /opt/lotu
6490 - A 0:02 97 1648 2068 65536 298 196 0.0 1.0 /opt/lotu
SIZE : 프로세스의 "Type = work"와 “Description = private” 영역에 대해 할당된 페이징 공간 크기(KB)
RSS : 프로세스의 "Type = work"와 “Description = private” 및 “Type = pers”와 “Description = code”영역에
대한 RAM 사용 크기(KB)
TRS : 프로세스의 “Type = pers”와 “Description = code” 영역에 대한 RAM 사용 크기(KB)
%MEM : RSS를 시스템 RAM 크기로 나눈 비율(%)
□ CPU 병목
vmstat, tprof, ps를 사용합니다.
1. vmstat
다음과 같이 실행합니다.
#vmstat 1
id : CPU의 idle 시간(%)
r : run queue에 있는 thread 수
★ 프로세스들이 run queue에서 기다리고 있다면 시스템이 느려집니다.
id가 계속 “0”라면 CPU가 100% 사용되고 있다는 것입니다.
r의 값이 클수록 시스템 성능이 저하됩니다.
2. tprof
한 프로세스가 얼마의 CPU시간을 사용하는지 확인하려면 다음과 같이 실행합니다.
#tprof -x sleep 30
그러면 현재 디렉토리에 “__prof.all”파일이 생깁니다. 그 내용은 다음과 같습니다.
Process FREQ Total Kernel User Shared Other
======= === ===== ====== ==== ====== =====
wait 2 41166 41166 0 0 0
event 13 1320 382 18 920 0
server 51 697 378 14 305 0
amgr 4 533 388 0 145 0
gil 4 410 410 0 0 0
router 2 300 218 1 81 0
30초동안 거의 3000번 CPU가 조사됩니다. “Total"값은 CPU에서 그 프로세스가 발견된 회수입니다. 그 값이 1500이라면 CPU 시간의 반 이상이 소요된다는 것입니다. ”wait" 프로세스는 CPU가 사용되지 않는 동안(idle)의 시간의 조사하기 위함입니다.
3. netpmon
한 프로세스가 얼마의 CPU시간을 사용하는지, 그리고 얼마의 CPU시간을 네트웍과 관련되어 사용하는지 확인하려면 다음과 같이 실행합니다.
#netpmon -o /tmp/netpmon.out -O cpu -v;sleep 30;trcstop
그러면 30초동안의 정보를 모아 /tmp/netpmon.out 파일을 만듭니다.
그 내용은 다음과 같습니다.
Network
Process PID CPU Time CPU % CPU %
----------------------------------------------------------
event 19360 1.4180 2.361 0.000
ksh 20506 0.7490 1.247 0.000
server 17836 0.4357 0.725 0.000
UNKNOWN 24608 0.4135 0.688 0.000
inetd 5678 0.1139 0.190 0.000
UNKNOWN 24908 0.1058 0.176 0.000
adminp 18584 0.0933 0.155 0.000
sched 19102 0.0912 0.152 0.000
ttsession 24766 0.0114 0.019 0.002
.
.
----------------------------------------------------------
Total (all processes) 4.6335 7.715 0.416
Idle time 54.7909 91.232
4. ps
프로세스들의 최근의 CPU시간 사용량을 보려면 다음과 같이 실행합니다.
#ps -ef | head -n 1
#ps -ef | egrep -v "UID|0:00|\ 0\ " | sort +3b -4 -n -r
결과는 다음의 형태로 나옵니다.
UID PID PPID C STIME TTY TIME CMD
root 25710 12392 13 15:14:18 - 0:01 dtwm
root 27112 12884 11 15:15:42 pts/5 0:11 tar -xvf /dev/rmt0
notes 19360 17836 6 12:26:36 - 5:32 /opt/lotus/notes/latest/ibmpow/event
root 20506 20402 3 13:46:03 pts/1 0:01 -ksh
root 28176 28124 3 15:15:23 pts/9 0:04 xmperf
root 5678 9810 1 12:24:41 - 0:33 /usr/sbin/inetd
notes 17836 17558 1 12:25:44 - 2:25 /opt/lotus/notes/latest/ibmpow/server
"C"의 값은 CPU 사용량에 대한 penalty 값이고 그 최대값은 120입니다.
프로세스들의 총 CPU시간 사용량을 보려면 다음과 같이 실행합니다.
#ps -e | head -n 1
#ps -e | egrep -v "TIME|0:" | sort +2b -3 -n -r
결과를 다음과 같이 나타납니다.
PID TTY TIME CMD
19360 - 6:22 event
17836 - 2:44 server
프로세스들의 CPU 의존도를 보려면 다음과 같이 실행합니다.
#ps gu | head -n 1
#ps gu | egrep -v "CPU|kproc" | sort +2b -3 -n -r
결과는 다음과 같이 나타납니다.
USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND
notes 19360 1.6 0.0 1804 2020 - A 12:26:36 6:30 /opt/lotus/notes/
notes 17836 0.7 1.0 5968 6248 - A 12:25:44 2:47 /opt/lotus/notes/
root 28502 0.5 0.0 420 480 pts/5 A 15:29:33 0:10 pax -rvf /dev/rmt
root 2792 0.2 2.0 8932 8232 - A 12:23:57 0:52 /usr/lpp/X11/bin/
root 25710 0.2 1.0 2216 2660 - A 15:14:18 0:09 dtwm
여기에서 “%CPU”값은 프로세스의 CPU시간 사용량을 프로세스의 총 실행시간으로 나눈 값입니다.
□I/O 병목
iostat와 filemon을 사용합니다.
1. iostat
★ iowait값이 크면 시스템이 느려집니다.
다음과 같이 실행합니다.
#iostat 5
결과값은 다음과 같습니다.
tty: tin tout avg-cpu: % user % sys % idle % iowait
0.4 228.8 8.0 2.4 89.6 0.0
Disks: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk0 2.0 41.6 2.6 0 208
hdisk1 0.0 0.0 0.0 0 0
%iowait : I/O작업이 종료되기를 기다리고 있는 CPU idle 시간 (%)
%idle : I/O작업과 상관없는 CPU idle 시간 (%)
iowait 값이 크면 디스크입출력이 프로세스 지연의 주요 원인이 됩니다.
시스템이 느리고 “%iowait"이 20~25% 이상이면 디스크 병목을 조사해야 합니다.
%tm_act : 디스크가 사용되고 있는 시간(%)
★ %tm_act 값이 크면 디스크 병목입니다.
어떤 시스템의 경우, 한 디스크에 대해 “%tm_act"의 값이 35% 이상이면 시스템이 눈에 띄게 느려집니다.
4busy 디스크과 idle 디스크를 구분하여 busy 디스크의 데이터를 idle 디스크에 옮깁니다.
4page in/out이 원인인지 살펴보고 맞다면 페이징 공간을 idle 디스크로 옮깁니다.
2. filemon
어느 파일 또는 논리적 볼륨, 디스크가 사용률이 높은지 확인하려면 다음과 같이 실행합니다.
#filemon -u -O all -o /tmp/fmon.out; sleep 30;trcstop
30초동안의 정보가 /tmp/fmon.out 파일에 쌓이고 내용은 다음과 같습니다.
Most Active Files
------------------------------------------------------------------------
#MBs #opns #rds #wrs file volume:inode
------------------------------------------------------------------------
10.6 0 340 0 pid=23572_fd=5
0.4 31 93 0 methods.cfg /dev/hd2:6356
0.3 2 88 0 unix /dev/hd2:8447
0.1 0 44 0 pid=19360_fd=12
0.1 31 31 0 passwd /dev/hd4:4145
0.1 0 2 1 pid=24766_fd=8
0.1 0 2 0 pid=24766_fd=15
0.0 2 2 0 locale.alias /dev/hd2:69735
0.0 1 2 0 XLC_LOCALE /dev/hd2:69686
Most Active Segments
------------------------------------------------------------------------
#MBs #rpgs #wpgs segid segtype volume:inode
------------------------------------------------------------------------
0.0 3 0 8630 ???
Most Active Logical Volumes
------------------------------------------------------------------------
util #rblk #wblk KB/s volume description
------------------------------------------------------------------------
0.00 24 0 0.4 /dev/hd2 /usr
Most Active Physical Volumes
------------------------------------------------------------------------
util #rblk #wblk KB/s volume description
------------------------------------------------------------------------
0.00 24 0 0.4 /dev/hdisk0 N/A
4내용 중 가장 사용이 많이 되고 있는 파일, 논리적 볼륨, 디스크를 조사합니다.
4디스크 사용이 정말로 I/O의 영향인지 page in/out의 영향인지 조사합니다.
4사용이 아주 많은 파일이나 논리적 볼륨이 하나의 디스크에만 있는지 조사하여 그렇다면 다른 디스크로
옮깁니다.
"volume:inode"의 값은 있으나 "file"에 값이 없는 경우 다음과 같이 실행하면 파일을 검색할 수 있습니다.
#ncheck -i <inode> <mount point=volume>
□SMP 성능 조정
1. 각 프로세서의 상태를 보여줍니다.
#cpu_state -l
(SMP에서만 가능한 명령으로, 어떤 SMP의 경우는 지원되지 않습니다.)
2. 상세 정보를 보여줍니다.
① 프로세스/THREAD에 대한 프로세서가 “BND"값에 나타납니다.
#ps -m -o THREAD
USER PID PPID TID S CP PRI SC WCHAN F TT BND COMMAND
root 12768 20506 - T 0 60 0 - 28200011 pts/1 0 ftp
root 20506 20402 - A 1 60 1 - 240001 pts/1 1 -ksh
② 프로세스/THREAD에 대한 프로세서가 “CPUID"값에 나타납니다.
#pstat -A
THREAD TABLE:
SLT ST TID PID CPUID POLICY PRI CPU EVENT PROCNAME
0 s 3 0 unbound FIFO 10 78 swapper
t_flags: wakeonsig kthread
1 s 105 1 unbound other 3c 0 init
t_flags: local wakeonsig cdefer
2 r 205 204 0 FIFO 7f 78 wait
t_flags: sig_avail funnel kthread
3 r 307 306 1 FIFO 7f 78 wait
t_flags: sig_avail funnel kthread
③ 모든 프로세서의 작업량이 나타납니다.
#sar -P ALL
00:00:00 cpu %usr %sys %wio %idle
01:00:00 0 2 1 0 96
1 2 1 0 97
- 2 1 0 96
02:00:00 0 2 2 1 95
1 2 2 1 95
- 2 2 1 95
④ 커널의 Thread(kthr)가 나타납니다.
#vmstat
'IBM > AIX' 카테고리의 다른 글
AIX 파일분할 및 합치기 - split (0) | 2013.05.24 |
---|---|
AIX vmstat 설명 (0) | 2013.05.24 |
AIX error 코드 (0) | 2013.05.24 |
p5 570 LPAR 구성을 위한 SLOT 정보 (0) | 2013.05.24 |
root 패스워드 복구 (0) | 2013.05.24 |