RRDTools мониторинг загрузки процессора
Тут вкратце опишу как сделать графики мониторинга загрузки процессора с помощью RRDTools.
- Если не установлен пакет RRDTools – читаем здесь.
- Все используемые скрипты приложены к данному посту.
- Инструкция короткая, как записка, просто на память.
Используемая система
uname -v
FreeBSD 9.1-RELEASE #0: Mon Jan 14 22:10:38 KRAT 2013 root@f02.24srv.ru:/usr/obj/usr/src/sys/GEN140113
Процессор с 2-я ядрами, поэтому скрипты рассчитаны на это.
Используемый пакет RRDTools
pkg_info | grep rrd
rrdtool-1.4.7_2 Round Robin Database Tools
Откуда берём данные о загрузке процессора?
Пишем скрипт:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/resource.h>
#include <sys/sysctl.h>
#include <kvm.h>
#include <fcntl.h>
static struct {
const char *name;
} cpu_states[CPUSTATES] = {
"user", "nice", "system", "intr", "idle"
};
static void error_log(const char *msg);
int main()
{
int i;
kvm_t *km = NULL;
long cpu_load[CPUSTATES];
long cpu_load2[CPUSTATES];
long long total;
km = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
if (km == NULL) error_log("kvm_open");
if (kvm_getcptime(km, cpu_load) == -1){
kvm_close(km);
error_log("kvm_getcptime");
}
usleep(1000000);
if (kvm_getcptime(km, cpu_load2) == -1){
kvm_close(km);
error_log("kvm_getcptime");
}
kvm_close(km);
total = 0;
for (i = 0; i < CPUSTATES; i++)
total += cpu_load2[i] - cpu_load[i];
for (i = 0; i < CPUSTATES; i++)
printf("%s\t", cpu_states[i]);
putchar('\n');
for (i = 0; i < CPUSTATES; i++)
printf("%.2f\t", (cpu_load2[i]-cpu_load[i])*100.0/total);
putchar('\n');
return 0;
}
static void error_log(const char *msg)
{
printf("error: %s\n", msg);
exit(EXIT_FAILURE);
}
Сохраняем как ccc-cpuload.c. Скомпилировать его можно командой:
gcc -o ccc-cpuload ccc-cpuload.c -lkvm
Даем права исполнения на наш скрипт:
chmod 777 ccc-cpuload
Выбираем папку, где будут лежать скрипты и базы rrd, у меня это /mnt/rrd/
Скрипт создания базы RRD: Загрузка процессора
#!/bin/sh
# ds0 - user
# ds1 - nice
# ds2 - system
# ds3 - intr
# ds4 - idle
# Статистика хранится за год
# А так же хранится среднее за 15,30,60 минут
rrdtool create db-cpuload.rrd --step 60 \
DS:ds0:GAUGE:120:0:100 \
DS:ds1:GAUGE:120:0:100 \
DS:ds2:GAUGE:120:0:100 \
DS:ds3:GAUGE:120:0:100 \
DS:ds4:GAUGE:120:0:100 \
RRA:AVERAGE:0.5:1:525600 \
RRA:AVERAGE:0.5:15:35040 \
RRA:AVERAGE:0.5:30:17520 \
RRA:AVERAGE:0.5:60:8760 \
RRA:MIN:0.5:1:525600 \
RRA:MIN:0.5:15:35040 \
RRA:MIN:0.5:30:17520 \
RRA:MIN:0.5:60:8760 \
RRA:MAX:0.5:1:525600 \
RRA:MAX:0.5:15:35040 \
RRA:MAX:0.5:30:17520 \
RRA:MAX:0.5:60:8760
exit 0
Скрипт называется у меня: cdb-cpuload.sh – установите права для скрипта на исполнение, выполнить ОДИН раз. Скрипт создаст в месте запуска БД db-cpuload.rrd
Скрипт обновления базы RRD: Загрузка процессора
#!/bin/sh
RRD_BASE="/mnt/rrd/db-cpuload.rrd"
str=`/mnt/rrd/ccc-cpuload | tail +2`
cpu_user=`echo $str | awk '{ print $1; }'`
cpu_nice=`echo $str | awk '{ print $2; }'`
cpu_sys=`echo $str | awk '{ print $3; }'`
cpu_intr=`echo $str | awk '{ print $4; }'`
cpu_idle=`echo $str | awk '{ print $5; }'`
`/usr/local/bin/rrdtool update $RRD_BASE N:$cpu_user:$cpu_nice:$cpu_sys:$cpu_intr:$cpu_idle`
exit 0
Скрипт upd-cpuload.sh (Именно так он у меня называется) обновляет базу db-cpuload.rrd по расписанию, которое Вы установите в crontab, у меня раз в минуту. Ну не забываем дать права на исполнение скрипта.
Скрипт рисования графиков из базы RRD: Температура процессора
#!/bin/sh
export LANG=UTF-8
export LC_ALL=ru_RU.UTF-8
CPUBASE="/mnt/rrd/db-cpuload.rrd"
WWWPREFIX="/mnt/www/server.24srv.ru/data/images/rrd"
RRDCMD="/usr/local/bin/rrdtool"
PERIOD="1d 30d 182d 1y"
for day in $PERIOD; do
$RRDCMD graph $WWWPREFIX/cpuload${day}.png \
--start -${day} \
--end now \
--slope-mode \
--title "Статистика загрузки CPU" \
--width 580 --height 250 \
--imgformat PNG \
--font-render-mode light \
--font DEFAULT:8:Tahoma \
--font TITLE:9:Arial \
--font AXIS:7:Arial \
--font UNIT:8:"Courier New" \
--font LEGEND:7:"Courier New" \
--font WATERMARK:1:Arial \
--color BACK#2F2F2F \
--color CANVAS#003333 \
--color SHADEA#CCCCCC \
--color SHADEB#CCCCCC \
--color FONT#FFFFFF \
--color AXIS#FFFFFF \
--color ARROW#FF0000 \
--color GRID#CCCCCC \
--color MGRID#CCCCCC \
DEF:cpu_user=$CPUBASE:ds0:AVERAGE:step=1 \
DEF:cpu_nice=$CPUBASE:ds1:AVERAGE:step=1 \
DEF:cpu_sys=$CPUBASE:ds2:AVERAGE:step=1 \
DEF:cu_max=$CPUBASE:ds0:MAX:step=1 \
DEF:cu_min=$CPUBASE:ds0:MAX:step=1 \
DEF:cn_max=$CPUBASE:ds1:MAX:step=1 \
DEF:cn_min=$CPUBASE:ds1:MAX:step=1 \
DEF:cs_max=$CPUBASE:ds2:MAX:step=1 \
DEF:cs_min=$CPUBASE:ds2:MAX:step=1 \
TEXTALIGN:left \
COMMENT:" " \
COMMENT:"Максимум " \
COMMENT:"Минимум " \
COMMENT:"Среднее\l" \
LINE2:cpu_user#FF3333:"User load" \
GPRINT:cu_max:MAX:"%12.2lf%%" \
GPRINT:cu_min:MIN:"%9.2lf%%" \
GPRINT:cpu_user:AVERAGE:"%10.2lf%%\l" \
AREA:cpu_user#FF6666 \
LINE2:cpu_sys#3366FF:"System load" \
GPRINT:cs_max:MAX:"%10.2lf%%" \
GPRINT:cs_min:MIN:"%9.2lf%%" \
GPRINT:cpu_sys:AVERAGE:"%10.2lf%%\l" \
AREA:cpu_sys#6699FF \
LINE1:cpu_nice#48D1CC:"Nice load" \
GPRINT:cn_max:MAX:"%12.2lf%%" \
GPRINT:cn_min:MIN:"%9.2lf%%" \
GPRINT:cpu_nice:AVERAGE:"%10.2lf%%\l" \
COMMENT:"\s" \
COMMENT:"\s" \
COMMENT:"www.savenkoff.com Processor Loading last ${day}\n" \
> /dev/null 2>&1
done
exit 0
Скрипт под названием img-cpuload.sh рисует и перезаписывает уже нарисованные графики. Скрипт использует цикл, Кол-во и временной интервал, за который рисовать графики указан в переменной PERIOD=”1d 30d 182d 1y” – таким образом рисуется 4 графика: 1 день, 30 дней, 182 дня, 1 год. WWWPREFIX=”/mnt/www/server.24srv.ru/data/images/rrd” – Место – куда сохраняются графики. Думаю дальше объяснять не стоит.
Источник тут
Скачать скрипты можно по ссылке, пароль для скачивания yCXiWtlhNm