준호씨의 블로그

vmstat log 를 쌓아 보자 - perl script 와 crontab 이용 본문

개발이야기

vmstat log 를 쌓아 보자 - perl script 와 crontab 이용

준호씨 2013. 2. 3. 01:15
반응형

결론부터 적어 보자면 아래와 같은 결과를 얻는 방법 입니다. 5분 주기로 vmstat 의 결과를 log 로 남기고 있습니다.

 

제가 만든 약어설명

montools - monitoring tools
monlogs - monitor logs

 

리눅스의 vmstat 명령어를 이용하면 아래와 같은 데이터를 얻을 수 있습니다. (널널하게 돌아가고 있습니다.)

vmstat 명령어는 가상 메모리 통계 내주는 툴입니다. (man 페이지에 Report virtual memory statistics 라고 적혀 있네요.)

 

man vmstat 의 설명은 다음과 같습니다.

FIELD DESCRIPTION FOR VM MODE
   Procs
       r: The number of processes waiting for run time.
       b: The number of processes in uninterruptible sleep.

   Memory
       swpd: the amount of virtual memory used.
       free: the amount of idle memory.
       buff: the amount of memory used as buffers.
       cache: the amount of memory used as cache.
       inact: the amount of inactive memory.  (-a option)
       active: the amount of active memory.  (-a option)

   Swap
       si: Amount of memory swapped in from disk (/s).
       so: Amount of memory swapped to disk (/s).

   IO
       bi: Blocks received from a block device (blocks/s).
       bo: Blocks sent to a block device (blocks/s).

   System
       in: The number of interrupts per second, including the clock.
       cs: The number of context switches per second.

   CPU
       These are percentages of total CPU time.
       us: Time spent running non-kernel code.  (user time, including nice time)
       sy: Time spent running kernel code.  (system time)
       id: Time spent idle.  Prior to Linux 2.5.41, this includes IO-wait time.
       wa: Time spent waiting for IO.  Prior to Linux 2.5.41, included in idle.
       st: Time stolen from a virtual machine.  Prior to Linux 2.6.11, unknown.

vmstat 를 로그에 저장한는 perl script v0.1

#!/usr/bin/perl

use strict;
use warnings;

my $logdate = `date "+%Y%m%d"`;
chomp $logdate;

my $logtime = `date "+%H:%M"`;
chomp $logtime;

my $logfile = "/jworld/montools/monlogs/vmstat/vmstat.log.".$logdate;

# get vmstat result
my @result = `vmstat 1 1`;

# TODO vmstat error check

# should 3 lines
if (@result ne 3) {
    my $datetime = `date "+%Y-%m-%d %H:%M:%S"`;
    chomp $datetime;
    print STDERR "$datetime vmstat error. result is not 3 lines\n";
    exit -1;
}

# log data
my $log = $logtime."\t".$result[2];
chomp $log;

# append to logfile
unless (-e $logfile) {
    `touch $logfile`;
}

`echo "$log" >> $logfile`;

perl 의 file 처리 함수나 time 관련 함수를 사용할 수도 있었겠지만 귀차니즘으로 대강 리눅스명령어 들을 이용해서 구현하였습니다. 예외 처리가 썩 많이 되지는 않았지만 그냥저냥 쓸 수 있는 스크립트가 만들어 졌네요. vmstat 로그 한줄만 가져 와서 로그파일에다가 쓰는 스크립트입니다. 로그 한줄한줄 시간확인을 위해 앞에 시간을 기록하도록 구현하였습니다.

 

crontab 에 등록하기 - 5분 마다 실행

*/5 * * * * /jworld/montools/vmstat.pl

이렇게 하면 5분마다 실행이 됩니다. 만약 1분 마다 남기고 싶으면 */5 대신 */1 을 넣어 주면 됩니다.

 

아래와 같은 로그가 정상적으로 남는지 확인하면 끝~

jadmin@junho85-ubuntu-server:/jworld/montools$ cat /jworld/montools/monlogs/vmstat/vmstat.log.20130203
00:35 0 0 104 295312 1132380 1126112 0 0 0 2 1 5 0 0 100 0
00:40 0 0 104 295140 1132380 1126120 0 0 0 2 1 5 0 0 100 0
00:45 0 0 104 295048 1132380 1126148 0 0 0 2 1 5 0 0 100 0
00:50 0 0 104 295048 1132380 1126148 0 0 0 2 1 5 0 0 100 0

이 로그로 chart 를 그려 보면 좀더 직관적으로 서버의 메모리 상태를 모니터링 해 볼 수 있겠죠. 하지만 이 정보만으로 충분한 모니터링이 될지는 아직 잘 모르겠네요. 실제 사용중인 메모리의 양도 알려 주면 좋을 듯 한데 어떻게 계산하는게 좋을 지는 좀 더 알아 봐야 겠네요. free 가 295312 로 나오지만 buffer 나 cache 로 free 로 전환 가능한 메모리이니 실제 free 는 free + buffer + cache 가 될거고 사용중인 메모리는 전체메모리 - 실제 free 로 구할 수 있긴 하겠네요.

jadmin@junho85-ubuntu-server:/jworld/montools$ cat /proc/meminfo
MemTotal:        3074160 kB
MemFree:          296840 kB
Buffers:         1132384 kB
Cached:          1126268 kB

지금 상황으로 보아 3GB 짜리 에 실제 사용중인 메모리는 500MB 정도 되겠군요. (여담이지만 4GB 꽂혀 있는데 메인보드가 3GB 까지 밖에 사용을 못하는 슬픈 현실...)

반응형
Comments