본문 : http://www.ischo.net -- 조인상 //시스템 엔지니어

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


[AIX] 시스템 성능의 병목원인 분석  조회 (109)

AIX 4.3 | 2006/12/08 (금) 18:53  공감 (0)  스크랩 (0)   



시스템 전반의 성능에 있어 병목을 일으키는 요인을 분석하려면 다음의 명령들이 사용됩니다.
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
(*.95.187.205)