Поставлена задача снимать ститистику загрузки процессора на десятке серверов. Здесь описано как это делаю я

Решил данные снимать с snmp, заносить в кольцевую базу данных RRD и рисовать гарфики(RRDtool)
C snmp возникли проблемы, нету возможности снимать Active, Inactive, Wired, Cache, Free ОЗУ. Посему сделал следующее. На сервере, на котором расположен Web-сервер, будет запускаться через inetd скрипт приёма статистики, от серверов-клиентов. По крону будем вызывать скрипты для отрисовки графиков.

На серверной стороне выполняем следующие шаги
Устанавливаем RRDTool

1
2
cd /usr/ports/databases/rrdtool
make install clean

У меня возникла ошибка

1
Requested 'xcb >= 1.4' but version of XCB is 1.2

необходимо обновить пакеты libxcb и xcb-proto.
Создаем каталог для базы данных

1
mkdir /var/db/rrddb

Создаем каталог для наших скриптов

1
 mkdir  /usr/local/etc/monitor/

Скрипт создания базы даных create.sh для хранения статистики для одного сервера-клиента.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

RRDPREFIX=/var/db/rrddb

rrdtool create $RRDPREFIX/CPU-RAM-MYSERVER.rrd
--step 60
DS:cpuload:GAUGE:600:U:U
DS:mem_all:GAUGE:600:U:U
DS:mem_wire:GAUGE:600:U:U
DS:mem_active:GAUGE:600:U:U
DS:mem_inactive:GAUGE:600:U:U
DS:mem_cache:GAUGE:600:U:U
DS:mem_free:GAUGE:600:U:U
RRA:AVERAGE:0.5:1:525600
RRA:MAX:0.5:1440:90
RRA:MIN:0.5:1440:90
RRA:LAST:0.5:1440:90

где MYSERVER – идентификатор клиента(для каждого клиента оригинальное название должно быть)

Создаем базу данных

1
2
chmod +x create.sh
./create.sh

Скрипты в основном пишу на php(мне так проще и удобнее, с php имею дело каждый день, посему это мой выбор).

Создаем скрипт monitor_server.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/local/bin/php -q
<?php
$debug=false;
$fn=fread(STDIN,1000);
$fn=trim($fn);

$res=explode(":",$fn);
$RRDPREFIX="/var/db/rrddb";
$cpuload=$res[1];
$mem_all=$res[2];
$mem_wire=$res[3];
$mem_active=$res[4];
$mem_inactive=$res[5];
$mem_cache=$res[6];
$mem_free=$res[7];

$r="/usr/local/bin/rrdtool update $RRDPREFIX/CPU-RAM-".$res[0].".rrd N:$cpuload:$mem_all:$mem_wire:$mem_active:$mem_inactive:$mem_cache:$mem_free";
exec($r);
?>

делаем исполняемым

1
chmod +x monitor_server.php

Теперь забиндим наш скрипт, скажем на порт 47588.
Для этого, в /etc/services добавляем

1
2
mymonitor  47588/tcp
mymonitor  47588/udp

в /etc/inetd.conf

1
mymonitor stream tcp nowait root /usr/local/etc/monitor/monitor_server.php monitor_server.php

Графическая часть
У меня графики статистики лежат в /usr/local/www/mrtg/system

Скрипт graph-cpu-MYSERVER.sh, для отрисовки графика загрузки CPU сервера MYSERVER

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
#!/bin/sh
export LANG=KOI8-R
export LC_ALL=ru_RU.KOI8-R

RRDPREFIX=/var/db/rrddb
WWWPREFIX=/usr/local/www/mrtg/system
RRDCMD="/usr/local/bin/rrdtool"
$RRDCMD graph $WWWPREFIX/CPULOAD-MYSERVER_24h.png
--width 760
--height 150
--imgformat PNG
--start -24h
--end now-30s
--slope-mode
--rigid
--upper-limit 100
--font-render-mode light
--font DEFAULT:8:/usr/local/fonts/tahoma.ttf
--font TITLE:7:/usr/local/fonts/arial.ttf
--font AXIS:6:/usr/local/fonts/arial.ttf
--font UNIT:7:/usr/local/fonts/couri.ttf
--font LEGEND:6:
--color BACK#2F2F2F
--color CANVAS#333333
--color SHADEA#CCCCCC
--color SHADEB#CCCCCC
--color FONT#FFFFFF
--color AXIS#FFFFFF
--color ARROW#FF0000
--color GRID#CCCCCC
--color MGRID#CCCCCC
--vertical-label "Percents"
--title "Load CPU (last 24h)"
DEF:cpuload=$RRDPREFIX/CPU-RAM-DL.rrd:cpuload:AVERAGE
COMMENT:"l"
AREA:cpuload#FF0000:"CPU "
GPRINT:cpuload:LAST:"Last %6.0lf%% "
GPRINT:cpuload:MAX:"Max %6.0lf%% "
GPRINT:cpuload:AVERAGE:"Avg %6.0lf%% "
GPRINT:cpuload:MIN:"Min %6.0lf%% "
LINE1:cpuload#FFFF00
COMMENT:"l"

В /usr/local/fonts/ у меня лежат шрифты ранее скачаные.

Скрипт graph-mem-MYSERVER.sh, для отрисовки графика загрузки ОЗУ сервера MYSERVER

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
71
72
73
74
75
76
77
78
79
#!/bin/sh

export LANG=KOI8-R
export LC_ALL=ru_RU.KOI8-R

RRDPREFIX=/var/db/rrddb
WWWPREFIX=/usr/local/www/mrtg/system
RRDCMD="/usr/local/bin/rrdtool"

$RRDCMD graph $WWWPREFIX/MEMORY-MYSERVER_24h.png
--width 760
--height 150
--imgformat PNG
--start -24h
--end now-30s
--slope-mode
--base 1024
--rigid
--units-exponent 6
--font-render-mode light
--font DEFAULT:8:/usr/local/fonts/tahoma.ttf
--font TITLE:7:/usr/local/fonts/arial.ttf
--font AXIS:6:/usr/local/fonts/arial.ttf
--font UNIT:7:/usr/local/fonts/couri.ttf
--font LEGEND:6:/usr/local/fonts/couri.ttf
--color BACK#2F2F2F
--color CANVAS#333333
--color SHADEA#CCCCCC
--color SHADEB#CCCCCC
--color FONT#FFFFFF
--color AXIS#FFFFFF
--color ARROW#FF0000
--color GRID#CCCCCC
--color MGRID#CCCCCC
--vertical-label "bytes"
--title "Use Memory (Last 24h)"
DEF:mem_all=$RRDPREFIX/CPU-RAM-DL.rrd:mem_all:AVERAGE
DEF:mem_wire=$RRDPREFIX/CPU-RAM-DL.rrd:mem_wire:AVERAGE
DEF:mem_active=$RRDPREFIX/CPU-RAM-DL.rrd:mem_active:AVERAGE
DEF:mem_inactive=$RRDPREFIX/CPU-RAM-DL.rrd:mem_inactive:AVERAGE
DEF:mem_cache=$RRDPREFIX/CPU-RAM-DL.rrd:mem_cache:AVERAGE
DEF:mem_free=$RRDPREFIX/CPU-RAM-DL.rrd:mem_free:AVERAGE
COMMENT:"l"
GPRINT:mem_all:LAST:"All %6.0lf %sbytes"
COMMENT:"l"
AREA:mem_active#00FF00:"Active"
GPRINT:mem_active:LAST:"Last %6.2lf %sbytes"
GPRINT:mem_active:MAX:"Max %6.2lf %sbytes"
GPRINT:mem_active:AVERAGE:"Avg %6.2lf %sbytes"
GPRINT:mem_active:MIN:"Min %6.2lf %sbytes"
COMMENT:"l"
AREA:mem_inactive#00D000:"Inactive "
GPRINT:mem_inactive:LAST:"Last %6.2lf %sbytes "
GPRINT:mem_inactive:MAX:"Max %6.2lf %sbytes "
GPRINT:mem_inactive:AVERAGE:"Avg %6.2lf %sbytes "
GPRINT:mem_inactive:MIN:"Min %6.2lf %sbytes"c
COMMENT:"l"
AREA:mem_wire#009D00:"Wired "
GPRINT:mem_wire:LAST:"Last %6.2lf %sbytes "
GPRINT:mem_wire:MAX:"Max %6.2lf %sbytes "
GPRINT:mem_wire:AVERAGE:"Avg %6.2lf %sbytes "
GPRINT:mem_wire:MIN:"Min %6.2lf %sbytes"
COMMENT:"l"
AREA:mem_cache#007F00:"Cache "
GPRINT:mem_cache:LAST:"Last %6.2lf %sbytes "
GPRINT:mem_cache:MAX:"Max %6.2lf %sbytes "
GPRINT:mem_cache:AVERAGE:"Avg %6.2lf %sbytes "
GPRINT:mem_cache:MIN:"Min %6.2lf %sbytes"
COMMENT:"l"
LINE1:mem_active#00FF00
LINE1:mem_inactive#00D000
LINE1:mem_wire#009D00
LINE1:mem_cache#007F00
LINE1:mem_free#CCCCCC:"Free "
GPRINT:mem_free:LAST:"Last %6.2lf %sbytes "
GPRINT:mem_free:MAX:"Max %6.2lf %sbytes "
GPRINT:mem_free:AVERAGE:"Avg %6.2lf %sbytes "
GPRINT:mem_free:MIN:"Min %6.2lf %sbytes"
COMMENT:"l"

Так же не забываем сделать

1
2
chmod +x graph-cpu-MYSERVER.sh
chmod +x graph-mem-MYSERVER.sh

В cron добавляем задание для отрисовки

1
2
*/1     *       *       *       *       /usr/local/etc/monitor/graph-cpu-MYSERVER.sh >/dev/null 2>&1
*/1     *       *       *       *       /usr/local/etc/monitor/graph-mem-MYSERVER.sh >/dev/null 2>&1

С серверно частью закончили. Так же рекомендую закрыть доступ на порт 47588 для всех, кроме клиентов.

Клиентская часть
Статистику для CPU снимаем с SNMP, устанавливаем:

1
cd /usr/ports/net-mgmt/net-snmp

Копируем конфигурационный файл

1
cp /usr/local/share/snmp/snmpd.conf /usr/local/etc/snmpd.conf

Редактируем под себя конфиг, у меня он такой

1
2
3
4
5
6
7
syslocation: myzone, Ukraine
sysservices 0
syscontact      admins@myserver.domain

                #community      #hosts allowed

rocommunity    public          127.0.0.1

Добавляем в rc.conf

1
2
snmpd_enable="YES"
snmpd_conffile="/usr/local/etc/snmpd.conf"

и стартуем

1
/usr/local/etc/rc.d/snmpd start

Аналогично создаем каталог для скриптов клиента

1
2
mkdir /usr/local/etc/monitor
cd /usr/local/etc/monitor

Скрипт monitor_client.php для снятия статистики загрузки CPU и Memory

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
#!/usr/local/bin/php

<?php
$client="MYSERVER";
$cfgServer="xxx.xxx.xxx.xxx";
$cfgPort="47588";
$cfgTimeOut=10;
$handle = fsockopen($cfgServer, $cfgPort,&$errno,&$errstr,$cfgTimeOut);

$SNMPWALK="/usr/local/bin/snmpwalk";
$SYSCTL="/sbin/sysctl";
$PSCMD="/bin/ps";
$CALC="/usr/bin/bc";
$PAGESIZE=exec("$SYSCTL hw.pagesize | awk '{print $2}'");
$ssCpuUser=exec("$SNMPWALK -v 1 -c public  -Os -Oq 127.0.0.1 ssCpuUser | awk '{print $2}'");
$ssCpuSystem=exec("$SNMPWALK -v 1 -c public  -Os -Oq 127.0.0.1 ssCpuSystem | awk '{print $2}'");
$cpuload=$ssCpuUser+$ssCpuSystem;
$mem_all_pg=exec("$SYSCTL vm.stats.vm.v_page_count | awk '{print $2}'");
$mem_all=$mem_all_pg * $PAGESIZE;
$mem_wire_pg=exec("$SYSCTL vm.stats.vm.v_wire_count | awk '{print $2}'");
$mem_wire=$mem_wire_pg*$PAGESIZE;
$mem_active_pg=`$SYSCTL vm.stats.vm.v_active_count | awk '{print $2}'`;
$mem_active=$mem_active_pg * $PAGESIZE;
$mem_inactive_pg=`$SYSCTL vm.stats.vm.v_inactive_count | awk '{print $2}'`;
$mem_inactive=$mem_inactive_pg*$PAGESIZE;
$mem_cache_pg=`$SYSCTL vm.stats.vm.v_cache_count | awk '{print $2}'`;
$mem_cache=$mem_cache_pg*$PAGESIZE;
$mem_free_pg=`$SYSCTL vm.stats.vm.v_free_count | awk '{print $2}'`;
$mem_free=$mem_free_pg*$PAGESIZE;
$res="$client:$cpuload:$mem_all:$mem_wire:$mem_active:$mem_inactive:$mem_cache:$mem_free";
fputs($handle,$res);
fclose($handle);
?>

где,xxx.xxx.xxx.xxx – ip адрес сервера, куда шлем данные;
MYSERVER – идентификатор клиента, который мы используем на сервере.

Не забываем сделать исполняемым

1
chmod +x monitor_client.php

Добавляем задание в cron

1
*/1     *       *       *       *       /usr/local/etc/monitor/monitor_client.php >/dev/null 2>&1

Пример графиков

Нравится эта статья? Подпишитесь на RSS-ленту и получите еще больше классной информации!