惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Мониторинг с RRD
JBFW · 2026-05-29 · via Все публикации подряд на Хабре

5 мин

11K

Если у вас есть какая-то система мониторинга чего-то - наверняка там есть какие-то показатели, которые актуальны здесь и сейчас: для метеостанции - температура, для роутера - трафик, для сервера - нагрузка, и т.д. - в общем, какая-то актуальная величина.
Но кроме онлайн-значений - может быть полезен график, например за ближайшие сутки, или за месяц, или за год - чтобы можно было оценивать тренды.

Или наоборот: иногда происходит какое-то событие, достаточно редкое (сбой, или наоборот срабатывание устройства), но хотелось бы понимать, насколько часто, и не меняется ли его частота в разные периоды - ведь это может быть признаком более серьезной проблемы.

Самое очевидное решение - писать данные в базу.
Но такая таблица будет постоянно расти, занимать всё больше места, а выборка за прошлый период может отрабатывать довольно долго, особенно если требуется уместить целый год в 900 пикселей графика.

Когда-то и я наступил на эти грабли - когда база на MongoDB распухла так, что не влезла в 32-битный компьютер. Но это другая история.

При этом далеко не всегда нужно точно знать, какая температура была на датчике 26 июля 2016 года в 14:33:15 - чаще достаточно просто усредненных значений.
Вот как раз для подобного давным-давно люди придумали RRD - Round-robin database.

Принцип простой: кольцевой буфер фиксированной длины, новые значения записываются в него одно за другим, а когда доходят до конца - начинают записываться с начала.
Мы всегда знаем, какое значение актуально сейчас, а какое - Х времени назад, если это время не превышает длину буфера.
Более того - таких буферов может быть несколько, с разным "размером" ячейки и с разной длиной, просто за больший период будут храниться данные с меньшей детализацией.

Для работы с подобным давным-давно существует инструмент rrdtools.
Это несколько утилит, которые работают с файлами RRD, позволяя создавать их, наполнять данными, извлекать данные и даже строить графики.

Например, нужно хранить температуру - типовая, простая задача.
Сначала создаем под нее файл базы данных:

rrdtool create termo.rrd -s 60 \
  DS:t:GAUGE:300:-50:U \
  RRA:LAST:0.5:1:10080 \
  RRA:AVERAGE:0.5:5:8064 \
  RRA:AVERAGE:0.5:60:8760

Создается файл termo.rrd, шаг данных - 60 секунд.
В нем будет один "источник данных", DS, который условно называется "t", имеет тип GAUGE (измерение, показатель), для него установлен период 300 секунд, в течении которых ожидаются хоть какие-то данные, минимальное значение -50, максимальное - не определено (U).
Данные обрабатываются "как есть", температуры ниже -50 отбрасываются, если в течении периода 300 сек ничего не записано - считаем, что данных нет, nan.

При этот определены 3 буфера, RRA:
Первый состоит из слотов по 1 60-секундному периоду, в каждом слоте будет содержать последнее поступившее значение, и всего их таких - 10080 штук, итого весь период 604800 секунд, 168 часов, 7 дней.
Второй состоит из слотов по 5 60-секундных периодов, т.е. 5 минут, в которых среднее значение за этот слот, и всего таких - 8064 штуки, то есть 40320 минут, 672 часа, 28 дней.
Третий - слоты по 60*60-секунд (1 час), весь период 8760 часов, 365 дней. Таким образом, максимальный период хранения данных - 1 год.

Параметр "0.5" говорит о том, что в слоте допускается до половины неизвестных (nan) значений.
То есть, если по какой-то причине части данных не было - игнорируем, и считаем по имеющимся.

Размер этого файла составил чуть больше 200 килобайт, и расти он уже не будет.
Самих записей не так уж много, поэтому выборка по ним будет работать быстро.

Для внесения данных есть команда update:

rrdtools update termo.rrd N:27.54

Эта команда запишет температуру 27.54 на текущее время.
Всё остальное - выбор последнего знанения, усреднения, раскладку по буферам и прочее - система сделает сама.

Можно вместо N указать unixtime - тогда данные будут добавлены для указанного времени - но для мониторинга обычно это не нужно.

В случае "парных" величин (температура-влажность, трафик входящий-исходящий) можно при создании файла базы указывать по нескольку DS с разными именами - храниться они будут в одном файле в одинаковых RRA.
В этом случае при update очередные значенияя также указываются парами - например, "N:25.12:56.4".

Получение данных за период - fetch:

rrdtools fetch termo.rrd AVERAGE -s -3600 -e -3000

Запрошены усредненные данные за период от 3600 секунд назад до 3000 секунд назад. Конец периода можно не указывать - будет до настоящего момента. Можно использовать модификаторы типа h - час, d - день.
Ответ будет примерно таким:

1779970020: 1.1446144343e+01
1779970080: 1.1548646165e+01
1779970140: 1.1466569217e+01
1779970200: 1.1453367132e+01
1779970260: 1.1357315488e+01
1779970320: 1.1213944783e+01
1779970380: 1.1060893320e+01
1779970440: 1.0848092697e+01

Формат: unixtime: value
Например, теммпература в 1779970260 сек - 11.357315488 градуса (усредненная).
Теперь по ним можно строить графики, используя свои любимые инструменты, или запускать какую-то аналитику.

Также можно сразу получить картинку:

rrdtools graph - DEF:x=termo.rrd:t:AVERAGE LINE1:x#f00 -s -7d > out.png

Получаем картинку в PNG, для чего указываем источник данных x = t из файла termo.rrd, и график в виде линии толщиной 1px по переменной x, рисуя его красным цветом (#f00).
Период - за последние 7 дней.

При желании там много чего можно настроить: подключить разные файлы, извлекать разные данные, рисовать разным цветом, добавлять надписи и так далее. В этом случае дополнительные инструменты для рисования картинок уже не нужны.

Все это более подробно расписано в man rrdtools, я просто привел несколько базовых примеров. А вот как это оказалось можно использовать на практике (тоже есть в man, но немного модифицируем):

Допустим, у нас есть какой-то скрипт, собирающий данные с датчиков, на машине A.
Веб-сервер, показывающий дашборды - на машине B.
Плюс еще машины C, D, и вообще какие-нибудь девайсы на ESP, которые тоже могут давать данные.
И работать с файлами - ну, это не очень удобно, не копировать же их туда-сюда, тем более не везде можно установить rrdtools.

Но можно превратить rrdtools в сетевой микросервис:

Если взять старый добрый inetd (а лучше xinetd) - можно “повесить” rrdtools на какой-то порт на одной из машин.
В этом случае файлы rrd будут находиться там, а вот работать с ними, в том числе вносить, получать данные или строить графики, можно хоть с ESP.

Для inetd - нужно определить “имя сервиса” для rrd в /etc/services

rrd   23456/tcp    # примерно так

или взять оттуда любое свободное готовое.
Создать юзера rrduser, и выделить место для файлов, например в /var/rrd/
Потом указать в /etc/inetd.conf:

rrd stream tcp nowait rrduser /usr/bin/rrdtool rrdtool - /var/rrd

После запуска inetd на порту 23456 будет доступен rrdtools, которому можно отправлять команды.

Если использовать xinetd - там примерно так же, только можно еще и ограничить, на каком интерфейсе слушать порт:

/etc/xinet.d/rrd

service services
{
  bind    = 192.168.1.11
  port    = 23456
  socket_type = stream
  protocol  = tcp
  wait    = no
  user    = rrduser
  disable   = no
  server    = /usr/bin/rrdtool
  server_args = rrdtool - /var/rrd
}

Ограничивать по юзеру и интерфейсу нужно потому, что у rrdtools среди команд есть такие как list, которая позволяет просматривать каталоги на сервере (если есть права), и create в принципе может создавать rrd в любом доступном каталоге.
Можно вообще засунуть rrdtools в docker - чтобы там ничего лишнего точно не было.

Но в любом случае в итоге - сетевой микросервис.
Можно отправлять команды примерно так:

echo "update termo.rrd N:11.44" |/usr/bin/nc -N server port
echo "fetch termo.rrd LAST -s -3600 -e -3200" |/usr/bin/nc -N server port

Если к серверу есть доступ - можно создавать и работать с файлами по сети. Устанавливать на разные машины rrdtools не нужно.
Только помнить о том, что защиты как таковой там нет - вы всегда можете просто случайно или специально перезаписать существующий файл, создав его заново.
Но в ряде случаев это приемлемо.