Mosquitto - Out of memory, отчего падает и не поднимается z2m

Падает и перезапускается mosquitto с ошибкой Out of memory, при этом падает и не перезапускается z2m. Помогите!

Ситуация точь-в-точь как в “решенном”, и поэтому игнорируемом топике

Если можно, такой вопрос:

Здесь писали, что можно поднять лимиты на память для mosquitto

но сейчас такого файла в настройках нет, вместо него 30limits.conf.dpkg-new и 30limits.conf.dpkg-remove

Помогите, как избежать ручного перезапуска z2m каждые три дня, которые требуются после вашего последнего обновления, спасибо

upd: здесь человек приложил диагностический архив

Добрый день.
Довольно интересно, у меня есть пара контроллеров с z2m. Подобного не наблюдаю. Покажите пожалуйста - как именно “растет память”.
Ну и выгрузите все топики из брокера в файл и приложите его. С диагностическим архивом.

вот здесь другой пользователь описал ситуацию и приложил диагностический архив. он подходит?

мы не замечаем, как “растёт память”. мы замечаем, что перестал работать z2m, смотрим логи, а там в mosquitto - out of memory. по ссылке - описание ситуации.

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

Точно такая же проблема после обновления wb-mqtt-zigbee с релизом 2606. Z2m приходится вручную запускать раз в несколько дней. До этого все работало без замечаний.

Вот поэтому и нужен список топиков, выгрузка.

Для примера: MQTT в контроллерах Wiren Board — Wiren Board
Только указывайте '#'

Паролей - нет по умолчанию. Адреса - вполне есть, да.

Не думаю. Если у вас, например, есть какое-то ПО которое создает и не убирает топики - то да, ожидаемо память в итоге переполнится. И да, вполне воспроизводится если топики создавать целенаправленно.

эта команда 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:

  1. 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.

Даже есть ссылка на наш форум!

вощем у нас старый москито

timeout 15 mosquitto_sub -v -t '#'

Не обязательно.
Но вот график истории памяти - желательно

# timeout 15 mosquitto_sub -v -t '#' -T 'frigate/#' > mqtt.15.dump.no.frigate

mqtt.15.dump.no.frigate (1.6 MB)

(извините картинки из фригата неохота слать)

@BrainRoot но раньше все работало, зачем мои топики. недели две или три, как обновил пакеты, стало падать

ой а его-то откуда взять. я сам не мониторю его, может, где-то само складывается? и потом, явно переполняется не память устройства, а память, выделенная службе

Если для службы - например так, типовой путь:

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);

Помониторил процесс:

Не меняется.
При этом zigbee устройства работают, что-то публикуется постоянно.

попробую

кстати, сейчас зашел - и память красная, больше всего ест, кстати, wb-mqtt-serial

и в веб-интерфейсе ничего не видно, и mqtt упал вообще полностью и не может подняться

Тут в том-то и дело: не упал. Выводит что память исчерпана.
Именно поэтому - нужна полная выгрузка топиков. Сделайте пожалуйста.
То есть максимальную ценность - будет иметь выгрузка сделанная как можно ближе к переполнению памяти.
Ну и диагностический архив.

Добрый день!

В диагностическом архиве нет паролей - можете отправить в личку или на почту support@wirenboard.com

Подскажите, пожалуйста, какая версия релиза на контроллере.

release wb-2606 (as stable)

да я их в свои скрипты прям вписал, скрипты по ssh подключаются туда сюда у меня по серверам. боюсь, короче
upd нет, не вписал. они у меня в папке /root/.ssh. вообще папка /root/ попадает в диагностический архив?

его наверно надо тоже когда повиснет выгружать?

сейчас пока хорошо работает

приложен диагностический архив, доступен только сотрудникам поддержки
(426.7 KB)