Вы здесь

Сбор и обработка статистики по использованию памяти

В данной статье рассматривается сбор и вывод информации об использовании памяти сервера под FreeBSD.

Скрипт для сбора статистики по памяти.
Данный скрипт собирает статистику по нескольким параметрам загруженности памяти.
Впринципе, скрипт не сильно отличается от скрипта сбора статистики по CPU , поэтому остановимся на некоторых тонкостях.
В базу мы будем писать значения:

1. Всего свопа
2. Доступно свопа
3. Доступно основной памяти
4. Используется основной памяти
5. Используется под буфера
6. Используется под кэш
7. Используется свопа
8. Всего основной памяти (RAM)

Итого 8 параметров. Но по SNMP возможно получить только параметры

1. Всего свопа
2. Доступно свопа
3. Всего основной памяти (RAM)
4. Доступно основной памяти
5. Используется под буфера
6. Используется под кэш

Параметры «Используется свопа» и «Всего основной памяти» мы вычисляем в скрипте.
Все остальное аналогично скрипту для CPU.

—- START makerrdmem.sh —-
#!/bin/sh
RRDDIR=»/usr/local/rrd» #Директория базы данных
CMD=»/usr/local/bin/snmpget -r 9 -t 3 -Oqv -v2c» #Команда для сбора статистики по SNMP
RRDCMD=»/usr/local/bin/rrdtool»
COMNAME=»public» #Комьюнити сервера (серверов)
FILENAME=»mem.rrd» #суффикс файла
CONFIG=»/usr/local/etc/rrdconf/cpu.conf»
OID=».1.3.6.1.4.1.2021.4.3.0 \
.1.3.6.1.4.1.2021.4.4.0 \
.1.3.6.1.4.1.2021.4.5.0 \
.1.3.6.1.4.1.2021.4.6.0 \
.1.3.6.1.4.1.2021.4.14.0 \
.1.3.6.1.4.1.2021.4.15.0″
#OIDs
#memTotalSwap .1.3.6.1.4.1.2021.4.3.0
#memAvailSwap .1.3.6.1.4.1.2021.4.4.0
#memTotalReal .1.3.6.1.4.1.2021.4.5.0
#memAvailReal .1.3.6.1.4.1.2021.4.6.0
#memBuffer .1.3.6.1.4.1.2021.4.14.0
#memCached .1.3.6.1.4.1.2021.4.15.0
for i in `cat $CONFIG | grep -v «^#»`
do
HOST=$i
if [ ! -e "$RRDDIR/$HOST-$FILENAME" ]; then
[ -e "$RRDDIR" ] || mkdir «$RRDDIR»
$RRDCMD create «$RRDDIR/$HOST-$FILENAME» -s 60\
DS:tswap:GAUGE:360:0:U\
DS:aswap:GAUGE:360:0:U\
DS:treal:GAUGE:360:0:U\
DS:areal:GAUGE:360:0:U\
DS:buff:GAUGE:360:0:U\
DS:cach:GAUGE:360:0:U\
DS:uswap:GAUGE:360:0:U\
DS:ureal:GAUGE:360:0:U\
RRA:AVERAGE:0.5:1:1440\
RRA:AVERAGE:0.5:5:1440\
RRA:AVERAGE:0.5:30:1440\
RRA:AVERAGE:0.5:120:1440\
RRA:AVERAGE:0.5:720:1440\
RRA:MAX:0.5:1:1440\
RRA:MAX:0.5:5:1440\
RRA:MAX:0.5:30:1440\
RRA:MAX:0.5:120:1440\
RRA:MAX:0.5:720:1440
fi
STRING=`$CMD -c $COMNAME $HOST $OID | awk ‘{printf «:»$1}’`
TREAL=`$CMD -c $COMNAME $HOST .1.3.6.1.4.1.2021.4.5.0`
AREAL=`$CMD -c $COMNAME $HOST .1.3.6.1.4.1.2021.4.6.0`
UREAL=`expr $TREAL — $AREAL`
TSWAP=`$CMD -c $COMNAME $HOST .1.3.6.1.4.1.2021.4.3.0`
ASWAP=`$CMD -c $COMNAME $HOST .1.3.6.1.4.1.2021.4.4.0`
USWAP=`expr $TSWAP — $ASWAP`
FSTRING=$STRING:$USWAP:$UREAL
if [ -w "$RRDDIR/$HOST-$FILENAME" ]; then
$RRDCMD update $RRDDIR/$HOST-$FILENAME N$FSTRING
else
echo $HOST-$FILENAME is not writable
fi
done

—- END makerrdmem.sh —-

Вывод информации по памяти.
Хотя запись и ведется в одну базу, но на мой взгляд, разумнее выводить два графика.

1. Основная память
2. Своп

Скрипт вывода графика использования основной памяти:
Скрипт вызывается аналогично скрипту по процессору.
mem.cgi?DS= mail.maindomain.ru-mem.rrd&title=6%20hour%20graph&start=-6h

—- START mem.cgi —-
#!/usr/local/bin/perl -w
use RRDs;
use CGI qw(:standard);
use Math::Round qw(:all);
$rrddir=»/usr/local/rrd»;
my (@DEF, @FETCH_DEF, @PLOT, @options);
my $statfmt = «%.3lf%s»;
$|=1;
print header(‘image/gif’);
$database = param(‘DS’);
push (@FETCH_DEF, «$rrddir/$database»,
«AVERAGE», «-s», param(‘start’));
push(@DEF, «DEF:CP_TREAL=$rrddir/$database:treal:AVERAGE»);
push(@DEF, «DEF:CP_AREAL=$rrddir/$database:areal:AVERAGE»);
push(@DEF, «DEF:CP_BUFF=$rrddir/$database:buff:AVERAGE»);
push(@DEF, «DEF:CP_UREAL=$rrddir/$database:ureal:AVERAGE»);
push(@DEF, «CDEF:TREAL=CP_TREAL,1000,*»);
push(@DEF, «CDEF:AREAL=CP_AREAL,1000,*»);
push(@DEF, «CDEF:UREAL=CP_UREAL,1000,*»);
push(@DEF, «CDEF:BUFF=CP_BUFF,1000,*»);
push(@PLOT,
«COMMENT:Memory «,
«AREA:TREAL#1000CC:Total «,
«AREA:TREAL#54EC48:Free «,
«AREA:UREAL#EA644A:Used «,
«AREA:BUFF#48C4EC:Buffer»,
«LINE3:TREAL#1000AA»,
«LINE1:UREAL#CC3118″,
«LINE1:BUFF#1598C3″,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TREAL:LAST:Now ${statfmt} total «,
«GPRINT:AREAL:LAST: ${statfmt} free «,
«GPRINT:UREAL:LAST: ${statfmt} used «,
«GPRINT:BUFF:LAST: ${statfmt} buffers»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TREAL:AVERAGE:Average ${statfmt} total «,
«GPRINT:AREAL:AVERAGE: ${statfmt} free «,
«GPRINT:UREAL:AVERAGE: ${statfmt} used «,
«GPRINT:BUFF:AVERAGE: ${statfmt} buffers»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TREAL:MAX:Maximum ${statfmt} total «,
«GPRINT:AREAL:MAX: ${statfmt} free «,
«GPRINT:UREAL:MAX: ${statfmt} used «,
«GPRINT:BUFF:MAX: ${statfmt} buffers»,
‘COMMENT:\n’);
foreach $opt (‘start’,'title’) {
if (param($opt)) {
push(@options, «—${opt}», param($opt));
}
}
push(@options, «—width»,»450″,»—height»,»120″);
push(@options, «—vertical-label»,»Memory Size»);
push(@options, «—lower-limit»,»1″);
push(@options, «—font»,»DEFAULT:8:/usr/lib/fonts/arial.ttf»);
RRDs::graph(‘-’,@options,@DEF,@PLOT);
exit 0;

—- END mem.cgi —-

Рисунок 1. График использования основной памяти.

—- START swap.cgi —-
#!/usr/local/bin/perl -w
use RRDs;
use CGI qw(:standard);
use Math::Round qw(:all);
$rrddir=»/usr/local/rrd»;
my (@DEF, @FETCH_DEF, @PLOT, @options);
my $statfmt = «%.3lf%s»;
$|=1;
print header(‘image/gif’);
$database = param(‘DS’);
push (@FETCH_DEF, «$rrddir/$database»,
«AVERAGE», «-s», param(‘start’));
push(@DEF, «DEF:CP_TSWAP=$rrddir/$database:tswap:AVERAGE»);
push(@DEF, «DEF:CP_ASWAP=$rrddir/$database:aswap:AVERAGE»);
push(@DEF, «DEF:CP_CACH=$rrddir/$database:cach:AVERAGE»);
push(@DEF, «DEF:CP_USWAP=$rrddir/$database:uswap:AVERAGE»);
push(@DEF, «CDEF:TSWAP=CP_TSWAP,1000,*»);
push(@DEF, «CDEF:ASWAP=CP_ASWAP,1000,*»);
push(@DEF, «CDEF:USWAP=CP_USWAP,1000,*»);
push(@DEF, «CDEF:CACH=CP_CACH,1000,*»);
push(@PLOT,
«COMMENT:Swap «,
«AREA:TSWAP#CC7016:Total «,
«AREA:TSWAP#ECD748:Free «,
«AREA:USWAP#7648EC:Used «,
«AREA:CACH#DE48EC:Cached»,
«LINE3:TSWAP#CC7016″,
«LINE1:USWAP#4D18E4″,
«LINE1:CACH#B415C7″,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TSWAP:LAST:Now ${statfmt} total «,
«GPRINT:ASWAP:LAST: ${statfmt} free «,
«GPRINT:USWAP:LAST: ${statfmt} used «,
«GPRINT:CACH:LAST: ${statfmt} cached»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TSWAP:AVERAGE:Average ${statfmt} total «,
«GPRINT:ASWAP:AVERAGE: ${statfmt} free «,
«GPRINT:USWAP:AVERAGE: ${statfmt} used «,
«GPRINT:CACH:AVERAGE: ${statfmt} cached»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:TSWAP:MAX:Maximum ${statfmt} total «,
«GPRINT:ASWAP:MAX: ${statfmt} free «,
«GPRINT:USWAP:MAX: ${statfmt} used «,
«GPRINT:CACH:MAX: ${statfmt} cached»,
‘COMMENT:\n’);
foreach $opt (‘start’,'title’) {
if (param($opt)) {
push(@options, «—${opt}», param($opt));
}
}
push(@options, «—width»,»450″,»—height»,»120″);
push(@options, «—vertical-label»,»Memory Size»);
push(@options, «—lower-limit»,»1″);
push(@options, «—font»,»DEFAULT:8:/usr/lib/fonts/arial.ttf»);
RRDs::graph(‘-’,@options,@DEF,@PLOT);
exit 0;

—- END swap.cgi —-

Рисунок 2. График использования своп.
Категория: 
© 2009-2104 CTPAHHuK.RU