Оглавление
- Введение
- Подготовка
- Мониторинг сетевых служб сервера и отображение статистики по трафику с разделением по портам и протоколам
- Мониторинг и отображение статистики загрузки центрального процессора, использования памяти и количества запущенных процессов
- Мониторинг и отображение температуры центрального процессора, чипов и материнской платы
- Мониторинг и отображение температуры жестких дисков сервера
- Заключение
Мониторинг сетевых служб сервера и отображение статистики по трафику с разделением по портам и протоколам с помощью RRDTOOL
Задача
Собирать и визуализировать статистику по трафику:
- отдельно для web сервера (по порту 80, протокол TCP),
- отдельно для прокси сервера (по порту 12345, протокол TCP),
- отдельно для DNS сервера (по порту 53, протокол UDP),
- а также собирать и отображать общую загрузку канала.
Отображать статистику в каждом случае планируется в таких временных диапазонах:
- за последние шесть часов;
- за последние 24 часа;
- за последние три дня;
- за последнюю неделю;
- за последний месяц.
- за последний год;
- за последние сто лет...
Инструменты
- Штатный файерволл во FreeBSD - ipfw - в качестве наиболее точного, удобного и гибкого инструмента, который в отличие, например, от SNMP позволяет создать абсолютно любые правила по подсчету трафика. Статью по использованию ipfw Вы можете прочитать здесь. Так же для более полного понимания процесса рекомендуется man ipfw.
- RRDTOOL как средство накопления и визуализации этих данных. Пакет должен быть уже установлен в Вашей системе и готов к работе.
Сбор статистики по трафику
Сбор статистики мы будем производить с использованием ipfw count. Для того, чтобы реализовать поставленную выше задачу нам потребуется добавить в конфигурацию файерволла несколько правил-счетчиков, каждое из которых станет накапливать статистику в зависимости от заданных условий.
Вот для примера что получилось у меня:
###################################################################################
# ----------------------------- *** COUNTERS *** ---------------------------------
# TOTAL
# - IN
${fwcmd} add 00011 count all from any to ${outip} via ${outif}
# - OUT
${fwcmd} add 00012 count all from ${outip} to any via ${outif}
# HTTP
# - IN
${fwcmd} add 00013 count tcp from any to ${outip} 80 via ${outif}
# - OUT
${fwcmd} add 00014 count tcp from ${outip} 80 to any via ${outif}
# DNS
# - IN
${fwcmd} add 00015 count udp from any to ${outip} 53 via ${outif}
# - OUT
${fwcmd} add 00016 count udp from ${outip} 53 to any via ${outif}
# PROXY
# - IN
${fwcmd} add 00017 count tcp from any to ${outip} 12345 via ${outif}
# - OUT
${fwcmd} add 00018 count tcp from ${outip} 12345 to any via ${outif}
###################################################################################
Здесь:
- ${fwcmd} - путь к /sbin/ipfw;
- ${outip} - мой внешний IP адрес;
- ${outif} - мой внешний интерфейс.
Перезапустим скрипт с набором правил файерволла и проверим:
# ipfw show 11-18 00011 335693 49472870 count ip from any to 195.248.XXX.XXX via tun0 00012 411212 351897502 count ip from 195.248.XXX.XXX to any via tun0 00013 135855 21807241 count tcp from any to 195.248.XXX.XXX dst-port 80 via tun0 00014 157644 146509109 count tcp from 195.248.XXX.XXX 80 to any via tun0 00015 2692 451044 count udp from any to 195.248.XXX.XXX dst-port 53 via tun0 00016 2727 291953 count udp from 195.248.XXX.XXX 53 to any via tun0 00017 2846 545392 count tcp from any to 195.248.XXX.XXX dst-port 3128 via tun0 00018 3529 2359180 count tcp from 195.248.XXX.XXX 3128 to any via tun0
Напомню, что первый столбец - это номер правила ipfw, а в третьем столбце отображается количество байт, которые прошли через это правило. Обратите внимание, мы создали по два правила по каждому случаю: одно для входящих пакетов, второе для исходящих. Ведь нам необходимо считать трафик в обоих направлениях?
Правила для подсчета трафика я бы порекомендовал поставить в скрипте как можно выше и до основных (запрещающих или разрешающих). Если у Вас маршрутизатор с более чем одним интефейсом и в ipfw используется divert - однозначно правила следует разместить до divert'а. В моем случае я разместил count сразу же после описания правил для localhost.
Трафик считается, счетчики работают. Единственный недостаток такого способа сбора статистики - при перезапуске конфигурационного скрипта ipfw (по-умолчанию /etc/rc.firewall) все счетчики обнуляются, что может стать причиной дополнительной погрешности в статистике. А потому трогать /etc/rc.firewall не желательно. К тому же, все правила ipfw можно менять на лету. Несмотря на этот небольшой недостаток, с помощью ipfw Вы получаете достаточно точную статистику полученных и отправленных байт, которую различные утилиты (вроде trafd, bandwidthd и т.п.) предоставить не смогут.
Создание базы данных RRD для хранения статистики по трафику
После того, как правила файерволла настроены и работают, займемся непосредственно базой данных RRD. Сразу следует отметить, что в случае с подсчетом трафика RRD не следует использовать как основу для серьезного биллинга, потому что данные в базе со временем будут очень сильно усреднены и требуемой точности Вы не получите.
Прежде всего базу rrdtool необходимо создать по заданному проекту. По проекту нам в нашей базе прийдется хранить числа из восьми источников. Для RRD эти источники являются, так называемыми DS (data sources).
Дадим им имена:
- inTOTAL - входящий общий трафик (правило ipfw номер 11);
- outTOTAL - исходящий общий трафик (правило ipfw номер 12);
- inHTTP - входящий http трафик (правило ipfw номер 13);
- outHTTP - исходящий http трафик (правило ipfw номер 14);
- inDNS - входящий dns трафик (правило ipfw номер 15);
- outDNS - исходящий dns трафик (правило ipfw номер 16);
- inPROXY - входящий proxy трафик (правило ipfw номер 17);
- outPROXY - исходящий proxy трафик (правило ipfw номер 18);
Напишем для создания базы такой скрипт:
Пояснения
Первые строчки - думаю, понятно - это команда к созданию RRD базы в заданном каталоге.
--step 60 - интервал (в секундах), в течении которого в базу будут записываться данные. В классических примерах этот параметр указывают 300, т.е. пять минут, для подражания MRTG. Мне захотелось несколько сгладить графики на коротких временных интервалах и потому я step уменьшил до 60. Итак, в данном примере интервал одного отсчета равен 1 минуте. Раз в минуту нам будет необходимо снимать значения со счетчиков ipfw и отправлять их в базу.
Далее идет описание источников, из которых будет поступать информация (числа).
inTOTAL, outTOTAL и т.д. - это своеобразные имена полей в таблице RRD БД, но правильней их называть "источники данных" (data source - DS). Каждый источник необходимо описать, указав его имя, тип, параметр heartbeat, который (в случае с подсчетом трафика) обычно равен 2*step и при превышении которого промежуточные отсчеты заполняются значением UNKNOWN, а также возможные минимальное (min) и максимальное (max) значения источника данных.
Если значения min и/или max установлены, то обработанные значения отсчетов, выходящие за эти пределы, не используются. Если мы не знаем заранее какие могут быть max и min можно отметить их как неопределенные символом U.
Тип счетчика в данном случае установлен COUNTER - для получения текущего значения отсчета предыдущее значение счетчика вычитается из текущего и делится на интервал между отсчетами. Этот тип счетчика характерен когда нужно что-то измерить в единицу времени, например, отобразить загрузку канала в битах/сек.
Для каждого источника данных (DS) создается один или несколько архивов RRA. Каждый RRA (round robin archive) описан рядом параметров, такими как количество ячеек в этом архиве, каким образом вычисляется значение ячейки из значения отсчетов (функции консолидации: AVERAGE, MAX, MIN, TOTAL, LAST - см. документацию) и сколько отсчетов комбинировать в одну ячейку.
Например вот такая запись RRA:AVERAGE:0.5:1:6000 говорит нам, что в ячейках RRD архива будут храниться средние значения (AVERAGE). Число 0.5 определяет долю неопределённых значений в интервале консолидации, при которой консолидированное значение ещё считается определённым. В архиве будет создано 6000 ячеек, каждая из которых будет хранить значение одного отсчета. А у нас, как мы помним, один отсчет - это одна минута. Следовательно, в таком архиве можно будет сохранить статистику средних "одноминутных" значений и всего таких значений в ней будет 6000.
Вобщем, 6000 - это мой эксперимент. Многие используют здесь значение в 10 раз меньшее - 600. Я решил попробовать так, с той целью, чтобы была возможность просмотреть усредненную поминутную статистику за последние 6000 минут (~10 дней). Обычно это не требуется. Чем больше количество ячеек, тем больше размер RRD базы.
Еще пример: RRA:MIN:0.5:1440:7970. Здесь создается 7970 ячеек, каждая из которых будет хранить 1440 отсчетов минимальных значений для каждой DS. Со всеми остальными RRA разберитесь по аналогии.
Скрипт для создания базы выполняется один раз. После его выполнения rrdtool создаст базу RRD.
# ./create-traff-rrddb.sh # ls -la /usr/NET/rrd/ ... -rw-r--r-- 1 root www 4453848 7 апр 13:01 TOTAL-HTTP-DNS-PROXY.rrd
База создана. Можно приступить к ее наполнению значениями.
| Предыдущая страница | Следующая страница |










Вторник, 15 ноября, 2011 в 15:05:24
а Munin ваще прелесть =)
Вторник, 15 ноября, 2011 в 15:04:31
Cacti давно уже упрощает труд
Воскресенье, 30 октября, 2011 в 10:02:33
«Количество килобайт на страницу можно посмотреть командой:
# sysctl hw.pagesize» — s/килобайт/байт/
Понедельник, 3 января, 2011 в 17:13:02
Очень подробная статья! Спасибо!
Побольше бы таких описаний в сети!
Пятница, 9 апреля, 2010 в 14:50:56
и ссылка не работает:
http://daemony.org/statistics