sar 이용하여 시스템 모니터링하기
- sysstat 웹 사이트 (http://perso.wanadoo.fr/sebastien.godard/)
sar는 redhat 7.x 에 기본 들어있는 sysstat 패키지에 있는 프로그램이다.
sar 프로그램은 시스템의 다양한 활동에 대하여 모니터링을 할 수 있는데 모니터링 대상이 상당히 넓은 편이다.
기본값은 CPU 활동에 대한 통계를 출력한다.
sar는 각종 활동에 대한 통계를 다른 프로그램을 이용하여 파일로 저장하고 통계치를 출력할 수 있는 기능을 제공한다.
sar에서 모니터링 가능한 항목은 다음과 같다.
- I/O 전송량
- 페이징
- 프로세스 생성 숫자
- 블락 디바이스 활동
- 인터럽트
- 네트워크 통계
- run 큐 및 시스템 부하 평균
- 메모리와 스왑 공간 활용 통계
- 메모리 통계
- CPU 이용도
- 특정 프로세스에 대한 CPU 이용도
- inode, 파일, 기타 커널 테이블에 대한 상태
- 시스템 스위칭 활동(context switch)
- 스와핑 통계
- 특정 프로세스 통계
- 특정 프로세스의 자식 프로세스 통계
- TTY 디바이스 활동
sar 설정하기
# cat /etc/cron.d/sysstat
# run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib/sa/sa2 -A
sa1 는 매10분마다 시스템모니터링한 결과를 /var/log/sa/saxx 파일에 바이너리 형태로 기록한다.
xx는 기록하는 날짜이다. sa2 -A 는 23시 53분에 바이너리 파일을 읽어서 사람이 편하게 볼 수 있도록 보고서를
만든다.
/var/log/sa/sarxx 형태로 기록된다. sa1 에서 5 3 이라고 해놓으면 매 10분마다 실행을 하면서 5초동안 3번을 기록한다는 뜻이다.
그러면 매10분마다 15번의 기록이 남는다. sa2 에서 -A는 모든 데이터를 보는 것인데 실제로는 자신에게 필요한 내용만 옵션을 이용하여 뽑아서 보는 것이 편할 것이다.
man 페이지의 예를 참고하면 된다.
# 8am-7pm activity reports every 10 minutes during weekdays.
0 8-18 * * 1-5 /usr/lib/sa/sa1 600 6 &
# 7pm-8am activity reports every an hour during weekdays.
0 19-7 * * 1-5 /usr/lib/sa/sa1 &
# Activity reports every an hour on Saturday and Sunday.
0 * * * 0,6 /usr/lib/sa/sa1 &
# Daily summary prepared at 19:05
5 19 * * * /usr/lib/sa/sa2 -A &
서비스에 따라 다르겠지만 sa2 에서 자세히 보아야 할 부분들은 다음과 같다.
-r 메모리 및 스왑 스페이스 사용현황,
-u CPU 활용량,
-W 스와핑 상황.
-q load average
# sar -ruW -f sa27 3600 -> 메모리, cpu, 스왑 레포트를 sa27에서 만들며 3600초(1시간) 기준으로 만든다.
# sar -r -f sa25 1800 -s 08:00:00 -e 19:00:00 -> 오전 8시부터 저녁 19시가지 30분간격으로 메모리 모니터링
명령어 예제
#!/bin/sh
#let total_mem=`grep -i memtotal /proc/meminfo | awk '{print $2}'`
# 1g = 1030532
# 4G = 4111880
# memory는 수동으로 지정해야함
START="09:00:00"
END="24:00:00"
INTERVAL="600"
unset LANG
#ssh_user="db"
#ssh_user="lds@w1"
os_version=`cat /etc/redhat-release | awk '{print $5}'`
if [ $# -lt 1 ]; then
echo "Usage : $0 sa_filename"
exit
fi
if [ ! -e /var/log/sa/$1 ]; then
echo "$1 file not found"
exit
fi
my_date=`sar -r -f /var/log/sa/$1 3600 | grep -i linux | awk '{print $4}'`
echo "====================================================================="
echo "$my_date system check"
echo "====================================================================="
echo
# memory 4G / swap
echo "memory check"
# redhat 6.2
# 00:00:01 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
echo "date used-buffer-cache(MB) mem usage(%) swap usage(%)"
if [ $os_version = "6.2" ]; then
sar -r -f /var/log/sa/$1 -s $START -e $END $INTERVAL | awk 'NF > 0' | grep -vi linux | grep -v memfree | grep -vi average | awk '{printf "%s\t\t%d\t\t%d\t\t\t%d\n",$1, $3-$5-$6,($3-$5-$6)/1030532*100, $9}'
fi
# redhat 7.3
#if [ $os_version = "7.3" ]; then
sar -r -f /var/log/sa/$1 -s $START -e $END $INTERVAL | awk 'NF > 0' | grep -vi linux | grep -v memfree | grep -vi average | awk '{printf "%s\t\t%d\t\t%d\t\t\t%d\n",$1, $3-$6-$7,($3-$6-$7)/1030532*100, $10}'
#fi
#echo
#echo "========================="
#echo "swap check"
sar -Wuqb -f /var/log/sa/$1 -s $START -e $END $INTERVAL | grep -vi linux
#echo
#echo "========================="
#echo "cpu check"
#sar -u -f /var/log/sa/$1 -s $START -e $END $INTERVAL | grep -vi linux
#
#echo
#echo "========================="
#echo "load average check"
#sar -q -f /var/log/sa/$1 -s $START -e $END $INTERVAL | grep -vi linux
#
#echo
#echo "========================="
#echo "io check"
#sar -b -f /var/log/sa/$1 -s $START -e $END $INTERVAL | grep -vi linux
시스템상에서 실제 사용하는 메모리는 used-buffer-cache 임. 이에 대한 전체 사용량을 출력하고 스왑 메모리가 사용되는지 확인함
redhat 의 sysstat 패키지는 sar 자료를 일주일치만 보관한다.
이는 /usr/lib/sa/sa2 의 파일을 보면 7일전 이상에 변경된것은 지우도록 되어있기 때문이다.
용량이 많지 않으므로 좀 더 오랫동안 보관해두면 간혹 가다 참고할 일이 있을 것이다.
SUSE 는 이런 설정이 없기 때문에 계속 파일이 쌓이므로 자동으로 지워주는 스크립트를 하나 짜는게 좋을 것이다.
시스템 모니터링 관련한 전반적인 내용은 아래의 링크 참고하자. 아래 일부 내용을 옮겼다.
http://tunelinux.pe.kr/tune/tunning-pse/pse-01.html
정보 정확하게 판별하기
vmstat를 이용하여 CPU와 I/O 활동을 모니터링할 수 있는데 vmstat에서 나오는 첫 줄은 부팅 이후의 각 통계치에 대한 평균값을
보여주므로 무시하고 두 번째 줄부터 통계를 보면 된다.
vmstat에서 중요한 것은 procs 영역의 b 필드이다.
r은 현재 실행중인 프로세스 수이고 b는 인터럽트가 불가능한 sleep 상태에 있는 프로세스로 I/O 처리를 하는 동안 블럭 처리된
프로세스이며 w는 강제로 스왑아웃된 프로세스 수이다.
si와 so는 스왑인, 스왑아웃을 말한다.
스왑아웃이 지속적으로 발생한다면 메모리가 부족한 것이다.
그러나 일정 간격을 두고 주기적으로 스왑아웃이 발생하는 것은 정상적인 일이다.
BSD 시스템에서는 비상호 대화적인 작업을 스왑아웃 한다.
현재 실행하고 있는 프로그램에서 스왑아웃이 계속 발생한다면 프로그램이 멈출 수도 있으며 심각하게 메모리가 부족하다는 것을 의미한다.
스왑아웃필드(so)는 항상 0에 가까워야 한다. 그렇지 않다면 프로세스들은 가상 메모리를 놓고 경쟁하게 되며 시스템은 페이징 상태가 된다.
페이징 활동은 심각한 가용 메모리(free)의 부족과 직접적인 관련을 가지며 간접적으로는 시스템의 높은 CPU 사용 시간 비율(sy)과 관련이 있다.
프로세스가 시작할 때 항상 이미지와 데이터를 page-in 해야 하므로 page-in 열에서 높은 숫자가 항상 심각한 것은 아니라는 사실은 기억하고 있어야 한다.
시스템에서 사용하는 시간이 지나치고 높으면(50퍼센트 이상) 디스크 I/O에서 문제가 있을 가능성이 크다.
시스템 전체의 부하가 높은데 CPU에서 휴지시간(idle time, id 항목)이 일반적으로 10퍼센트를 넘는다면
I/O나 메모리에 문제가 있을 가능성이 크다. 휴지시간(id)이 항상 0이라면 CPU를 100퍼센트 사용하고 있는 상태이다.
CPU의 기능을 최대한 활용하는 것은 좋은 현상이다. 그런데 항상 100퍼센트로 활용중인 상태라면 어떤 작업이 계속 축적되고 있다는 것이며
CPU가 과부하를 가진다는 의미한다. 이 때는 CPU를 계속 사용하고 있는 프로세스를 찾아야 하며 디스크의 활동이 분산되지 않았다면
I/O 작업을 효율적으로 분산시켜야 한다.
대부분의 사용자가 vmstat에서 si, so(스왑인, 스왑 아웃)를 주로 보고 id가 넉넉하면 시스템에 무리가 없는 것으로 생각한다.
이는 시스템의 상황에 대해서 잘못 파악할 가능성이 많은 것으로 b의 수치가 높은 경우 I/O작업을 위해 CPU가 계속 대기 상태로 있는 경우이다.
이런 경우에는 디스크 I/O 문제를 확인해야 한다.
참고-load average 와 인터럽트가 불가능한 sleep 프로세스
cpu 자원은 놀고있는데 load average 가 무척 높아지는 증상이 있었다. 순간순간 vmstat 에서block 되는 프로세스가 발생하였습니다.
알고보니 클러스터링 파일 시스템솔루션을 썼는데 여기에서 인터럽트가 불가능한 sleep 을 쓰는 것때문에 발생한 문제였습니다.
load average 가 run queue (실행하기 위하여 cpu 자원을 기다리고 있는 프로세스) 에 있는것말고 block되는 프로세서도 포함하기 때문에
CPU 자원은 거의 놀고있지만 load average는 계속 높게 나왔던 것이지요.