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 


3. DISK 사용률 정보

디스크 사용률을 보는 명령은 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 하기 쉽도록 출력값을 가져오면, 이후 프로그램에서 적당히 가공하여 사용한다.