RRDTools мониторинг загрузки процессора

RRDTools мониторинг загрузки процессора

Тут вкратце опишу как сделать графики мониторинга загрузки процессора с помощью RRDTools.

  1. Если не установлен пакет RRDTools – читаем здесь.
  2. Все используемые скрипты приложены к данному посту.
  3. Инструкция короткая, как записка, просто на память.

 Используемая система

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