준호씨의 블로그
vmstat log 를 쌓아 보자 - perl script 와 crontab 이용 본문
결론부터 적어 보자면 아래와 같은 결과를 얻는 방법 입니다. 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 까지 밖에 사용을 못하는 슬픈 현실...)
'개발이야기' 카테고리의 다른 글
redis 설치해 보기 (0) | 2014.01.04 |
---|---|
잘 잊어 먹는 아이디를 봇에 저장 시키기 (0) | 2014.01.03 |
스킨 정리 작업 (0) | 2013.01.23 |
13회 Daum DevDay 신청 (0) | 2013.01.15 |
아직 android sqlite 에서 foreign key 를 쓰기는 시기상조인 듯 (2) | 2013.01.12 |