Мониторинг производительности

Отправной точкой для анализа производительности является вкладка объекты в панели администратора.

Там вы найдете системную информацию о хостах (ioBroker поддерживает работу с несколькими хостами) и отдельных сетевых адаптерах.

Они отображаются только в экспертном режиме: переключение между режимами осуществляется с помощью значка в левом нижнем углу строки меню. Затем введите system.host.<Name des Hosts>. в фильтр ID:

Значения производительности хоста в дереве объектов

Показатели производительности хоста

В терминологии ioBroker хостом называется компьютер, на котором запущен процесс контроллера ioBroker.

В многохостовой среде это может легко включать в себя несколько компьютеров для распределения нагрузки.

Даже используемые операционные системы могут отличаться.

Это создает серьезную проблему, например, для кластерных стеков Raspberry Pi, связанных с управлением аппаратным ограничением в 1 ГБ оперативной памяти.

Джефф Гирлинг, YouTube

JS-контроллер ioBroker координирует запуск и остановку адаптеров, а также выполняет другие задачи управления системой в фоновом режиме. Показатели производительности для каждого хост-компьютера и JS-контроллера можно найти в панели администратора по идентификатору system.host.<Name_des_Hostrechners>.

Ниже приведён список отдельных ключевых фигур и их значение:

Ключевой показательТип данныхЕдиница измеренияОписание
aliveЛогикаnoneУказывает, активен ли js-контроллер ioBroker на хосте
diskFreeЧислоМиБСвободное дисковое пространство на логическом диске, где установлен ioBroker bi = двоичное кратное (1 МБ = 1 000 000 байт) < (1 МиБ = 1 048 576 байт = 1 × 1024 × 1024 байт)
Размер дискаЧислоМиБОбщий размер логического диска, на котором установлен ioBroker
diskWarningЧисло%Здесь можно ввести значение в процентах. Если свободное место на диске опустится ниже этого значения (например, 20), в панели администратора отобразится предупреждение. Это особенно полезно, если активен адаптер истории. Экран
freememЧислоМБОбщий объем доступной оперативной памяти хоста
inputCountЧисло/15sКоличество изменений значений состояния. Событие ввода может быть инициировано, например, созданием или установкой значения.
нагрузкаЧисло%Общая загрузка ЦП системы, усредненная за одну секунду. Не удивляйтесь, это значение всегда равно 0 в Windows.
памятьЧисло%Использование памяти. Соотношение свободной памяти к общему объему системной памяти
memHeapTotalЧислоМБРазмер памяти кучи, зарезервированной контроллером JavaScript
memHeapUsedЧислоМБРазмер памяти кучи, используемой контроллером JavaScript
memRssЧислоМБРезидентный набор, общий размер памяти, используемой контроллером JavaScript в ОЗУ
outputCountЧисло/15sВыходные события включают такие действия, как сравнение значений, запись значения в базу данных состояний, события, связанные с подписками, или запись в журнал адаптера для получения информации о состояниях .connected или .alive, например. Таким же образом генерируются 8 событий, обычно отображаемых в списке экземпляров в поле выходного значения события.
время работыЧислосВремя работы ioBroker на этом хосте с момента последнего перезапуска

На следующей диаграмме символически показано, как куча, код и стек вносят вклад в общее использование памяти memRss процессом Node.js:

Экран

Если главный JS-контроллер сам предоставляет базу данных объектов и состояний для всей системы, этот показатель наглядно демонстрирует разницу в потреблении памяти между 300 и 3000 объектами ioBroker. Например, в моей системе Windows это значение колеблется от 75 до 128 МБ при 3500 объектах и 2700 состояниях. Это происходит благодаря встроенной сборке мусора в Node.js.

Однако, если я использую Redis в качестве базы данных состояний, потребление памяти для JS-контроллера снижается до 50 МБ.

(Теперь Redis требуется дополнительно 25 МБ = обратно к 75 МБ ;))

Если количество изменений состояния превышает вычислительную мощность зависимых потребителей событий (например, JavaScript с триггерами on:), в базах данных в оперативной памяти образуется очередь.

Это можно наблюдать по использованию памяти контроллером JavaScript. Как только нагрузка на систему уменьшается и потребителям событий предоставляется достаточно времени для обработки ожидающих изменений значений, значение memRss возвращается к своему исходному значению.

Экран

Как это часто бывает в этой области, одних лишь фиксированных значений недостаточно для получения точной информации о причинах ошибок.

Однако часто помогает наблюдение за безупречно функционирующей системой (=эталонными значениями), а затем сравнение той же системы с условиями возникновения ошибок. Кроме того, очень полезно записывать одну или несколько точек данных в истории, например, для выявления тенденций и выбросов.

Характеристики адаптеров

Каждый адаптер имеет свои собственные показатели производительности.

Они хранятся под идентификатором system.adapter.<Name_des_Adapters>.<Instanz> и немного отличаются от показателей хоста.

Ключевой показательТип данныхЕдиница измеренияОписание
активенЛогиканетУказывает, активен ли адаптер
подключеноЛогиканетУказывает, ответил ли адаптер в течение последних 30 секунд
inputCountЧисло/15sКоличество изменений значений состояния. Событие ввода может быть инициировано, например, созданием или установкой значения.
memHeapTotalЧислоМБРазмер памяти кучи, зарезервированной адаптером
memHeapUsedЧислоМБРазмер памяти кучи, используемой адаптером
memRssЧислоМБРезидентный набор, общий размер памяти, используемой адаптером в ОЗУ
inputCountЧисло/15sКоличество изменений значений состояния. Событие ввода может быть инициировано, например, созданием или установкой значения.
outputCountЧисло/15sВыходные события включают такие действия, как сравнение значений, запись значения в базу данных состояний, события, связанные с подписками, или запись в журнал адаптера для получения информации о состояниях .connected или .alive, например. Таким же образом генерируются 8 событий, обычно отображаемых в списке экземпляров в поле выходного значения события.
время работыЧислосВремя работы адаптера с момента запуска адаптера

Например, если после изменения скрипта количество событий inputCount в JavaScript-адаптере внезапно увеличивается со 100 до нескольких тысяч, возникает серьезное подозрение, что в скрипт встроен циклический триггер, то есть кольцевая ссылка.

Также полезно изучить memRss для обнаружения, например, утечек памяти, вызванных скриптами или в адаптерах. alive и connected можно использовать для наглядной визуализации состояния адаптера в vis или для подавления отображения некорректных данных, если адаптер не может предоставить новые значения.

Перспективы и вопросы

Вот картинка, позволяющая заглянуть в будущее (и в мою среду разработки):

Экран

В адаптерах отсутствует дисплей, отображающий загрузку ЦП, вызванную каждым отдельным адаптером (cpu).

В конце концов, хочется знать, какая система в данный момент является виновником, не устанавливая ресурсоемкие дополнительные адаптеры мониторинга. Поскольку Node.js является однопоточным, здесь отображается загрузка одного ядра ЦП. Она не может превышать 100%.

Даже использование многоядерных процессоров не поможет, если сетевой адаптер постоянно выдает высокие значения.

В этом случае проблему можно решить только с помощью более быстрого процессора (обычно это означает более высокую тактовую частоту), оптимизированного программного кода или распределения нагрузки между несколькими адаптерами (если это возможно).

Метрика cputime позволяет оценить общее время работы процессора адаптера с момента запуска.

Она предоставляет информацию о частоте или интенсивности (ключевое слово: вычислительно интенсивная), с которой программа использует процессор.

Это общее время почти всегда ниже общего времени работы адаптера (uptime), поскольку даже при интенсивном использовании адаптер редко непрерывно отправляет инструкции процессору.

Здесь вы можете наглядно увидеть, как взаимодействуют различные ключевые показатели производительности и как выглядит реакция JavaScript-адаптера на внезапный всплеск запросов во Flot:

Экран

Кстати, адаптер JavaScript уже был настолько перегружен, что больше не мог принимать все события немедленно.

Сформировалась очередь событий.

Чтобы узнать больше о нагрузке на хост, и в частности на главный адаптер - js-контроллер, я также добавил для него несколько счетчиков производительности. В следующем списке показано возможное будущее отображение счетчиков производительности хоста.

Как уже упоминалось, это подлежит проверке со стороны Bluefox и будет применяться только начиная с версии js-Controller 1.5.x:

Экран

В итоге, значение данных сводится к следующему:

Ключевой показательТип данныхЕдиница измеренияИсточник данныхОписание
aliveLogicnonejs-controllerУказывает, активен ли js-контроллер ioBroker на хосте. Автоматически переключается в значение false через 25 секунд после прекращения его работы.
cpuЧисло% использования ядраjs-controllerУказывает загрузку ядра, на котором работает js-controller. Она не может превышать 100%, поскольку Node.js - однопоточный движок.
время ЦПЧислосjs-контроллерВремя работы процессора (время ЦП) - это измеренное время в секундах, в течение которого js-контроллер фактически отправлял команды процессору с момента последнего запуска программы. Это общее время почти всегда меньше общего времени выполнения (времени работы) программы, поскольку даже при интенсивном использовании он редко непрерывно отправляет инструкции процессору.
diskFreeЧислоМиБСвободное место на логическом диске, где установлен ioBroker bi = двоичное кратное (1 МБ = 1 000 000 байт) < (1 МиБ = 1 048 576 байт = 1 × 1024 × 1024 байт)
Размер дискаЧислоМиБОбщий размер логического диска, на котором установлен ioBroker
diskWarningЧисло%Здесь можно ввести значение в процентах. Предупреждение будет отображаться в панели администратора, если свободное место на диске опустится ниже этого значения (например, 20). Это особенно полезно, если активен адаптер истории. Экран
freememЧислоМБОбщий объем доступной оперативной памяти хоста
inputCountЧисло/15sjs-controllerКоличество изменений значений состояния. Событие ввода может быть инициировано, например, созданием или установкой значения.
нагрузкаЧислоОбщая загрузка системы на все ядра ЦП, усредненная за одну секунду. Например, компьютер с 8 ядрами ЦП -> значение 7,9 = система почти перегружена, 0,1 = ничего не происходит; 4 ядра -> значение 3,9 = перегрузка - если проблема сохраняется, 0,1 = ничего не происходит
памятьЧисло%Использование памяти. Соотношение свободной памяти к общему объему системной памяти
memHeapTotalЧислоМБjs-controllerРазмер памяти кучи, зарезервированной js-controller
memHeapUsedЧислоМБjs-controllerРазмер памяти кучи, используемой js-контроллером
memRssЧислоМБjs-controllerРезидентный набор, общий размер памяти, используемой js-контроллером в ОЗУ
outputCountЧисло/15sjs-controllerВыходные события включают такие действия, как сравнение значений, запись значения в базу данных состояний, события, связанные с подписками, или логирование. Именно так здесь генерируются и события 10+.
memAvailableЧислоМБjs-controller(Только в системах *nix) Доступная свободная память для новых запросов памяти без необходимости запуска подкачки используемой памяти системой. Рассчитывается на основе MemFree, Active(file), Inactive(file), SReclaimable и нижних пороговых значений из /proc/zoneinfo.
См. https://git.kernel.org
memAvailableЧислоМБjs-controller(Только в системах *nix) Доступная свободная память для новых запросов памяти без необходимости запуска подкачки занятой памяти системой. Рассчитывается на основе MemFree, Active(file), Inactive(file), SReclaimable и нижних пороговых значений из /proc/zoneinfo.
См. https://git.kernel.org