Тут вкратце опишу как сделать графики мониторинга загрузки процессора с помощью RRDTools.
1. Если не установлен пакет RRDTools – читаем здесь.
2. Все используемые скрипты приложены к данному посту.
3. Инструкция короткая, как записка, просто на память.
Используемая система:
1 2 |
root@f02:/root # 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:
1 2 |
root@f02:/root # pkg_info | grep rrd rrdtool-1.4.7_2 Round Robin Database Tools |
Откуда берём данные о загрузке процессора?
Пишем скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#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. Скомпилировать его можно командой:
1 |
gcc -o ccc-cpuload ccc-cpuload.c -lkvm |
Даем права исполнения на Наш срипт:
1 |
chmod 777 ccc-cpuload |
Выбираем папку, где будут лежать скрипты и базы rrd, у меня это /mnt/rrd/
Скрипт создания базы RRD: Загрузка процессора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/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: Загрузка процессора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/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: Температура процессора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/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” – Место – куда сохраняются графики. Думаю дальше объяснять не стоит.
Пример рабочего активного графика RRD: Температура процессора

Реальный график загрузки процессора на этом сервере
Температура процессора за сутки
Скачать архив со скриптами:
Архив тут
источник тут
Error thrown
Call to undefined function ereg()