여러분도 아시다시피 prstat 과 vmstat 는 시스템의 퍼포먼스를 체크할 때 쓰입니다. 그러나 종종 prstat 가 보여주는 결과가 vmstat 이 보여주는
결과와 크게 다른 경우가 있습니다.
이런 일이 벌어질때 우리는 어떤 결과를 믿어야 할까요? 일반적으로 우리는 vmstat 의 결과를 더 신뢰해야 합니다. 이 글은
아래와 같은 예제를 통해서 왜 그런지에 대해 설명할 것입니다:
참고: 이 글의 정보는 솔라리스9 혹은 10 에서 적용됩니다.
메모리 사용량 예제
8GB 메모리를 가진 시스템에서 필자는 Oracle9i Database Enterprise Edition version 9.2.0.7 을 설치 했고 최대 메모리가
약 1 GB 인 상태로 설정했고 셧다운 된 상태입니다.
vmstat 는 시스템이 현재 약 6.1 GB 정도의 사용가능한 메모리를 가지고 있다고 출력합니다.
# vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7189112 5702984 32 46 133 1 1 0 0 0 0 0 0 585 2205 1589 0 1 98 0 0 0 8831928 6112816 0 2 0 0 0 0 0 0 0 0 0 390 1492 1399 0 0 100 0 0 0 8831928 6112816 0 0 0 0 0 0 0 0 0 0 0 418 1599 1469 0 0 100
prstat 는 유저 oracle 이 107 MB 메모리를 사용하고 있다고 출력합니다.
# prstat -a
NPROC USERNAME SIZE RSS MEMORY TIME CPU
7 feng 22M 13M 0.2% 0:00:00 0.1%
73 root 1103M 371M 4.6% 0:24:21 0.0%
16 oracle 489M 107M 1.3% 0:00:03 0.0%
28 cpadmin 2172M 647M 8.2% 0:02:46 0.0%
1 lp 2920K 1352K 0.0% 0:00:00 0.0%
1 daemon 2512K 1792K 0.0% 0:00:00 0.0%
Oracle 을 시작해 보겠습니다.
SQL> startup ORACLE instance started. Total System Global Area 1075284744 bytes
vmstat 는 시스템이 약 5.3 GB 정도의 사용가능한 메모리를 가지고 있다고 출력합니다.
# vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7189160 5702992 32 46 133 1 1 0 0 0 0 0 0 585 2205 1589 0 1 98 0 0 0 6993104 5364640 0 2 0 0 0 0 0 0 0 0 0 387 1498 1407 0 0 100 0 0 0 6993104 5364640 0 0 0 0 0 0 0 0 0 0 0 379 1503 1406 0 0 100
그리고 prstat 는 유저 oracle 이 7.5 GB 의 메모리를 사용하고 있다고 출력합니다.
# prstat -a
NPROC USERNAME SIZE RSS MEMORY TIME CPU
6 feng 20M 12M 0.1% 0:00:00 0.1%
73 root 1103M 371M 4.2% 0:24:21 0.1%
31 oracle 18G 7561M 88% 0:00:02 0.0%
1 lp 2920K 1352K 0.0% 0:00:00 0.0%
1 daemon 2512K 1792K 0.0% 0:00:00 0.0%
27 cpadmin 2153M 638M 7.4% 0:02:46 0.0%
prstat -a 커맨드는 단순히 유저의 각 프로세스의 메모리를 더해 줍니다.
# ps -eo user,rss,pid,args | grep '^ *oracle' | sort -r -n -k 2,2 oracle 486248 20090 oracleORALSCOT (DESCRIPTION=(LOCAL=YES) (ADDRESS=(PROTOCOL=beq))) oracle 483112 20078 ora_qmn0_ORALSCOT oracle 482336 20093 oracleORALSCOT (LOCAL=NO) oracle 481792 20095 oracleORALSCOT (LOCAL=NO) oracle 480800 20066 ora_dbw0_ORALSCOT oracle 479560 20072 ora_smon_ORALSCOT oracle 479168 20068 ora_lgwr_ORALSCOT oracle 479096 20074 ora_reco_ORALSCOT oracle 478632 20076 ora_cjq0_ORALSCOT oracle 478536 20064 ora_pmon_ORALSCOT oracle 478056 20070 ora_ckpt_ORALSCOT oracle 477208 20080 ora_s000_ORALSCOT oracle 476560 20082 ora_d000_ORALSCOT oracle 476040 20086 ora_arc1_ORALSCOT oracle 475984 20084 ora_arc0_ORALSCOT
필자는 prstat -a 와 동일한 로직을 이용하는 펄 스크립트를 짰고 이 스크립트는 유저 oracle 이 7.2 GB 의 메모리를 사용하고 있다고 출력했습니다.
# ./psusedmemorybyuser.pl User Used Vir Mem Used Phy Mem Percent of Phy Mem oracle 17478336 7277728 88.839453125 root 2185424 839112 10.24306640625 lp 2920 1352 0.01650390625 feng 22648 14112 0.172265625 daemon 2512 1792 0.021875 cpadmin 2223928 660024 8.05693359375
prstat 커맨드는 단순히 유저의 각 프로세스의 메모리를 더해줘서는 안됩니다 왜냐하면 많은 프로세스들이 서로 메모리를
공유하고 있기 때문입니다. 프로세스 20078 번을 살펴 보고 그것이 실제로 얼마 만큼의 메모리를 사용하고 있는지 살펴 봅시다.
# pmap -x 20078
20078: ora_qmn0_ORALSCOT
Address Kbytes RSS Anon Locked Mode Mapped File
0000000100000000 55704 23824 - - r-x-- oracle
0000000103764000 904 504 128 - rwx-- oracle
0000000103846000 464 336 336 - rwx-- [ heap ]
..............
FFFFFFFF7F500000 8 8 8 - rwx-- [ anon ]
FFFFFFFF7F600000 192 192 - - r-x-- ld.so.1
FFFFFFFF7F730000 16 16 16 - rwx-- ld.so.1
FFFFFFFF7FFDC000 144 144 144 - rw--- [ stack ]
---------------- ------- ------- ----- ----------
total Kb 1135000 741936 1792 -
20078 프로세스가 필요한 추가 메모리는 1,792 Kbytes (Anon) 이고 나머지 메모리들은 공유 메모리에서 얻어진 것들입니다.
CPU 사용량 예제
또 다른 예제를 살펴 봅시다. 이번에는 Oracle 을 운용하고 있는 동일한 시스템에서 CPU 사용량에 대해 살펴 봅시다. consumecpu.sh 스크립트는 하나의 CPU 를 100% 소모하고 있습니다.
# vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7191624 5702752 32 47 133 1 1 0 0 0 0 0 0 584 2204 1588 0 1 98 0 0 0 6991608 5363216 0 2 0 0 0 0 0 0 0 0 0 404 1551 1431 0 0 100 0 0 0 6991608 5363216 0 0 0 0 0 0 0 0 0 0 0 606 1526 1458 0 1 99 # # ./consumecpu.sh & [3] 23485 # vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7191608 5702728 33 48 133 1 1 0 0 0 0 0 0 584 2206 1588 0 1 98 0 0 0 6991288 5362944 1887 15569 0 0 0 0 0 0 0 0 0 449 35719 2542 16 35 49 0 0 0 6991272 5362880 1895 15633 0 0 0 0 0 0 0 0 0 463 35972 2567 17 33 49 # # prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 23485 root 1136K 1000K run 0 0 0:00:08 4.3% consumecpu.sh/1 13182 root 1952K 1736K cpu0 59 0 0:00:00 0.1% prstat/1 25955 root 17M 12M sleep 53 2 0:00:11 0.0% ns-httpd/2
그러므로 vmstat 에 의하면 consumecpu.sh 는 CPU 의 50% 를 소모하고 있습니다. 그러나 prstat 에 의하면 이 스크립트는 오직 4.3% 의 CPU 만을 소모 하고 있습니다.
consumecpu.sh 스크립트가 하는 일은 아래와 같습니다.
# cat consumecpu.sh
#!/bin/sh
while true
do
:
done
필자는 truss 를 이용해서 consumecpu.sh 에 의해 유발되는 fork 시스템콜의 빈도를 추적해 봤습니다.
# truss -c -t fork ./consumecpu.sh
^Csyscall seconds calls errors
fork .316 804
-------- ------ -----
sys totals: .316 804 0
usr time: .030
elapsed: 3.510
보시는바와 같이 Bourne 쉘의 while 루프 내에 많은 fork 가 이루어지고 있습니다. 이러한 프로세스들은 아주 짧게 실행되므로 prstat 는 이들을 잡아내지 못합니다.
Bash 쉘의 while 루프를 실행해 봅시다.
# cat consumecpu.sh
#!/bin/bash
while true
do
:
done
# truss -c -t fork ./consumecpu.sh
^Csyscall seconds calls errors
-------- ------ -----
sys totals: .000 0 0
usr time: .000
elapsed: 3.670
fork 가 이루어지지 않고 있습니다.
# vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7191304 5702200 33 54 132 1 1 0 0 0 0 0 0 584 2218 1588 0 1 98 0 0 0 6994808 5366080 0 2 0 0 0 0 0 0 0 0 0 469 1567 1464 0 1 99 0 0 0 6994808 5366080 0 2 0 0 0 0 0 0 0 0 0 469 1567 1464 0 1 99 # # ./consumecpu.sh & [5] 4066 # vmstat 3 3 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr m0 m4 m5 m1 in sy cs us sy id 0 0 0 7191344 5702272 33 54 133 1 1 0 0 0 0 0 0 584 2219 1588 0 1 98 0 0 0 6991776 5363040 0 2 0 0 0 0 0 0 0 0 0 453 1628 1448 50 0 50 0 0 0 6991776 5363032 1 0 0 0 0 0 0 0 0 0 0 494 1559 1415 50 0 50 # # prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 4066 root 2520K 1872K cpu0 30 0 0:01:24 49% consumecpu.sh/1 4068 root 1952K 1728K cpu1 49 0 0:00:00 0.1% prstat/1 20078 oracle 1108M 472M sleep 59 0 0:00:01 0.0% oracle/1
이제 vmstat 와 prstat 는 consumecpu.sh 가 CPU 의 49% 를 소모한다고 동일하게 출력하고 있습니다.
감사의 인사
Darren Dunham 의 공헌에 감사 드립니다.
이 글의 영문 원본은
Understanding the Differences Between prstat and vmstat Output in the Solaris OS
에서 보실 수 있습니다.
"관리자코너" 카테고리의 다른 글
- 썬 버추얼 데스크탑 커넥터 1.0(베타)을 사용한 VDI 데모 구축 (댓글 0개 / 트랙백 0개) 2008/01/23
- 솔라리스 부트 매니저를 이용한 부트 디스크 미러링 방법 (댓글 1개 / 트랙백 0개) 2005/09/23
- 솔라리스 10 5/08 릴리스의 새로운 기능 (댓글 0개 / 트랙백 0개) 2008/06/11
- Solaris 10의 컨테이너를 이용하여 보안을 향상시키는 방법 - Part 1 of 2 (댓글 1개 / 트랙백 0개) 2005/10/23
- 설정 파일 관리 베스트 프랙티스 (댓글 0개 / 트랙백 0개) 2008/05/19
- The Zone Manager 스크립트 (댓글 1개 / 트랙백 0개) 2005/11/23
- 스크립트를 이용한 자동화된 시스템 체크 (댓글 0개 / 트랙백 0개) 2008/06/16
- 플래시 어카이브로 부터 솔라리스10 Branded 존 설치하기 (댓글 0개 / 트랙백 0개) 2008/08/19
- xVM DomU 지원을 솔라리스 라이브CD 배포판에 추가하기 (댓글 0개 / 트랙백 0개) 2008/12/05
- 솔라리스 레디 애플리케이션 및 솔루션 (댓글 0개 / 트랙백 0개) 2008/03/13
댓글을 달아 주세요