Универсальный наблюдательСергей «grinder» Яремчук / grinder@ua.fm, tux.in.ua / Мониторинг сети и аппаратных ресурсов входит в обязанности любого администратора. Только постоянное наблюдение может выявить узкие места и предотвратить возможные проблемы. Предлагаю закатать рукава и настроить все самостоятельно. Настало время узнать, почему набор утилит RRDTool так не любят новички. Готовые решения – не наш методИнструмент RRDTool (Round Robin Database tool) предназначен для хранения, обработки и отображения любых данных, изменяющихся во времени (например, сетевой трафик, пропускная способность сети, загрузка процессора и ОЗУ, температура и т.д.). По сравнению с MRTG, RRDTool имеет более мощные средства сбора информации и создания графиков. Вся инфа хранится в кольцевой базе данных, ячейки которой задействуются циклически, – в итоге, размер БД остается постоянным. Заложенные алгоритмы усредняют результат; таким образом, можно охватить больший промежуток времени при малых размерах баз. Хотя именно по этой причине RRDTool нельзя использовать там, где нужны точные результаты (к примеру, в биллинговой системе). За большую гибкость в работе приходится платить и отсутствием единого конфигурационного файла, и некоторой сложностью в настройках. Но эту проблему стараются решить за счет использования различного рода дополнений, список которых можно найти на странице oss.oetiker.ch/rrdtool/rrdworld/index.en.html. Установка rrdtoolRRDTool имеется в репозитариях большинства дистрибутивов Linux и портах BSD-систем. Чтобы установить RRDTool в Free/OpenBSD, достаточно ввести:
Команда «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), поэтому произведем установку из исходных текстов. Сначала инсталлируем пакеты, требуемые для компиляции и удовлетворения зависимостей:
Затем скачиваем и распаковываем архив с сорцами:
В дефолтном режиме установка производится в /usr/local/ rrdtool-1.3.3. Это несколько неудобно, поэтому:
По окончании процесса конфигурирования получаем итоговую таблицу. Внимательно просмотри поля с «no», вдруг скрипт не нашел что-то важное. Если все в порядке, выполняем стандартную сборку:
Проверить правильность установки очень просто. В подкаталоге share/rrdtool/examples находится ряд готовых скриптов:
Запустим один из них:
После выполнения скрипта в текущем каталоге появятся два файла с расширением rrd и два рисунка. Копируем рисунки в корневой каталог веб-сервера (или открываем во вьювере):
Теперь заходим на страницу http://localhost/shared-demo1.png и смотрим результат. Если рисунок сгенерирован, значит, все работает. Настраиваем rrdtoolВся работа с RRDTool производится при помощи одной утилиты, которая так и называется – rrdtool. Утилита имеет 13 параметров, определяющих, чем она сейчас будет заниматься (полную информацию о них можно найти в справочной странице rrdtool(1)). В большинстве случаев требуется пройти три этапа:
В отличие от реляционной базы данных, кольцевая имеет более простую структуру. В нее записывается значение переменной и связанная временная метка. Также в базе может храниться информация, с помощью которой заложенные в RRDTool алгоритмы позволят вычислить значения пропущенных параметров. Для примера создадим базу, куда будем заносить значения загрузки канала для входящего и исходящего трафика. Считывание параметров можно производить несколькими способами: анализ вывода команды ifconfig, SNMP и т.д. В примере будет использован второй вариант, как более универсальный (хотя большой разницы в том, откуда брать информацию, нет). Создадим каталог для хранения баз:
Новую базу сотворим при помощи «rrdtool create»:
Выглядит малопонятно, но сейчас мы это поправим. Первым аргументом команды является имя базы. По умолчанию файл будет создан в текущем каталоге, но лучше привыкать использовать полный путь (в скриптах, естественно, можно подставлять переменные). Параметр «--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 определяет тип данных, которые будут получены от источника. Существует пять возможных значений этого поля:
Теперь, думаю, понятно, почему был выбран именно COUNTER. Подсчитывая данные о трафике, мы будем знать загрузку канала. Значение 600 после поля счетчика устанавливает так называемый heartbeat – максимально допустимый интервал (в секундах) между считываниями (рекомендуется двойной '--step '). Он показывает, как часто должна заполняться ячейка (при превышении этого интервала пропущенные значения заполняются значением *UNKNOWN*). И, наконец, два последних поля предназначены для указания минимального и максимального значения параметра. При превышении этих чисел значение будет установлено в *UNKNOWN*. Если определить эти цифры невозможно, то так и пишем – “U” (то есть UNKNOWN). Параметр RRA (round robin archives) определяет количество ячеек для каждого DS (на DS может быть несколько RRA), а также функцию, показывающую, как вычислять значение ячейки. Функции консолидации могут быть:
В версии 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. Устанавливаем нужные пакеты:
После установки у нас уже есть готовый файл snmpd.conf, настроенный на выдачу данных только для localhost. Он нам подходит, поэтому нет необходимости выполнять команду «sudo snmpconf -i». Копируем его в надлежащее место и перезапускаем демон:
Смотрим список доступных идентификаторов объекта (object identifier, OID). Здесь параметр «–v 1» указывает на версию протокола, а ‘-c’ – на комьюнити для доступа:
Нас пока интересуют сетевые интерфейсы, поэтому вывод можем сократить:
Ищем нумерацию сетевых карт, которая описывается при помощи 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. Удобно тем, что позволяет избавиться от скобок, содержащихся в выражении. |