검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 쉘 스크립트
가끔 스크립트에서 CPU 사용률을 구해야 할 때가 있습니다. 예를 들어 CPU 사용률을 측정하기 위한 Nagios 플러그인 같은 걸 만들어야 할 때가 있죠. 그럴 때 유용하게 쓸 수 있는 간단한 스크립트입니다.
#!/bin/bash

$INTERVAL_SEC=1
$NUM_REPORT=3

CPU_REPORT=`vmstat -n $INTERVAL_SEC $NUM_REPORT | tail -$NUM_REPORT | awk 'BEGIN{USER=0;SYS=0;WAIT=0;IDLE=0} {USER=USER+$13;SYS=SYS+$14;WAIT=WAIT+$16;IDLE=IDLE+$15} END{print USER/'$NUM_REPORT'" "SYS/'$NUM_REPORT'" "WAIT/'$NUM_REPORT'" "IDLE/'$NUM_REPORT'}'`

CPU_USER=`echo $CPU_REPORT | awk '{ print $1 }' | cut -d "." -f 1`
CPU_SYSTEM=`echo $CPU_REPORT | awk '{ print $2 }' | cut -d "." -f 1`
CPU_IOWAIT=`echo $CPU_REPORT | awk '{ print $3 }' | cut -d "." -f 1`
CPU_IDLE=`echo $CPU_REPORT | awk '{ print $4 }' | cut -d "." -f 1`
  INTERVAL_SEC는 조사 시간 간격이고 NUM_REPORT는 조사 횟수입니다. 즉, 디폴트 값으로 1초당 1번씩 총 3번 사용률을 구한 후 평균값을 구하는 겁니다. 결과로 얻을 수 있는 정보는 사용자, 시스템, 입출력에 의한 CPU 사용률과 IDLE입니다. 사실 훨씬 간단하게 구할 수도 있지만 다수의 결과에서 평균값을 구하는 것이 더 정확한 것으로 보여 이렇게 작성했습니다.

  참고로 밑에 cut을 이용해 소수점 이하의 값을 잘라버린 이유는 나중에 스크립트 내에서 if 문을 통해 비교를 할 경우 정수가 필요하기 때문입니다. 따라서 그냥 출력만 하려고 할 경우 해당 부분은 없어도 됩니다. 하지만 그럴 경우 '1.33333' 같이 나눠 떨어지지 않는 값이 나올 수도 있으므로 결국 그에 대한 적절한 처리가 필요할 것입니다.

  만약 리눅스가 아닌 유닉스에서 사용하려면 USER, SYS, WAIT, IDLE이 있는 위치(차례대로 각각 $13, $14, $16, $15)를 해당 OS의 vmstat 출력 결과에 맞게 수정해야 합니다. 또한 vmstat 명령어의 옵션을 약간 수정해야 할 수도 있습니다.

2011/07/15 14:48 2011/07/15 14:48