Добрый день.
Довольно интересно, у меня есть пара контроллеров с z2m. Подобного не наблюдаю. Покажите пожалуйста - как именно “растет память”.
Ну и выгрузите все топики из брокера в файл и приложите его. С диагностическим архивом.
мы не замечаем, как “растёт память”. мы замечаем, что перестал работать z2m, смотрим логи, а там в mosquitto - out of memory. по ссылке - описание ситуации.
я не умею выгружать топики из брокера в файл и к тому же не помню, нет ли там паролей, айпишников и другой информации. я бы в последний момент что-либо выгружал. может быть, того что есть достаточно?
Точно такая же проблема после обновления wb-mqtt-zigbee с релизом 2606. Z2m приходится вручную запускать раз в несколько дней. До этого все работало без замечаний.
Паролей - нет по умолчанию. Адреса - вполне есть, да.
Не думаю. Если у вас, например, есть какое-то ПО которое создает и не убирает топики - то да, ожидаемо память в итоге переполнится. И да, вполне воспроизводится если топики создавать целенаправленно.
эта команда mosquitto_sub -v -t '/devices/+/controls/#' не останавливается, она, кажется, продолжает печатать все, что приходит в реальном времени. наверно, нужно как-то, чтобы она напечатала только какой-то снапшот и успокоилась.
у меня есть экспролер, например, может, там посмотреть?
вообще, видимо, нам надо поймать момент, когда память переполняется, и именно тогда смотреть-то, а mqtt сразу перезапускается
In Mosquitto 2.0.20, the “out of memory” error is often a misleading log message rather than an actual system memory exhaustion. It typically triggers when a client publishes a QoS 1 message and disconnects before the broker sends a PUBACK. [1, 2, 3]
Here is how to isolate and fix the issue:
Upgrade Your Mosquitto Version
Because this specific out-of-memory error report on client disconnection is a known false-positive/bug, the maintainers addressed and resolved it. Update your Mosquitto broker to version 2.0.22 or later via your system’s package manager or check the official Mosquitto Downloads page.
ой а его-то откуда взять. я сам не мониторю его, может, где-то само складывается? и потом, явно переполняется не память устройства, а память, выделенная службе
log.info("ramLog: запуск");
function makeNewVirtualControl(vdName, nameControl, typeControl) {
// Пробуем создать; если оно уже есть — defineVirtualDevice
// "Device with given ID already exists", ловим и пропускаем создание.
try {
log.info("Создаём виртуальное устройство {}", vdName);
defineVirtualDevice(vdName, {
title: vdName,
cells: {}
});
} catch (e) {
log.info("Устройство {} уже существует, пропускаем создание ({})", vdName, e.message);
}
var vdev = getDevice(vdName);
if (!vdev) {
log.error("Не удалось получить устройство {}", vdName);
return;
}
// Проверим, есть ли контрол; если нет, создадим его.
if (!vdev.isControlExists(nameControl)) {
log.debug("Контрола {} нет, создаем.", nameControl);
vdev.addControl(nameControl, typeControl);
}
}
var RAM_VDEV_NAME = "ramLog";
var RAM_CONTROL_NAME = "occupedMosquittoRAM";
makeNewVirtualControl(RAM_VDEV_NAME, RAM_CONTROL_NAME, {
type: "value",
value: 0,
units: "kB",
readonly: true,
forceDefault: false
});
function updateWbMosquittoRamUsage() {
// Суммируем RSS (kB) для всех процессов.
runShellCommand("ps -C mosquitto -o rss= | awk '{sum+=$1} END {print (sum ? sum : 0)}'", {
captureOutput: true,
exitCallback: function (exitCode, capturedOutput) {
if (exitCode !== 0) {
log.warning("ramLog: команда завершилась с кодом {}", exitCode);
return;
}
var value = parseInt(String(capturedOutput).trim(), 10);
if (isNaN(value)) {
log.warning("ramLog: не удалось разобрать значение RAM из '{}'", capturedOutput);
return;
}
dev[RAM_VDEV_NAME + "/" + RAM_CONTROL_NAME] = value;
log.debug("ramLog: RSS = {} kB", value);
}
});
}
// Первичное обновление при старте скрипта.
updateWbMosquittoRamUsage();
// Обновление каждую минуту.
setInterval(function () {
updateWbMosquittoRamUsage();
}, 60 * 1000);
Тут в том-то и дело: не упал. Выводит что память исчерпана.
Именно поэтому - нужна полная выгрузка топиков. Сделайте пожалуйста.
То есть максимальную ценность - будет иметь выгрузка сделанная как можно ближе к переполнению памяти.
Ну и диагностический архив.
да я их в свои скрипты прям вписал, скрипты по ssh подключаются туда сюда у меня по серверам. боюсь, короче upd нет, не вписал. они у меня в папке /root/.ssh. вообще папка /root/ попадает в диагностический архив?