Моніторинг системи за допомогою rrdtool

Думаю, практично кожен системний адміністратор бачив красиві графіки, що відображають будь-які статистичні дані за певний період часу. Одним із прикладів таких графіків може бути розділ статистики на цьому сайті. Подібні графіки можна намалювати за допомогою утиліт з пакета RRDtool. RRDtool - набір утиліт для роботи з кільцевої базою даних (RRD), призначених для зберігання, обробки і візуалізації динамічних (змінюються в часі) послідовностей даних, таких як мережевий трафік, температура, завантаження процесора і т.п. RRDtool дуже легко інтегрувати в bash скрипти, також є прив'язки у вигляді бібліотек до мов Perl, Python, Ruby. Всі дії я буду проводити на машині з ОС FreeBSD 8.3.

RRD - це кільцева база даних. Головна особливість даної БД полягає в тому, що вона завжди має фіксований розмір. Тобто коли, буде досягнутий кінець в якомусь полі в такий БД, то дані будуть записуватися в самий початок, тим самим, затираючи попередні. У RRD замість таблиць, колонок і полів вводяться інші поняття. У ній є так звані джерела даних (DS), які самі по собі нічого не зберігають. Для простоти їх можна інтерпретувати як звичайні колонки в таблиці. Зберігання ж даних покладається на кільцеві архіви (RRA). RRA прив'язується до джерела даних і має такі властивості як: кількість осередків; застосовується функція консолідації; інтервал часу, після якого до даних застосовується функція консолідації, і результат її роботи записується в черговий осередок. Мабуть, це все, що потрібно знати про структуру даних в RRD.

На момент написання статті в портах доступна версія 1.4.5. Отже, йдемо порти і ставимо (зверніть увагу на те, що в портах є кілька версій даного пакета):


Додатково до параметрів збірки за замовчуванням я поставив галочку навпроти DEJAVU. Зауваження - якщо ви хочете підписувати графіки українськими літерами, то необхідно поставити галочку на опцію DEJAVU. інакше у вас замість українських літер будуть кракозябри. До невеликого жаль порт тягне за собою не мало залежностей, наприклад бібліотеки glib, cairo, x11. Після установки порту буде встановлений необхідний для роботи набір утиліт.

Всі скрипти у мене зберігаються в домашній директорії користувача root в папці rrd, причому для кожного окремого типу статистики створена своя піддиректорія. У кожній такій директорії є сама база даних і три скрипта, що відповідають за створення і оновлення БД, а так же малювання графіків.


Слідувати такої ієрархії не обов'язково, адже вам може бути зручніше зберігати все це справа якось по іншому.

З пакетом rrdtool ставиться кілька утиліт і одна з них має однойменну назву - rrdtool. За допомогою неї можна здійснювати різні маніпуляції з кільцевої базою даних (створювати / змінювати БД, оновлювати / витягувати дані, будувати графіки і т.п.). Утиліта має наступний синтаксис:

Далі я опишу деякі команди (за більш детальною інформацією звертайтесь до документації):

  • Створення кільцевої бази даних

Опис параметрів:
  • filename - ім'я файлу.
  • --start, -b - час в секундах, що пройшли з початку епохи Unix (1970-01-01 UTC), з якого відбувається збір статистики. RRDtool не братиме дані старіше зазначеного тут часу. За замовчуванням: now - 10 секунд.
  • --step, -s - інтервал, через який дані надходять до бази. За замовчуванням: 300 секунд.
  • --no-overwrite, -O - НЕ перезаписувати існуючий файл з таким же ім'ям.
  • DS: ds-name: DST: dst arguments - джерело даних або простіше - колонка в БД, в якій зберігаються дані.
    • ds-name - ім'я колонки (не може бути довшим 19 символів; допустимі символи: [a-zA-Z0-9_]).
    • DST - тип джерела даних. Може приймати значення:
      • GAUGE - підходить для даних типу: температури, завантаження процесора, обсягу пам'яті.
      • COUNTER - призначений для зберігання даних з лічильників, наприклад трафіку. Мається на увазі, що значення лічильника ніколи не зменшується, за винятком випадку його переповнення.
      • DERIVE - лічильник, який може зменшуватися.
      • ABSOLUTE - теж лічильник, тільки він скидається після читання.
      • COMPUTE - дозволяє задати rpn-формулу для обробки даних.
    • heartbeat - максимальна к-ть секунд очікування даних для осередку, після якого значення позначається як UNKNOWN. Рекомендується встановлювати в 2 * step.
    • min - мінімально допустиме значення. Якщо обмежень немає, то вказуйте тут U.
    • max - максимально допустиме значення. Якщо обмежень немає, то вказуйте тут U.
  • RRA: CF: xff: steps: rows - параметри кільцевих архівів (RRA). Кожен такий архів може містити деякі значення або статистику для DS за певний період. Перш ніж потрапити в архів, дані обробляються функцією консолідації (CF). Доступні наступні функції консолідації:
    • AVERAGE - середнє значення за певний період
    • MIN - мінімальне значення
    • MAX - максимальне значення
    • LAST - останнє значення

    xff - визначає частку невизначених значень в інтервалі консолідації, при якій консолідоване значення ще вважається певним (0..1).
    steps - визначає кількість значень, для яких буде використана функція консолідації, після чого результат її роботи записується в архів.
    rows - кількість осередків, що використовується для зберігання консолідованих даних.


    Опис параметрів:
    • filename - ім'я файлу.
    • --template, -t - за допомогою цієї опції задається шаблон, який дозволяє вам вказати в які джерела даних і в якому порядку необхідно зробити запис в базу. Якщо зазначених тут джерел даних немає в файлі, то запис буде скасовано і прога викине помилку.
    • --daemon - якщо заданий, то rrdtool буде катувати підключитися до демона rrdcached. Якщо спроба буде невдалою, то видається повідомлення про помилку.
    • time | N: value [: value. ] - дані, пов'язані з часом, які пишуться в базу. Якщо в часі вказати N, то буде підставлена ​​поточна час. Час так само можна задавати в секундах з початку епохи Unix або в стилі AT (за подробицями в документацію).
  • Отримання даних з бази
  • Зміна розміру RRA
    • filename - ім'я файлу.
    • rranum - номер RRA. Номер можна дізнатися за допомогою команди rrdtool info.
    • GROW | SHRINK - дія до RRA: збільшити / зменшити.
    • rows - кількість додаються / видаляються осередків.
  • Зміна деяких характеристик бази даних

    За допомогою даної команди можна змінити характеристики бази або окремо взятого DS (наприклад, перейменувати його). За інформацією звертайтеся в документацію.
  • малювання графіків

    Ось і настав час для першого практичного прикладу)). Перед створенням БД спочатку необхідно продумати якісь дані будуть зберігатися в ній. У більшості Unix-подібних систем процесор може перебувати в 5 станах (user, system, nice, intr, idle) і FreeBSD не виняток. Я хочу зберігати кожне стан окремо, а якщо необхідно буде що-небудь об'єднати, то простими арифметичними діями цю задачу дуже просто вирішити. Отже, нам необхідна база даних з 5 DS (джерелами даних). Тепер потрібно вирішити якісь RRA знадобляться і за який проміжок часу один осередок буде зберігати дані (чим менше інтервал, тим точніше буде графік). Для побудови більш точного графіка дані будуть зніматися кожну хвилину і буде кілька RRA (забув сказати - дані будуть зберігатися за рік):

    1. Кожна клітинка зберігає дані за кожен відлік (тобто запис йде кожні 60 секунд). Щоб зберігати стільки даних знадобиться 365 * 24 * 60 * 60/60 = 525600 осередків.
    2. Кожна клітинка зберігає дані за 15 хвилин (тобто дані будуть накопичуватися протягом 15 хвилин, далі до них застосовується функція консолідації і тільки тоді відбувається запис). Щоб зберігати стільки даних знадобиться 365 * 24 * 60 * 60 / (60 * 15) = 35040 осередків.
    3. Кожна клітинка зберігає дані за 30 хвилин. Щоб зберігати стільки даних знадобиться 365 * 24 * 60 * 60 / (60 * 30) = 17520 осередків.
    4. Кожна клітинка зберігає дані за 60 хвилин. Щоб зберігати стільки даних знадобиться 365 * 24 * 60 * 60 / (60 * 60) = 8760 осередків.

    P.S. На даний момент я використовую тільки 1 RRA, інші зробив на всякий випадок, раптом знадобляться.

    Так само будуть RRA з різними функціями консолідації, тому доведеться продублювати RRA для кожного інтервалу часу. Щоб не набивати кожен раз все руками (а набивати багато), краще відразу писати скрипт. Ось так виглядає скрипт для створення необхідної БД:


    Тепер потрібно написати скрипт, який буде збирати дані, і наповнювати базу. На жаль, у FreeBSD немає стандартної утиліти, яка б виводила завантаження процесора на екран в зручному для парсинга вигляді. Можна звичайно знімати завантаження по SNMP, але встановлювати і налаштовувати додатковий софт мені не хочеться (та й ні до чого це, тому що можна зробити простіше). Тому довелося написати свою програму для вирішення даної проблеми. Ось її код:


    Скомпілювати її можна такою командою: