Вы здесь

Сбор и обработка статистики по загрузке CPU

В данной статье рассматривается сбор и вывод информации о загруженности процессора сервера под FreeBSD.
Для сбора статистики используется утилита snmpget из состава пакета net-snmp (/usr/ports/net-mgmt/net-snmp).
Для хранения информации и генерации графиков, используется пакет rrdtool (round robin database tool). Закачать пакет можно отсюда: http://rrdtool.eu.org или http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ Подробно ознакомиться с этим пакетом можно здесь: http://www.bog.pp.ru/work/rrdtool.html (Российская). В принципе, скрипт самостоятельно создаст необходимые базы так, что дополнительных знаний не нужно.

Скрипт для сбора статистики по CPU.
Данный скрипт собирает статистику по нескольким параметрам загруженности CPU.
User – загрузка процессора пользовательскими приложениями;
Nice – загрузка процессора переназначенными приоритетами пользовательскими приложениями;
System – загрузка процессора системными приложениями;
Idle – свободные ресурсы процессора;
Kernel – загрузка процессора ядром системы;
Interrupt – загрузка процессора программными прерываниями.

—- START makerrdcpu.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=»cpu.rrd» #суффикс файла
CONFIG=»/usr/local/etc/rrdconf/cpu.conf»
#OIDs
#ssCpuRawUser .1.3.6.1.4.1.2021.11.50.0
#ssCpuRawNice .1.3.6.1.4.1.2021.11.51.0
#ssCpuRawSystem .1.3.6.1.4.1.2021.11.52.0
#ssCpuRawIdle .1.3.6.1.4.1.2021.11.53.0
#ssCpuRawKernel .1.3.6.1.4.1.2021.11.55.0
#ssCpuRawInterrupt .1.3.6.1.4.1.2021.11.56.0
OID=».1.3.6.1.4.1.2021.11.50.0 \
.1.3.6.1.4.1.2021.11.51.0 \
.1.3.6.1.4.1.2021.11.52.0 \
.1.3.6.1.4.1.2021.11.53.0 \
.1.3.6.1.4.1.2021.11.55.0 \
.1.3.6.1.4.1.2021.11.56.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:user:COUNTER:360:0:U\
DS:nice:COUNTER:360:0:U\
DS:sys:COUNTER:360:0:U\
DS:idle:COUNTER:360:0:U\
DS:kernel:COUNTER:360:0:U\
DS:interrupt:COUNTER: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}’`
if [ -w "$RRDDIR/$HOST-$FILENAME" ]; then
$RRDCMD update $RRDDIR/$HOST-$FILENAME N$STRING
else
echo $HOST-$FILENAME is not writable
fi
done

—- END makerrdcpu.sh —-

IP адреса или имена хостов с которых нужно собирать статистику храняться в файле определяемом перменной CONFIG
Пример файла конфигурации:

—- START cpu.conf —
192.168.0.1
mail.maindomain.ru
fw

—- END cpu.conf —

Скрипт создает в папке определенной переменной RRDDIR файл базы для каждого хоста.
Мя файла формируется из IP/Имени хоста полученного из файла конфигурации и суффикса заданного переменной FILENAME
Для нашего примера в папке /usr/local/rrd будут созданы файлы:
192.168.0.1-cpu.rrd
mail.maindomain.ru-cpu.rrd
fw-cpu.rrd
Скрипт нужно запускать cron-ом раз в минуту.
Для этого добавляем в cron строку

*/1 * * * * /usr/local/etc/rc.d/makerrdcpu.sh

Вывод информации.
Для вывода информации используется perl-скрипт cpu.cgi
В переменной $rrddir необходимо указать путь к вашим базам. Значение переменной $rrddir должно совпадать со значением переменной RRDDIR из скрипта сбора статистики.
Для вывода надписай используется ttf шрифт /usr/lib/fonts/arial.ttf

—- START cpu.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 = «%.1lf%%»;
$|=1;
print header(‘image/gif’);
$database = param(‘DS’);
push (@FETCH_DEF, «$rrddir/$database»,
«AVERAGE», «-s», param(‘start’));
push(@DEF, «DEF:CP_USER=$rrddir/$database:user:AVERAGE»);
push(@DEF, «DEF:CP_NICE=$rrddir/$database:nice:AVERAGE»);
push(@DEF, «DEF:CP_SYS=$rrddir/$database:sys:AVERAGE»);
push(@DEF, «DEF:CP_IDLE=$rrddir/$database:idle:AVERAGE»);
push(@DEF, «DEF:CP_INTER=$rrddir/$database:interrupt:AVERAGE»);
push(@DEF, «CDEF:SUM=CP_USER,CP_NICE,+,CP_SYS,+,CP_IDLE,+,CP_INTER,+»);
push(@DEF, «CDEF:USER=CP_USER,100,*,SUM,/»);
push(@DEF, «CDEF:NICE=CP_NICE,100,*,SUM,/»);
push(@DEF, «CDEF:SYS=CP_SYS,100,*,SUM,/»);
push(@DEF, «CDEF:IDLE=CP_IDLE,100,*,SUM,/»);
push(@DEF, «CDEF:INTER=CP_INTER,100,*,SUM,/»);
push(@DEF, «CDEF:TUSE=USER,SYS,+,NICE,+,INTER,+»);
push(@PLOT,
«COMMENT:Legend «,
«AREA:TUSE#DE48EC»,
«AREA:SYS#EA644A»,
«AREA:USER#54EC48″,
«AREA:INTER#7648EC»,
«LINE1:USER#24BC14:User «,
«LINE1:NICE#CC7016:Nice «,
«LINE1:SYS#CC3118:System «,
«LINE1:INTER#4D18E4:Interrupt «,
«LINE1:TUSE#B415C7:Total»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:USER:LAST:Now ${statfmt} user «,
«GPRINT:NICE:LAST:${statfmt} nice «,
«GPRINT:SYS:LAST:${statfmt} sys «,
«GPRINT:INTER:LAST:${statfmt} inter «,
«GPRINT:TUSE:LAST:${statfmt} total «,
«GPRINT:IDLE:LAST:${statfmt} idle «,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:USER:AVERAGE:Average ${statfmt} user «,
«GPRINT:NICE:AVERAGE:${statfmt} nice «,
«GPRINT:SYS:AVERAGE:${statfmt} sys «,
«GPRINT:INTER:AVERAGE:${statfmt} inter»,
«GPRINT:TUSE:AVERAGE:${statfmt} total «,
«GPRINT:IDLE:AVERAGE:${statfmt} idle»,
‘COMMENT:\n’);
push(@PLOT,
«GPRINT:USER:MAX:Max ${statfmt} user»,
«GPRINT:NICE:MAX:${statfmt} nice «,
«GPRINT:SYS:MAX:${statfmt} sys «,
«GPRINT:INTER:MAX:${statfmt} inter «,
«GPRINT:TUSE:MAX:${statfmt} total «,
«GPRINT:IDLE:MAX:${statfmt} idle «,
‘COMMENT:\n’);
foreach $opt (‘start’,'title’) {
if (param($opt)) {
push(@options, «—${opt}», param($opt));
}
}

push(@options, «—width»,»450″,»—height»,»240″);
push(@options, «—vertical-label»,»percents»);
push(@options, «—lower-limit»,»1″);
push(@options, «—upper-limit»,»100″);
push(@options, «—font»,»DEFAULT:8:/usr/lib/fonts/arial.ttf»);
RRDs::graph(‘-’,@options,@DEF,@PLOT);
exit 0;

—- END cpu.cgi —-

Вызов скрипта осуществляется с передачей ему в качестве параметров:
DS – имя базы данных
title – заголовок графика
start – начальная позиция времени по оси Х (смещение относительно опорного времени)
* в одно смещение можно конкатенировать несколько единиц — 1h30m;
* можно использовать несколько смещений — -6h+15min;
* знак (+ или -)
* число
* единица измерения (years, months, weeks, days, hours, minutes, seconds). Можно сокращать вплоть до одной буквы. Чтобы понять, что означает буква m — минуты или месяца программе приходится читать мысли ;)

Напрмр при запросе:
cpu.cgi?DS= mail.maindomain.ru-cpu.rrd&title=6%20hour%20graph&start=-6h
Будет выведен график из базы mail.maindomain.ru-cpu.rrd с заголовком 6 hour graph за 6 частов.
Что каким цветом показывается, понятно из легенды под графиком.
Легенда содержит три строки с данными.
1. Last – последнее (текущее) значение.
2. Average – среднее значение за показанный на графике период
3. Max – максимальное значение за показанный период.

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