MY IT
System Resource 모니터링 Script
메롱씨티 배드맨
2012. 4. 14. 20:21
시스템 관리 프로세스의 기본은 시스템 리소스의 현황을 아는 것이다.
대부분의 Agent는 시스템 CPU, Memery, 디스크 용량 정도는 기본적으로 Admin에게 전송하는 기능을 갖추고 있다.
그래서 시스템의 시스템 정보를 읽어야 한다.
Solaris( Linux 역시도.. )의 명령행 스크립트를 실행하여 시스템 정보를 가져오는 Shell cmd를 작성해 본다.
프로그램에서 Parsing하기 좋으려면 꼭 필요한 정보만 Print로 떨어뜨리면 된다.
1. CPU 사용률 정보
CPU 사용률은 vmstat의 cpu 탭에서 user와 system의 사용률을 합한 값으로 계산한다.
$ vmstat
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr f0 s0 s2 s6 in sy cs us sy id
0 0 0 5568984 1644488 0 1 0 0 0 0 0 -0 0 0 -0 840 52 178 0 1 99
$ vmstat 를 치면 이렇게 떨어진다.
이중에서 우린 cpu 탭의 us와 sy 의 값만을 찾아야 한다.
그런데, vmstat의 첫번째 데이터는 정확한 값이 아니므로 2번째 이후부터의 값을 가져야 한다.
$ vmstat 1 2
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr f0 s0 s2 s6 in sy cs us sy id
0 0 0 5568984 1644480 0 1 0 0 0 0 0 -0 0 0 -0 840 52 178 0 1 99
0 0 0 5556672 1596608 0 16 0 0 0 0 0 0 0 0 0 852 130 191 0 1 99
vmstat를 1초 간격으로 2번 실행했다.
그런데 상위의 설명이 있는 두줄은 필요없다. 그래서 이 두 라인을 삭제하는데, egrep을 사용하여 faults와 free라는 단어가 있는 라인을 제외한다.
(다른 단어를 사용해도 상관없다.)
$ vmstat 1 2 | egrep -v "faults|free"
0 0 0 5568984 1644472 0 1 0 0 0 0 0 -0 0 0 -0 840 52 178 0 1 99
0 0 0 5556416 1596352 0 18 0 0 0 0 0 0 0 0 0 866 134 195 0 1 99
이렇게해서 타이틀 라인 두줄을 삭제했다.
이후 us가 있는 20번째 값과 sy 가 있는 21번째 값을 합한 값만 가져온다.
$ vmstat 1 2 | egrep -v "faults|free" | awk '{print $20+$21}'
1
1
이렇게 합한 값이 나왔다.
그런데 첫번째 값은 의미 없으므로 맨 마지막 값만 가져오면 된다.
$ vmstat 1 2 | egrep -v "faults|free" | awk '{a=$20+$21} END {print a}'
1
us와 sy의 합한 값을 a 에 저장하고 마지막 a만 출력하도록 했다.
이렇게 cpu의 사용률을 Parsing하기 좋게 뽑았다.
2. Memory 사용률 정보
prstat 명령으로 cpu 사용률을 가져온다.
prstat 명령을 내리면 모든 프로세스 정보가 다 나오므로 -a 옵션으로 사용자별 통계 데이터를 찾는다.
그리고 자동으로 갱신되므로 1초후에 1번만 갱신되도록 한다.
$ prstat -a 1 1
PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
9914 sqn 5824K 3568K cpu1 49 0 0:00:00 0.1% prstat/1
1681 noaccess 137M 132M sleep 59 0 1:06:12 0.0% java/18
1529 root 33M 21M sleep 59 0 0:10:21 0.0% Xsun/1
1639 root 13M 9464K sleep 59 0 0:11:51 0.0% dtgreet/1
9871 sqn 1952K 1416K sleep 49 0 0:00:00 0.0% ksh/1
168 root 9768K 5312K sleep 59 0 0:02:46 0.0% nscd/31
683 root 16M 11M sleep 59 0 0:00:49 0.0% fmd/20
621 root 4624K 2464K sleep 59 0 0:00:05 0.0% syslogd/13
612 root 5808K 2648K sleep 59 0 0:01:13 0.0% devfsadm/7
645 root 4696K 1808K sleep 59 0 0:00:00 0.0% sshd/1
462 daemon 3304K 2176K sleep 59 0 0:00:00 0.0% statd/1
602 root 6792K 2920K sleep 59 0 0:00:18 0.0% automountd/3
456 daemon 3536K 2384K sleep 59 0 0:00:00 0.0% rpcbind/1
498 root 1728K 952K sleep 59 0 0:00:07 0.0% utmpd/1
524 root 2440K 992K sleep 59 0 0:00:00 0.0% smcboot/1
479 root 2528K 1352K sleep 59 0 0:00:02 0.0% sac/1
522 root 2440K 1408K sleep 59 0 0:00:00 0.0% smcboot/1
481 root 8120K 5384K sleep 59 0 0:00:48 0.0% inetd/4
285 root 3416K 1384K sleep 59 0 0:00:00 0.0% cron/1
463 daemon 2848K 1824K sleep 60 -20 0:00:00 0.0% nfs4cbd/2
151 root 3024K 1464K sleep 59 0 0:00:00 0.0% powerd/3
125 root 7432K 3208K sleep 59 0 0:00:00 0.0% syseventd/16
601 root 6304K 2016K sleep 59 0 0:00:00 0.0% automountd/2
467 daemon 2848K 1840K sleep 60 -20 0:00:00 0.0% lockd/2
173 daemon 5248K 2872K sleep 59 0 0:00:00 0.0% kcfd/3
489 root 2944K 1760K sleep 59 0 0:00:02 0.0% ttymon/1
461 daemon 5344K 2376K sleep 59 0 0:00:25 0.0% nfsmapid/4
504 root 2944K 1808K sleep 59 0 0:00:00 0.0% ttymon/1
523 root 2440K 992K sleep 59 0 0:00:00 0.0% smcboot/1
241 root 2752K 1136K sleep 59 0 0:00:00 0.0% iscsi-initiator/2
600 root 5216K 2904K sleep 59 0 0:00:00 0.0% vold/4
10 root 11M 9840K sleep 59 0 0:02:10 0.0% svc.configd/17
8 root 12M 9640K sleep 59 0 0:00:57 0.0% svc.startd/14
NPROC USERNAME SWAP RSS MEMORY TIME CPU
3 sqn 2816K 6920K 0.3% 0:00:00 0.1%
1 noaccess 122M 137M 6.7% 1:06:12 0.0%
35 root 69M 96M 4.7% 0:34:05 0.0%
1 smmsp 2064K 7240K 0.3% 0:00:21 0.0%
6 daemon 7512K 9776K 0.5% 0:00:25 0.0%
우리가 사용할 것은 하단의 NPROC 부분의 사용자별 CPU 사용률의 총 합이므로
총합을 계산하기 위해 일단 필요없는 부분은 모두 제거한다.
$ prstat -a 1 1 | egrep -v "sleep|run|cpu|PID|NPROC|Total"
4 sqn 3064K 7168K 0.3% 0:00:00 0.1%
1 noaccess 122M 137M 6.7% 1:06:12 0.0%
35 root 69M 96M 4.7% 0:34:05 0.0%
1 smmsp 2064K 7240K 0.3% 0:00:21 0.0%
6 daemon 7512K 9776K 0.5% 0:00:25 0.0%
필요없는 부분을 제거했더니 사용자별 프로세스 사용률 통계만 나왔다.
여기서 다시 사용률 부분만을 가져와서 합을 구해야 한다.
사용률은 다섯번째에 있고 이를 숫자로 변환한 후 더하고 최종 합계만 출력하도록 한다.
$ prstat -a 1 1 | egrep -v "sleep|run|cpu|PID|NPROC|Total" | awk ' {a=int $5} {b+=substr(a, 1, 4)} END {print b}'
12.6
디스크 사용률을 보는 명령은 df -k 이다.
$ df -k
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c0t0d0s0 30893320 8587095 21997292 29% /
/devices 0 0 0 0% /devices
ctfs 0 0 0 0% /system/contract
proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
swap 5556648 1632 5555016 1% /etc/svc/volatile
objfs 0 0 0 0% /system/object
sharefs 0 0 0 0% /etc/dfs/sharetab
fd 0 0 0 0% /dev/fd
swap 5555400 384 5555016 1% /tmp
swap 5555080 64 5555016 1% /var/run
/dev/dsk/c0t1d0s0 70589121 1025493 68857737 2% /export/home
여기서 가상 경로는 제외하고 실 디스크의 사용율만을 가져온다.
실 디스크는 /dev/dsk 로 시작하고 있다.
$ df -k | grep -i "/dev/dsk"
/dev/dsk/c0t0d0s0 30893320 8587095 21997292 29% /
/dev/dsk/c0t1d0s0 70589121 1025493 68857737 2% /export/home
이렇게 실 디스크 정보를 가져왔으면 이중에서 사용률과 해당 위치만을 출력해 주도록 한다.
$ df -k | grep -i "/dev/dsk" | awk '{print $5, $6}'
29% /
2% /export/home
이렇게 Parsing 하기 쉽도록 출력값을 가져오면, 이후 프로그램에서 적당히 가공하여 사용한다.