RRDTool: удобный инструмент мониторинга сети
Сергей «grinder» Яремчук (grinder@ua.fm)
Мониторинг сети и аппаратных ресурсов входит в обязанности любого администратора. Ведь только постоянное наблюдение позволяет выявить узкие места и предотвратить проблемы. Сегодня существует большое количество свободных проектов, реализующих готовые решения, но это не наш метод. Предлагаю закатать рукава и настроить все самостоятельно.
Содержание:
- Инструмент RRDTool
- Установка RRDTool
- Настраиваем RRDTool
- Помещаем байтики в копилку
- Строим график
- Заключение
- Мини-статья: Утилита MRTG
- Врезка
- Боковые выносы
Набор утилит RRDTool (Round Robin Database tool) предназначен для хранения, обработки и отображения любых данных, изменяющихся во времени (сетевой трафик, пропускная способность сети, загрузка процессора и ОЗУ, температура и т.д.). По сравнению с MRTG, RRDTool имеет более мощные средства сбора информации и создания графиков. Вся информация хранится в кольцевой базе данных, ячейки которой задействуются циклически, в связи с чем размер БД остается постоянным. Заложенные алгоритмы усредняют результат, таким образом, можно охватить больший промежуток времени при малых размерах баз. Хотя именно поэтому RRDTool нельзя использовать там, где нужны точные результаты, например в биллинговой системе. Кроме того, за большую гибкость в работе приходится платить отсутствием единого конфигурационного файла и некоторой сложностью в настройках, но эту проблему стараются решить за счет использования различного рода дополнений, список которых можно найти на странице .
RRDTool имеется в репозитариях большинства дистрибутивов Linux и портах BSD-систем. Чтобы установить RRDTool в Free/OpenBSD, достаточно ввести:
# cd /usr/ports/databases/rrdtool # make install clean
Команда «sudo apt-cache search rrdtool» в Debian/Ubuntu выведет не только название нужного пакета, но и большой список приложений, являющихся фронтэндами. В дальнейшем работать будем в Ubuntu 8.04, но все сказанное, за исключением особенностей установки зависимостей, касается и других дистрибутивов Linux и *nix-систем.
На данный момент активно развивается ветка 1.3.x, а в репозитории нам предлагают 1.2.19-1ubuntu1 (sudo apt-cache show rrdtool | grep -i version), поэтому произведем установку из исходных текстов. Сначала инсталлируем пакеты, требуемые для компиляции и удовлетворения зависимостей:
$ sudo apt-get install build-essential libpango1.0-dev libxml2-dev $ sudo apt-get build-dep rrdtool
Затем скачиваем и распаковываем архив с сырцами:
$ wget -c http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz $ tar xzvf rrdtool.tar.gz $ cd rrdtool-1.3.3
В дефолтном режиме установка производится в /usr/local/rrdtool-1.3.3, это несколько неудобно, поэтому:
$ ./configure --prefix=/usr/local/rrdtool
По окончании процесса конфигурирования получаем итоговую таблицу. Следует внимательно просмотреть поля с «no», вдруг скрипт не нашел что-то важное. Если все в порядке, выполняем стандартную сборку:
$ make $ sudo make install
Проверить правильность установки очень просто. В подкаталоге share/rrdtool/examples находится ряд готовых скриптов:
$ ls /usr/local/rrdtool/share/rrdtool/examples/
4charts.pl cgi-demo.cgi perftest.pl shared-demo.pl
bigtops.pl minmax.pl piped-demo.pl stripes.pl
Запустим один из них:
$ sudo ./shared-demo.pl
После выполнения скрипта в текущем каталоге появятся два файла с расширением rrd и два рисунка. Копируем рисунки в корневой каталог веб-сервера (или открываем во вьювере):
$ cp shared-demo* /var/www/
Теперь заходим на страницу http://localhost/shared-demo1.png и смотрим результат. Если рисунок сгенерирован, значит, все работает, и настало время узнать, почему так не любят RRDTool новички.
Вся работа с RRDTool производится при помощи одной утилиты, которая так и называется – rrdtool. Утилита имеет 13 параметров, определяющих, чем она сейчас будет заниматься (полную информацию о них можно найти в справочной странице rrdtool(1)). В большинстве случаев требуется пройти три этапа:
- проектирование и создание базы данных (rrdtool create);
- получение показаний счетчика и обновление информации в базе (rrdtool update);
- создание графиков (rrdtool graph).
В отличие от реляционной базы данных, кольцевая имеет более простую структуру. В нее записывается значение переменной и связанная временная метка. Также в базе может храниться информация, с помощью которой заложенные в RRDTool алгоритмы позволят вычислить значения пропущенных параметров.
Для примера создадим базу, куда будем заносить значения загрузки канала для входящего и исходящего трафика. Считывание параметров можно производить несколькими способами: анализ вывода команды ifconfig, SNMP и т.д. В примере будет использован второй вариант, как более универсальный, хотя большой разницы в том, откуда брать информацию, нет.
Создадим каталог для хранения баз:
$ mkdir /usr/local/rrd
Создаем новую базу при помощи «rrdtool create»:
$ sudo rrdtool create /usr/local/rrd/bandwidth.rrd --start N DS:in:COUNTER:600:U:U DS:out:COUNTER:600:U:U RRA:AVERAGE:0.5:1:432
На первый взгляд выглядит малопонятно, но сейчас это поправим. Первым аргументом команды является имя базы. По умолчанию файл будет создан в текущем каталоге, но лучше привыкать использовать полный путь (в скриптах, естественно, можно подставлять переменные). Параметр «--start N» указывает на время создания базы. Время в базе сохраняется в Unix формате (от 01-01-1970). Параметр N (от Now) показывает на текущее время, но его можно представить в виде «20081001 12:10″. Подробности по всем вариантам установки времени смотри в rrdfetch(1). Чтобы задать интервал отсчета времени, в команде можно использовать параметр ‘--step’ с указанием времени в секундах (по умолчанию 300 секунд). Источник данных описывается параметром DS (data source). В одной базе может храниться информация сразу о нескольких источниках. Вторым аргументом после DS идет название источника. Имя не должно превышать 19 символов [a-zA-Z0-9_]. В примере создано два источника in и out, в которых и будем хранить информацию о входящем и исходящем трафике.
Следующее поле со значением COUNTER определяет тип данных, которые будут получены от источника. Существует 5 возможных значений этого поля:
- GAUGE – в счетчик сохраняется считанное значение без изменений;
- COUNTER – предполагается, что этот счетчик всегда увеличивается. Значение сохраняется в виде «единица в секунду», т.е. текущее значение вычисляется как разность между считанным и предыдущим, разделенное на количество времени. Для этого счетчика обрабатывается переполнение.
- DERIVE – подобен предыдущему, но его значение может уменьшаться, переполнение не обрабатывается;
- ABSOLUTE – используется для счетчиков, значение которых обнуляется при каждом считывании, в ячейку записывается считанное значение, поделенное на интервал времени;
- COMPUTE – виртуальная ячейка, хранящая результат выполнения формулы значений из других ячеек.
Теперь, думаю, понятно, почему был выбран именно COUNTER. Подсчитывая данные о трафике, мы будем знать загрузку канала. Значение 600 после поля счетчика устанавливает так называемый heartbeat – максимально допустимый интервал (в секундах) между считываниями (рекомендуется двойной ‘--step’), показывающий, как часто должна заполняться ячейка. При превышении этого интервала пропущенные значения заполняются значением *UNKNOWN*. И, наконец, два последних поля предназначены для указания минимального и максимального значения параметра, при превышении этих чисел значение будет установлено в *UNKNOWN*. Если определить эти цифры невозможно, то так и пишем – «U» (т.е. UNKNOWN).
Параметр RRA (round robin archives) определяет количество ячеек для каждого DS (на DS может быть несколько RRA), а также функцию, показывающую, как вычислять значение ячейки. Функции консолидации могут быть:
- AVERAGE – среднее арифметическое всех отсчетов;
- MIN и MAX – максимальное и минимальное значение;
- TOTAL – сумма всех отсчетов;
- LAST – последний полученный отсчет.
В версии 1.2 дополнительно к основным функциям добавлены еще несколько специализированных, обеспечивающих экспоненциальное сглаживание по алгоритму Холта-Винтерса – HWPREDICT, SEASONAL, DEVSEASONAL, DEVPREDICT и FAILURES.
Число 0.5 показывает на достоверность, т.е. число отсчетов со значением *UNKNOWN*, после превышения которого ячейка также принимает значение «U». В качестве значения должно быть использовано число в диапазоне 0-1.
Последние две цифры определяют шаг (количество первичных точек, которые формируют точку данных, поступающую в архив) и собственно число ячеек. База создана, просмотреть информацию о ней можно при помощи команды:
$ rrdtool info /usr/local/rrd/bandwidth.rrd
Если в процессе эксплуатации выяснилось, что параметры базы данных подобраны не удачно (например, выбрано малое количество ячеек), то ничего страшного в этом нет. Чтобы изменить размер RRA, используй «rrdtool resize», для изменения любого параметра DS применяется «rrdtool tune».
База создана, теперь ее нужно чем-то наполнить.
Как договорились, RRD-базу будем заполнять при помощи SNMP. Устанавливаем нужные пакеты:
$ sudo apt-get install snmp snmpd
После установки у нас уже есть готовый snmpd.conf файл, настроенный на выдачу данных только для localhost. Он нам подходит, поэтому нет необходимости выполнять команду «sudo snmpconf -i». Копируем его в надлежащее место и перезапускаем демон:
$ sudo cp –v /usr/share/snmp/snmpd.conf /etc/snmp/ $ sudo /etc/init.d/snmpd restart
Смотрим список доступных идентификаторов объекта (object identifier, OID). Здесь параметр «–v 1″ указывает на версию протокола, а ‘-c’ – на комьюнити для доступа:
$ snmpwalk -v 1 -c public localhost
Нас пока интересуют сетевые интерфейсы, поэтому вывод можем сократить, введя:
$ snmpwalk -v 1 -c public localhost interfaces
Ищем нумерацию сетевых карт, которая описывается при помощи IF-MIB::ifDescr:
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1
Нам нужна лишь последняя цифра параметра. В примере видим, что интерфейсу eth0 соответствует цифра 2, а eth1 – 3. Текущие показатели счетчиков входящего и исходящего трафика показаны соответственно в параметрах IF-MIB::ifInOctets и IF-MIB::ifOutOctets:
IF-MIB::ifInOctets.1 = Counter32: 444010
IF-MIB::ifInOctets.2 = Counter32: 34402149
IF-MIB::ifInOctets.3 = Counter32: 0
IF-MIB::ifOutOctets.1 = Counter32: 444010
IF-MIB::ifOutOctets.2 = Counter32: 2797708
IF-MIB::ifOutOctets.3 = Counter32: 5726
Получить значение для eth0 можно при помощи команды snmpget, добавив в качестве последнего аргумента OID. Дополнительный параметр ‘–Oqv’ позволяет сократить вывод, оставив только значения:
$ snmpget -v 1 -c public -Oqv localhost IF-MIB::ifInOctets.2 IF-MIB::ifOutOctets.2 35816758 3962688
Команда для занесения данных в таблицу в общем случае выглядит так:
rrdtool update file.bandwidth.rrd время:значениеDS1[:значениеDSn]
Пишем:
$ sudo rrdtool update /usr/local/rrd/bandwidth.rrd N: `snmpget -v 1 -c public -Oqv localhost IF-MIB::ifInOctets.2`: `snmpget -v 1 -c public -Oqv localhost IF-MIB::ifOutOctets.2`
Вывод «rrdtool info» показывает, что данные в базе изменились. Если все нормально, даем планировщику указание, чтобы он запускал эту команду каждые 5 минут.
$ sudo crontab -e
0-55/5 * * * * /usr/local/rrdtool/bin/rrdtool update …
Как ты понимаешь, в качестве записываемого значения можно использовать отформатированный вывод любой команды. Например:
$ ifconfig eth0 | grep "RX bytes" | awk -F: '{print $2}'
| awk '{print $1}'
36888337
$ ifconfig eth0 | grep "TX bytes" | awk -F: '{print $2}'
| awk '{print $1}'
47806191
Все, база наполняется значениями, переходим к написанию скрипта для построения графиков.
Команда для создания графиков довольно легка для понимания, хотя в скриптах она обычно выглядит пугающе из-за большого количества возможных значений. После работы «rrdtool graph» будет сгенерирован только графический файл, html обертку для его показа в браузере придется рисовать самому. Для удобства создадим скрипт bandwidth-graph.sh такого содержания:
$ sudo nano bandwidth-graph.sh #!/bin/sh /usr/local/bin/rrdtool graph /usr/local/rrd/bandwidth.png -a PNG -h 125 -v "Данные о загрузке eth0" 'DEF:in=/usr/local/rrd/bandwidth.rrd:in:AVERAGE' 'DEF:out=/usr/local/rrd/bandwidth.rrd:out:AVERAGE' 'CDEF:kbin=in,1024,/' 'CDEF:kbout=out,1024,/' 'AREA:in#00FF00:Загрузка In' 'LINE1:out#0000FF:Загрузка Outj' 'GPRINT:kbin:LAST:Последнее значение In: %3.2lf кБсек' 'GPRINT:kbout:LAST:Последнее значение Out: %3.2lf кБсекj'
При описании можно использовать и русские названия, но большие комментарии к подписям я бы делать не стал, они могут просто не поместиться на рисунок.
В скрипте не указаны параметры ‘--start’ и ‘--end’. С их помощью можно задать время начала и конца интервала, который попадет на график. Если они опущены, то будет выведен график за прошедшие сутки. Временной промежуток также влияет на масштаб графика. Размеры рисунка можно установить принудительно при помощи ‘–w’ (--width) и ‘–h’ (--height), указав значение в пикселях. Тип файла задает параметр ‘–a’, в качестве значения можно использовать PNG|SVG|EPS|PDF. Заголовок рисунка можно оформить горизонтально ‘–t’ или вертикально ‘–v’.
Параметр DEF указывает на то, какие данные мы будем извлекать из RRA записи. Затем идет имя переменной, которое будет использовано в графиках. Далее практически все как при «rrdtool create» – имя файла, извлекаемый параметр и функция консолидации.
А вот CDEF позволяет производить некоторые действия с извлеченными параметрами. Сюда записывается выражение в обратной польской записи (см. врезку). В данном случае значение in и out делится на 1024, результат (килобайты) записывается в kbin и kbout.
Параметры AREA и LINE показывают метод вывода указанного параметра на графике. В результате in будет показан зеленым сплошным цветом (#00FF00), а out – синей (#0000FF) полосой. Последним значением идет легенда, т.е. описание параметра. Чтобы легенду напечатать под графиком, используем j (justify).
Функция GPRINT выводит данные мониторинга. Обрати внимание, чтобы показать последнее значение параметра, вместо AVERAGE используется LAST.
Теперь делаем скрипт исполняемым и запускаем:
$ sudo chmod +x bandwidth-graph.sh $ sudo ./bandwidth-graph.sh
В результате в каталоге /usr/local/rrd должен появиться файл bandwidth.png.
Как видишь, ничего сложного в RRDTool нет. Это очень гибкая и понятная в работе программа. Посидев немного над скриптами, можно аналогичным образом строить графики по остальным данным, выдаваемым демоном SNMP или любыми другими утилитами.
Первая версия (Multi Router Traffic Grapher) была выпущена Тобиасом Оутайкером в 1994 году. Сначала это был небольшой скрипт на языке Perl, предназначенный для наблюдения за загрузкой канала, затем его научили работать с другими данными. Не смотря на то, что автор сейчас активно развивает RRDTool, работа над MRTG не прекращена, оба проекта развиваются параллельно. Т.к. MRTG проще в настройке, он очень удобен при построении простых систем мониторинга, например для контроля загрузки сети, процессора и памяти. Для сбора информации также используется протокол SNMP (Simple Network Management Protocol), MRTG периодически опрашивает наблюдаемые объекты и на основе полученной информации строит PNG-графики. Поэтому MRTG подходит для контроля за любым оборудованием, поддерживающим SNMP. Так же как и в RRDTool, графики усредняются, поэтому его нельзя использовать там, где нужны точные данные. Администратор ограничен в функциях построения графиков. Например, на график нельзя наложить данные из двух источников, например проанализировать нагрузку на двух серверах. Для этого придется строить два графика.
Графики по оси Y всегда начинаются с 0, что уменьшает разрешение, и не удобно в том случае, если администратора интересуют данные в каком-то определенном диапазоне. Еще один минус MRTG, из-за которого началась разработка RRDTool, заключается в том, что он весьма неустойчив. При аварийном завершении можно потерять журналы.
В будущем планируется объединить два пакета в один, но уже сегодня MRTG и RRDTool могут работать вместе. Поэтому часто администраторы используют для сбора информации более удобный в настройках MRTG, сохраняя данные в совместимом с RRDTool формате (LogFormat: rrdtool), а сами графики строят при помощи RRDTool. Пример такого симбиоза можно найти в документе «).
Врезка
Обратная польская нотация (Обратная польская запись, Постфиксная нотация, Польская инверсная запись, Полиз) — форма записи математических выражений, в которой операнды расположены перед знаками операций. Так выражению «kbin=in,1024,/» соответствует kbin=in/1024. Удобна тем, что позволяет избавиться от скобок, содержащихся в выражении.
DVD
-
На прилагаемом к журналу диске ты найдешь набор скриптов для обработки и визуализации данных, поступающих с источника бесперебойного питания APC Smart-UPS.
INFO
- Статью о Cacti смотри в X_09_2007.
-
Название DS источника должно состоять из символов [a-zA-Z0-9_] и быть не более 19 знаков.
WWW
-
Самую свежую версию RRDTool можно найти на сайте проекта .
-
Список фронтэндов найдешь на странице .
WARNING
-
RRDTool нельзя использовать там, где нужны точные результаты, например в биллинговой системе.
Статья опубликована в ноябрьском номере журнала «Xakep» за 2008 год.





