RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Мониторинг сети и аппаратных ресурсов входит в обязанности любого администратора. Только постоянное наблюдение может выявить узкие места и предотвратить возможные проблемы. Предлагаю закатать рукава и настроить все самостоятельно. Настало время узнать, почему набор утилит RRDTool так не любят новички.
Готовые решения – не наш метод
Инструмент RRDTool (Round Robin Database tool) предназначен для хранения, обработки и отображения любых данных, изменяющихся во времени (например, сетевой трафик, пропускная способность сети, загрузка процессора и ОЗУ, температура и т.д.). По сравнению с MRTG, RRDTool имеет более мощные средства сбора информации и создания графиков. Вся инфа хранится в кольцевой базе данных, ячейки которой задействуются циклически, – в итоге, размер БД остается постоянным. Заложенные алгоритмы усредняют результат; таким образом, можно охватить больший промежуток времени при малых размерах баз. Хотя именно по этой причине RRDTool нельзя использовать там, где нужны точные результаты (к примеру, в биллинговой системе). За большую гибкость в работе приходится платить и отсутствием единого конфигурационного файла, и некоторой сложностью в настройках. Но эту проблему стараются решить за счет использования различного рода дополнений, список которых можно найти на странице oss.oetiker.ch/rrdtool/rrdworld/index.en.html.
Установка 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), поэтому произведем установку из исходных текстов. Сначала инсталлируем пакеты, требуемые для компиляции и удовлетворения зависимостей:
$ 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 и т.д. В примере будет использован второй вариант, как более универсальный (хотя большой разницы в том, откуда брать информацию, нет). Создадим каталог для хранения баз:
Выглядит малопонятно, но сейчас мы это поправим. Первым аргументом команды является имя базы. По умолчанию файл будет создан в текущем каталоге, но лучше привыкать использовать полный путь (в скриптах, естественно, можно подставлять переменные). Параметр «--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 определяет тип данных, которые будут получены от источника. Существует пять возможных значений этого поля:
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». Копируем его в надлежащее место и перезапускаем демон:
Смотрим список доступных идентификаторов объекта (object identifier, OID). Здесь параметр «–v 1» указывает на версию протокола, а ‘-c’ – на комьюнити для доступа:
$ snmpwalk -v 1 -c public localhost
Нас пока интересуют сетевые интерфейсы, поэтому вывод можем сократить:
$ snmpwalk -v 1 -c public localhost interfaces
Ищем нумерацию сетевых карт, которая описывается при помощи IF-MIB::ifDescr:
Нам нужна лишь последняя цифра параметра. В примере видим, что интерфейсу eth0 соответствует цифра 2, а eth1 – 3. Текущие показатели счетчиков входящего и исходящего трафика показаны соответственно в параметрах IFMIB:: ifInOctets и IF-MIB::ifOutOctets:
Получить значение для eth0 можно при помощи команды snmpget, добавив в качестве последнего аргумента OID. Дополнительный параметр '–Oqv' позволяет сократить вывод, оставив только значения:
Вывод «rrdtool info» показывает, что данные в базе изменились. Если все нормально, даем планировщику указание, чтобы он запускал эту команду каждые 5 минут.
Все, – база наполняется значениями. Переходим к написанию скрипта для построения графиков.
Строим график
Команда для создания графиков довольно легка для понимания, хотя в скриптах она обычно выглядит пугающе из-за большого количества возможных значений. После работы «rrdtool graph» будет сгенерирован только графический файл; html-обертку для его показа в браузере придется рисовать самому. Для удобства создадим скрипт bandwidth-graph. sh такого содержания:
При описании можно использовать и русские названия, но большие комментарии к подписям я бы делать не стал, они могут просто не поместиться на рисунок. В скрипте не указаны параметры '--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! Теперь делаем скрипт исполняемым и запускаем:
В результате в каталоге /usr/local/rrd должен появиться файл bandwidth.png.
Ничего сложного
Как видишь, ничего сложного в RRDTool нет. Это очень гибкая и понятная в работе программа. Посидев немного над скриптами, можно аналогичным образом строить графики по остальным данным, выдаваемым демоном SNMP или любыми другими утилитами.
Обратная польская нотация (Обратная польская запись, Постфиксная нотация, Польская инверсная запись, Полиз) — форма записи математических выражений, в которой операнды расположены перед знаками операций. Так, выражению «kbin=in,1024,/» соответствует kbin=in/1024. Удобно тем, что позволяет избавиться от скобок, содержащихся в выражении.