top, prstat, rstat - 윈디하나의 솔라나라
목차
개요
유닉스/솔라리스에서 시스템 상태를 간략하게 볼 수 있는 대표적인 프로그램인 top과 prstat에 대한 설명이다.
top
설치
솔라리스 11에는 top 3.8 beta 1 이 이미 설치되어있으므로, 소스를 받아 설치해서는 안된다.
root@wl ~/src # wget http://www.unixtop.org/dist/top-3.8beta1.tar.gz
root@wl ~/src # tar xvfz top-3.8beta1.tar.gz
root@wl ~/src # cd top-3.8beta1
root@wl ~/src/top-3.8beta1 # ./configure
...
config.status: creating top.1
config.status: creating config.h
root@wl ~/src/top-3.8beta1 # make
...
cc -DHAVE_CONFIG_H -I. -I. -g -v -o top color.o commands.o display.o hash.o s
creen.o top.o username.o utils.o version.o m_sunos5.o -lm -ltermcap -lkvm -lkst
at -lelf
root@wl ~/src/top-3.8beta1 # make install
...
./install-sh -c -m 755 \
top /usr/local/bin/top
root@wl ~/src/top-3.8beta1 #
실행 및 화면 설명
top의 사용 방법은 매우 쉽다. 그냥 top을 실행시키면 된다. 종료하려면 q 를 누른다.
root@wl ~ # top
last pid:1) 14149; load avg:2) 0.03, 0.06, 0.08; up 46+07:54:14 15:57:473)
56 processes: 55 sleeping, 1 on cpu4)
CPU states: 97.6% idle, 1.4% user, 1.0% kernel, 0.0% stolen, 0.0% swap5)
Kernel: 224 ctxsw, 7 trap, 232 intr, 230 syscall, 7 flt8)
Memory: 2048M phys mem, 1873M free mem, 2048M total swap, 2048M free swap6)
This terminal can only display 18 processes9)
PID USERNAME NLWP PRI NICE SIZE RES STATE TIME CPU COMMAND7)
2698 windy 1 59 0 4024K 2172K cpu/0 0:00 0.05% top
2688 windy 1 59 0 15M 5432K sleep 0:00 0.02% sshd
567 root 32 59 0 9380K 3988K sleep 0:00 0.00% nscd
11 root 13 59 0 13M 11M sleep 0:03 0.00% svc.startd
898 root 1 59 0 5124K 1264K sleep 0:00 0.00% dhcpagent
219 root 6 59 0 7052K 3140K sleep 0:00 0.00% devfsadm
13 root 17 59 0 27M 26M sleep 0:54 0.00% svc.configd
170 root 5 60 -20 2644K 1300K sleep 0:00 0.00% zonestatd
740 root 27 59 0 29M 14M sleep 0:00 0.00% fmd
44 root 6 59 0 15M 7008K sleep 0:00 0.00% dlmgmtd
686 root 4 59 0 7224K 5456K sleep 0:00 0.00% hald
257 daemon 3 59 0 10M 4468K sleep 0:00 0.00% kcfd
565 root 1 59 0 10M 3956K sleep 0:00 0.00% cupsd
2687 root 1 59 0 11M 3612K sleep 0:00 0.00% sshd
973 root 4 59 0 10M 3412K sleep 0:00 0.00% rad
713 root 4 59 0 7232K 3148K sleep 0:00 0.00% inetd
72 netadm 5 59 0 4236K 2800K sleep 0:00 0.00% ipmgmtd
마지막으로 할당된 PID. 따라서 PID에서 가장 큰 값을 의미하지는 않는다. 단지 얼마나 빨리 프로세스가 생성되는지 대략적인 가늠만 할 수 있을 뿐이다. (PID는 순차적으로 할당되지 않는다) root권한으로 top을 실행해야 표시된다. 버전에 따라 표시되지 않는 경우도 있다. (3.8에서는 표시되지 않는다)
로드 평균(Load Average). 로드란 시스템 스케줄러의 런 큐에 대기하고 있는 쓰레드의 개수로, '부하'라고도 번역된다. 일반적으로 시스템의 부하는 로드 평균값이 높은 것을 의미한다. (항상 그런것은 아니다) 보통 일정한 시간(예를 들어 10밀리초)마다 런 큐의 길이를 재어 평균낸 값이다. 왼쪽부터 차례대로, 1분, 5분, 15분간 평균 로드값을 나타낸다. 시스템과 어플리케이션마다 차이있지만, 스팍 CPU의 경우 [동시에 처리할 수 있는 쓰레드 개수 * 4] 까지는 성능에 이상 없을 것이다.
솔라리스 10부터는 이 값의 측정 방법이 변경되었다. 기존 방법으로는, 측정 주기보다 빨리 소멸한 쓰레드의 경우 측정되지 않았기 때문에 부하가 낮은것으로 출력되었기 때문이다. 솔라리스 10부터는 감가상각 알고리즘을 바탕으로 마이크로코드를 기반으로 측정하고 있어 좀 더 정확한 값이 나온다.
시스템 가동시간(Uptime)및 현재 시간
모든 프로세스 상태 개요. 총 개수와 각각의 상태를 가리킨다.
On cpu: 현재 CPU에 의해 실행되고 있는 프로세스 개수
Running: 실행할 수 있는 프로세스 개수. On CPU와 Running인 프로세스가 많다는 것은 시스템에 부하가 많다는 뜻이다.
Sleeping: 외부 이벤트/입력을 기다리고 있는 프로세스 개수
Stopped: Ctrl+Z와 같은, 정지 시그널로 정지된 프로세스 개수
Swapped: 디스크로 스왑되고 있는 프로세스 개수. 0이어야 한다.
Zombie: 프로세스는 종료되어 부모 프로세스에게 종료된 상태를 전달하려 했지만, 부모 프로세스가 상태를 받지 않은 경우 자식 프로세스가 좀비 프로세스가 된다. defunct 프로세스라고도 부른다. 없어야 한다. preap(1) 을 사용해 없앨 수 있다.
CPU 상태 표시
Idle: 대기 중(실행할 다른 프로세스가 없음)인 CPU 시간
User: 유저 프로세스 실행중인 CPU 시간
Kernel: 커널 시스템 콜, 페이지 폴트, 인터럽트 수행 중인 CPU 시간
IOWait: 대기 중(I/O 가 완료될 때까지, 실행할 다른 프로세스가 없음)인 CPU 시간
Stolen: 하이퍼바이저에서 할당해주지 않은 CPU 시간 (이는 솔라리스가 GUEST OS 로 실행될때에 0 이상의 값이 표시됨. CPU Steal Time 이라고도 한다)
Swap: 스와핑 또는 페이징하는 중인 CPU 시간
Idle 과 IOWait는 동일하게 '대기중'이란 의미를 가지며, 실행할 프로세스가 없다는 의미다. 필자는 두 수치를 해석할 때 의미에 크게 차이두지 않는다. 솔라리스 11.4 에 번들되어있는 top 명령에는 IOWait 가 표시되지 않는다.
메모리 상태 표시
phys mem
: 프로세스가 사용할 수 있는 물리 메모리 양 (커널에 의해 예약된 영역 제외)
free mem
: 남은 메모리 양
total swap
: 사용된 스왑 메모리 양
free swap
: 남은 스왑 메모리 양
솔라리스에서 남은 메모리는 커널과 어플리케이션에서 사용한 메모리보다 적을 수 있다. 이는 ZFS 캐시에서 사용하는 것으로, 시스템에서 메모리가 부족하면 즉시 ZFS 캐시에 할당된 메모리를 돌려받아 시스템에 돌려주기 때문에 문제되지 않는다.
프로세스 상태 표시
PID
: 프로세스 아이디
USERNAME
: 프로세스 소유자 이름
NLWP/LWP/THR
: LWP 또는 쓰레드 개수 (SUN은 쓰레드와 LWP는 다르다! 고 하지만 유닉스 쓰레드가 LWP를 이용해 구현되기 때문에 비슷한 개념인건 맞다). 모든 프로세스는 1개 이상의 쓰레드를 가진다. top 버전마다 표시되는 컬럼의 이름은 다르지만, 같은 의미다.
PRI
: 우선순위. 솔라리스에서 사용자 프로세스의 우선순위 범위는 0 ~ 59 으로 커널에 의해 자동으로 결정된다. 이 값을 사용자가 직접 지정할 수는 없지만, priocntl(1) , nice(1) 을 사용해 간접적으로 조절을 시도해 볼 수 있다. 값이 높을 수록 우선순위가 높다. 이 값에 신경쓸필요는 없다. 솔라리스 커널은 똑똑하니 말이다.
NICE
: 나이스. 우선순위를 결정하기 위해 커널에서 참고하는 값이다. 사용자가 nice(1) 을 사용해 설정할 수 있으며 설정하지 않으면 0이다. 커널은 이 값이 낮을수록 우선순위 값을 높게 설정한다. 솔라리스에서는 -20 ~ 20 까지 설정할 수 있다.
SIZE
: 프로세스에 할당된 메모리 양. 물리 메모리 + 가상 메모리 + 공유 메모리 + ... 의 값이다.
RES
: 프로세스에 의해 사용된 물리 메모리 양. RES는 RESident set size의 약어로 RSS 으로 표기하기도 한다.
STATE
: 프로세스 상태. CPU, RUN, SLEEP, STOP, SWAP, ZOMB가 있다. 자세한 내용은 [4) 프로세스 상태]를 참고하자.
TIME
: 프로세스가 사용한 CPU시간이다. 1:00 이라 되어있으면 해당 프로세스는 1분동안 CPU를 100% 소모한것과 같다. 1000분이 넘으면 H(시간)으로 단위가 바뀐다. [127.4H]라면 127시간 + 0.4시간(24분) 이라는 뜻이다.
FLTS
: TOP이 실행된 이후 생긴 메이저 페이지 폴트 회수. 일반적인 경우 0에 가까워야 한다.
CPU
: 현재 프로세스의 총 CPU 대비 사용률. TOP는 이를 기준으로 프로세스 목록을 정렬한다. 1개의 CPU가 있는 시스템에서 [30%]라 되어있으면 해당 프로세스는 전체의 30%를 사용하고 있는 것이다. 4개의 CPU가 있는 시스템에서 [25%]라 나왔다면, 해당 프로세스는 CPU 1개를 100% 소비하고 있다고 해석된다.
COMMAND
: 프로세스를 실행한 커맨드.
커널 개요 표시 (TOP 3.7이상)
ctxsw
: 초당 컨텍스트 스위치 회수
trap
: 초당 트랩1) 회수
intr
: 초당 인터럽트 호출 회수
syscall
: 초당 시스템 콜 호출 회수
fork
: 초당 fork(2) , vfork(2) 시스템 콜 호출 회수
flt
: 초당 페이지 폴트 회수
pgin
: 초당 페이지 인 회수
pgout
: 초당 페이지 아웃 회수
1) 트랩(Trap)은 예외적인 상황이 발생해 동기화된 인터럽트 로 생각할 수 있다. 디버깅에서 사용하는 브레이크 포인트가 걸렸거나, 잘못된 메모리 접근으로 인한 폴트가 이에 해당된다.
터미널 라인 표시. 실행시 이 터미널은 18개의 프로세스만을 표시할 수 있습니다 라고 안내해준다.
사용
실행 옵션
-C, --color: 컬러 사용 안함
-I, --idle-procs: 유휴 프로세스 표시 안함(기본값은 표시)
-S, --system-procs: 시스템 프로세스(페이징데몬, 스와핑 데몬등등) 보임(기본값은 표시 안함)
-T, --tag-names: 사용 가능한 컬러 태그 목록 보임
-a, --all: 모든 포로세스를 보임("-d all all" 과 동일)
-b, -n, --batch: 배치모드. 표준 출력이 터미널이 아니거나 더미 터미널인 경우 기본값. 터미널로부터의 모든 입력 무시.(인터럽트 캐릭터 예를 들어 Ctrl+C등은 유효함)
-c, --full-commands: 프로세스의 커맨드 라인을 모두 보임(모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨)
-i, --interactive: 인터랙티브 모드 사용. 표준 출력이 터미널인 경우 기본값.
-q, --quick: top을 -20으로 renice 한 후 실행. 루트로만 가능.
-u, --uids: UID를 사용자이름으로 변경하지 않음.
-v, --version: 버전 출력
-d count, --displays count: 지정한 회수만큼 출력하고 종료. 터미널에서의 기본값은 'infinity'. 수치 외에 'infinity', 'maximum', 'all' 을 사용할 수 있다.
-s time, --delay=time: 갱신 지연 시간(초). 기본값은 5.
-o field, --sort-order=field: 정렬 순서. 컬럼명(7) )을 소문자로 써주면 된다. (예: cpu, size, res, time)
-U username, --user=username: 해당 사용자의 프로세스만 보임
대화형 명령
h, ?: 도움말, 버전정보
C: 컬러 사용 여부
c: 지정한 문자열을 포함하는 커맨드를 가진 프로세스만 표시. 빈 문자열의 경우 모든 프로세스를 표시. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨)
d: 지정된 회수만큼 프로세스를 보임. 1이면 한번 보여주고 바로 종료됨. 기본값은 무한대.
f: 풀 커맨드 라인을 보일것인지 여부
H: 쓰레드를 각각의 라인마다 보여줌. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서도 지원안됨. [prstat -L]사용할것)
i, I: 유휴 프로세스를 보일 것인지 여부
k: 시그널 전송. k를 누른 후 kill 명령 뒤의 내용을 써준다
M: 메모리 사용량을 기준으로 정렬. [o size] 대화형 명령의 약어임
m: 또다른 디스플레이 모드를 사용함. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서도 지원안됨)
N: PID 기준으로 정렬. [o pid] 대화형 명령의 약어임
n, #: 표시할 프로세스의 개수를 지정. n을 누른 후 숫자를 입력한 다음 엔터를 입력한다.
o: 정렬 순서를 변경. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨) top 실행시 보이는 컬럼명을 소문자로 입력하고 엔터를 입력한다. 컬럼의 종류는 플랫폼마다 다르지만 cpu, res, size, time 은 보통 존재할것이다. 기본값은 cpu.
P: CPU사용량을 기준으로 정렬 [o cpu] 대화형 명령의 약어임
q: top 종료
r: 프로세스 우선순위를 결정. r을 누른 후 renice 명령 뒤의 내용을 써준다.
s: 표시할 시간의 지연시간을 결정. 숫자를 입력한다
T: CPU 사용시간을 기준으로 정렬. [o time] 대화형 명령의 약어임
U: 사용자명, UID 중 어느것으로 표시할 것인지 여부
u: 지정한 사용자가 소유한 프로세스만 표시. [+]인 경우 모든 사용자가 표시됨
컬러 사용
환경변수인 TOPCOLORS
에 내용을 세팅하면 top(1) 을 실행할 때 색상으로 구분되어 출력된다. 아래와 같은 형식으로 세팅한다.
컬럼코드=[최소],[최대]#색상번호[;색상번호...][:컬럼코드=[최소],[최대]#색상번호[;색상번호...] ...]
환경변수에 사용되는 컬럼코드는 아래와 같이 조회할 수 있다.
windy@wl ~ $ top -T
These color tags are available:
1min 5min 15min header cpu.idle cpu.user cpu.kernel cpu.stolen cpu.swap
kernel.ctxsw kernel.trap kernel.intr kernel.syscall kernel.fork kernel.flt
kernel.pgin kernel.pgout memory.physmem memory.freemem memory.totalswap
memory.freeswap
...
색상번호는 ANSI코드와 같다. 색상코드는 color.h에 나와 있으며 다음과 같다.
속성 글자 색상 번호 배경 색상 번호
0 초기화 30 검은색 40 검은색
1 밝게 31 붉은색 41 붉은색
2 흐릿하게 32 녹색 42 녹색
4 아랫줄 33 노란색 43 노란색
5 깜빡임 34 파란색 44 파란색
7 반전 35 붉은자주색(Magenta) 45 붉은자주색(Magenta)
8 숨김 36 맑은파란색(Cyan) 46 맑은파란색(Cyan)
37 흰색 47 흰색
최소, 최대값중 로드 평균을 나타내는 값은 원래 값에 100을 곱한 값을 넣어야 한다. (소숫점 2째자리까지 표현하기 위함이다)
예를들어 1min=500,1000#31
와 같이 지정하면 1분단위 로드에서 5.00이상 10.00이하면 붉은색으로 표시한다.
예) TOPCOLORS="1min=100,300#32:1min=300,500#33:1min=500,#31:5min=100,300#32:5min=300,500#33:5min=500,#31:15min=100,300#32:15min=300,500#33:15min=500,#31:header=,#36:memory.physmem=,100#31;1"
prstat
솔라리스에 번들되어있는 시스템 모니터링 툴로 prstat(8) 이 있다. 번들 되어있는 만큼 솔라리스에서 유용하게 사용할 수 있는 전용 커맨드도 많아 top(1) 보다는 더 솔라리스에 맞게 보여준다.
실행 및 화면 설명
기본적으로 top 과 비슷하다.
root@wl ~ # prstat
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
1033 root 7272K 2776K cpu0 54 0 0:00:00 0.5% prstat/1
602 noaccess 166M 109M sleep 59 0 0:01:37 0.4% java/18
491 root 35M 26M sleep 59 0 0:00:31 0.2% Xorg/1
919 root 9000K 4116K sleep 59 0 0:00:00 0.1% sshd/1
638 root 19M 13M sleep 59 0 0:00:15 0.1% dtgreet/1
925 root 5156K 1888K sleep 59 0 0:00:00 0.0% bash/1
236 root 4876K 1348K sleep 59 0 0:09:58 0.0% VBoxService/2
642 root 8520K 1948K sleep 59 0 0:00:02 0.0% sendmail/1
142 root 9488K 3060K sleep 59 0 0:00:04 0.0% nscd/30
9 root 8920K 7404K sleep 59 0 0:01:07 0.0% svc.configd/15
385 root 6120K 1560K sleep 59 0 0:00:00 0.0% sshd/1
233 root 4988K 1136K sleep 59 0 0:00:00 0.0% cron/1
365 root 1428K 700K sleep 59 0 0:00:00 0.0% utmpd/1
137 root 1756K 1092K sleep 59 0 0:00:00 0.0% powerd/3
640 smmsp 8648K 1728K sleep 59 0 0:00:00 0.0% sendmail/1
132 root 7612K 2240K sleep 59 0 0:00:00 0.0% syseventd/15
376 root 17M 10M sleep 59 0 0:00:03 0.0% fmd/19
309 daemon 2800K 1308K sleep 59 0 0:00:00 0.0% rpcbind/1
150 root 5280K 1968K sleep 59 0 0:00:00 0.0% picld/4
373 root 2432K 1428K sleep 59 0 0:00:00 0.0% ttymon/1
340 root 2436K 1344K sleep 59 0 0:00:00 0.0% ttymon/1
Total: 42 processes, 181 lwps, load averages: 0.02, 0.02, 0.02
root@wl ~ # prstat -a
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
1034 root 7272K 2780K cpu0 44 0 0:00:00 0.5% prstat/1
602 noaccess 166M 109M sleep 59 0 0:01:37 0.4% java/18
491 root 35M 26M sleep 59 0 0:00:31 0.2% Xorg/1
638 root 19M 13M sleep 59 0 0:00:15 0.1% dtgreet/1
236 root 4876K 1348K sleep 59 0 0:09:58 0.0% VBoxService/2
919 root 9000K 4116K sleep 59 0 0:00:00 0.0% sshd/1
925 root 5156K 1888K sleep 59 0 0:00:00 0.0% bash/1
142 root 9488K 3060K sleep 59 0 0:00:04 0.0% nscd/30
642 root 8520K 1948K sleep 59 0 0:00:02 0.0% sendmail/1
396 root 5860K 1640K sleep 59 0 0:00:00 0.0% syslogd/11
9 root 8920K 7404K sleep 59 0 0:01:07 0.0% svc.configd/15
376 root 17M 10M sleep 59 0 0:00:03 0.0% fmd/19
309 daemon 2800K 1308K sleep 59 0 0:00:00 0.0% rpcbind/1
150 root 5280K 1968K sleep 59 0 0:00:00 0.0% picld/4
373 root 2432K 1428K sleep 59 0 0:00:00 0.0% ttymon/1
NPROC USERNAME SWAP RSS MEMORY TIME CPU
38 root 67M 97M 13% 0:12:35 0.9%
1 noaccess 83M 161M 21% 0:01:37 0.4%
1 smmsp 1256K 6068K 0.8% 0:00:00 0.0%
2 daemon 1644K 6188K 0.8% 0:00:00 0.0%
Total: 42 processes, 181 lwps, load averages: 0.02, 0.02, 0.02
root@wl ~ # prstat -v
PID USERNAME USR SYS TRP TFL DFL LCK SLP LAT VCX ICX SCL SIG PROCESS/NLWP
1060 root 30 66 0.7 0.0 0.0 0.0 0.0 4.0 0 434 17K 0 prstat/1
639 root 2.9 6.8 0.0 0.0 0.0 0.0 85 5.5 1K 24 1K 0 /0
236 root 0.0 1.8 0.0 0.0 0.0 98 0.0 0.0 0 0 6 0 VBoxService/2
491 root 0.1 0.1 0.0 0.0 0.0 0.0 100 0.2 20 0 83 10 Xorg/1
638 root 0.0 0.1 0.0 0.0 0.0 0.0 100 0.0 10 0 51 0 dtgreet/1
919 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 3 0 27 0 sshd/1
697 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 2 0 23 0 sshd/1
602 noaccess 0.0 0.0 0.0 0.0 0.0 72 28 0.0 5 0 7 0 java/18
9 root 0.0 0.0 0.0 0.0 0.0 13 87 0.1 4 0 11 0 svc.configd/15
925 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 10 0 bash/1
642 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 1 0 8 0 sendmail/1
7 root 0.0 0.0 0.0 0.0 0.0 36 64 0.0 2 0 5 0 svc.startd/14
361 root 0.0 0.0 0.0 0.0 0.0 25 75 0.0 1 0 3 0 inetd/4
1 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 1 0 init/1
918 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 sshd/1
696 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 sshd/1
365 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 utmpd/1
376 root 0.0 0.0 0.0 0.0 0.0 68 32 0.0 0 0 0 0 fmd/19
373 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 ttymon/1
385 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 sshd/1
233 root 0.0 0.0 0.0 0.0 0.0 0.0 100 0.0 0 0 0 0 cron/1
Total: 42 processes, 181 lwps, load averages: 0.04, 0.03, 0.02
-v, -m 옵션을 붙인 경우 각 컬럼별 의미는 다음과 같다다.
USR: 프로세스가 user 모드에서 소비되는 시간 비율(%)
SYS: 프로세스가 system 모드에서 소비되는 시간 비율(%)
TRP: 프로세스가 system trap을 처리하기 위해 소비되는 시간 비율(%)
TFL: 프로세스가 text 페이지 폴트를 처리하기 위해 소비되는 시간 비율(%)
DFL: 프로세스가 data 페이지 폴트를 처리하기 위해 소비되는 시간 비율(%)
LCK: 프로세스가 사용자 락을 대기하는데 소비되는 시간 비율(%)
SLP: 프로세스가 sleep 하는데 소비되는 시간 비율(%)
LAT: 프로세스가 CPU를 기다리는데 소비되는 시간 비율(%). 이 값이 가장 유용하게 쓰일것이다. prstat -mL
명령을 사용해보자.
VCX: 프로세스의 voluntary 컨텍스트 스위치 회수
ICX: 프로세스의 involuntary 컨텍스트 스위치 회수
SCL: 프로세스의 시스템 콜 회수
SIG: 프로세스의 받은 시그널 개수
자세한 사항은 prstat(1) 을 참조하자.
NumaTOP
rstat
RPC를 사용한 원격 호스트의 상태를 알 수 있는 rstat(3rpc) 서비스가 있다. 이 서비스의 클라이언트로 솔라리스에서는 rup(1) 가 있다. 리눅스에서는 rstatd 4 Linux 를 설치해 사용해볼 수 있다.
root@wl ~ # svcadm enable /network/rpc/rstat:default
root@wl ~ # rpcinfo -p
...
100001 2 udp 42277 rstatd
100001 3 udp 42277 rstatd
100001 4 udp 42277 rstatd
root@wl ~ # rup localhost wl
localhost up 1 days, 00:00, load average: 0.15, 0.14, 0.12
wl up 1 days, 00:00, load average: 0.15, 0.14, 0.12
아래는 간단한 rstat 클라이언트 예제다.
/*
Simple rstat client for Solaris
WindyHana's Solanara http://www.solanara.net/solanara/top
cc -lrpcsvc -lsocket -lnsl -o rstat rstat.c
*/
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <rpc/rpc.h>
#include <rpcsvc/rstat.h>
char DEFAULT_HOST[] = "127.0.0.1";
int main(int argc, char *argv[]) {
struct statstime statp1;
struct statstime statp2;
enum clnt_stat rlt1 = (enum clnt_stat) rstat(DEFAULT_HOST, &statp1);
if (rlt1 != RPC_SUCCESS) {
clnt_perrno(rlt1);
return 1;
}
sleep(1);
enum clnt_stat rlt2 = (enum clnt_stat) rstat(DEFAULT_HOST, &statp2);
int hd = havedisk(DEFAULT_HOST);
if (rlt2 == RPC_SUCCESS) {
printf("Load: %.2f / %.2f / %.2f\n",
statp1.avenrun[0] * 1.0 / FSCALE, statp1.avenrun[1] * 1.0 / FSCALE, statp1.avenrun[2] * 1.0 / FSCALE);
unsigned int cpu_user = statp2.cp_time[RSTAT_CPU_USER] - statp1.cp_time[RSTAT_CPU_USER];
unsigned int cpu_nice = statp2.cp_time[RSTAT_CPU_NICE] - statp1.cp_time[RSTAT_CPU_NICE];
unsigned int cpu_sys = statp2.cp_time[RSTAT_CPU_SYS] - statp1.cp_time[RSTAT_CPU_SYS];
unsigned int cpu_idle = statp2.cp_time[RSTAT_CPU_IDLE] - statp1.cp_time[RSTAT_CPU_IDLE];
unsigned int cpu_total = cpu_user + cpu_nice + cpu_sys + cpu_idle;
printf("DISK: ");
for (int i = 0; i < RSTAT_DK_NDRIVE; i ++) {
printf("%d=%dops/s%s", i, statp2.dk_xfer[i] - statp1.dk_xfer[i], i + 1 != RSTAT_DK_NDRIVE ? ", " : "");
}
printf("\n");
printf("CPU: %.1f%% user, %.1f%% nice, %.1f%% sys, %.1f%% idle\n",
cpu_user * 100.0 / cpu_total,
cpu_nice * 100.0 / cpu_total,
cpu_sys * 100.0 / cpu_total,
cpu_idle * 100.0 / cpu_total);
printf("INET: %d i_pkts/s, %d i_errs/s, %d o_pkts/s, %d o_errs/s, %d col/s\n",
statp2.if_ipackets - statp1.if_ipackets,
statp2.if_ierrors - statp1.if_ierrors,
statp2.if_opackets - statp1.if_opackets,
statp2.if_oerrors - statp1.if_oerrors,
statp2.if_collisions - statp1.if_collisions);
printf("MEM: %u pgin/s, %u pgout/s, %u swpin/s, %u swpout/s, %u intr/s, %u swtch/s\n",
statp2.v_pgpgin - statp1.v_pgpgin,
statp2.v_pgpgout - statp1.v_pgpgout,
statp2.v_pswpin - statp1.v_pswpin,
statp2.v_pswpout - statp1.v_pswpout,
statp2.v_intr - statp1.v_intr,
statp2.v_swtch - statp1.v_swtch);
long tv_sec_b = statp2.boottime.tv_sec;
struct tm * struct_time_b = localtime(&tv_sec_b);
printf("BOOT TIME: %s", asctime(struct_time_b));
long tv_sec_c = statp2.curtime.tv_sec;
struct tm * struct_time_c = localtime(&tv_sec_c);
printf("CUR TIME: %s", asctime(struct_time_c));
printf("%s\n", hd == 1 ? "Have Disk" : "No Disk or Not Determined");
} else {
clnt_perrno(rlt2);
}
return 0;
}
팁
top과 prstat, rstat등을 과신하지 않는다. 부하에 대한 판단은 여러가지 정보를 종합적으로 생각해야 한다.
NICE와 PRI에 대한 설명이 복잡하게 느껴질지도 모르겠다. 한마디로 우선순위는 사용자가 임의로 정해줄 수 없다는 것이다. 그나마 다행인건 솔라리스 커널이 꽤 똑똑하게 PRI값을 정해준다는 사실이다. nice, renice, priocntl(솔라리스 8 이상) 커맨드를 참고하자