Wb-mqtt-db грузит процессор

добрый день
процесс main постоянно 50% cpu занимает, только на данном контроллере
увеличил лимит со 100 тыс до 500 тыс, но это временная мера

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

root@wirenboard-ASOI7OWQ:~# pid=$(systemctl show -p MainPID --value wb-mqtt-db)
echo "wb-mqtt-db PID=$pid"
top -H -p "$pid"
wb-mqtt-db PID=5637

top - 19:53:22 up 5 days, 2:33, 1 user, load average: 3.08, 2.74, 2.48
Threads: 7 total, 0 running, 7 sleeping, 0 stopped, 0 zombie
%Cpu(s): 22.5 us, 11.4 sy, 0.0 ni, 64.8 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st
MiB Mem : 2012.9 total, 130.1 free, 276.8 used, 1606.1 buff/cache
MiB Swap: 256.0 total, 255.5 free, 0.5 used. 1671.6 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5637 root 20 0 70644 13400 5868 S 45.2 0.7 0:54.35 main
5641 root 20 0 70644 13400 5868 S 4.0 0.7 0:04.59 mosquitto loop
5643 root 20 0 70644 13400 5868 S 1.7 0.7 0:02.39 backend: messag
5640 root 20 0 70644 13400 5868 S 1.0 0.7 0:01.70 driver: event l

5642 root 20 0 70644 13400 5868 S 0.0 0.7 0:00.00 backend: reques

root@wirenboard-ASOI7OWQ:~# DB=/mnt/data/var/lib/wirenboard/db/data.db
sqlite3 “$DB” "
with mx as (select max(timestamp) as mx from data)
select
count() as rows_last_minute,
round(count(
)/60.0,2) as rows_per_sec
from data, mx
where timestamp >= mx.mx-60000;
"
165|2.75
root@wirenboard-ASOI7OWQ:~# DB=/mnt/data/var/lib/wirenboard/db/data.db
sqlite3 “$DB” "
with mx as (select max(timestamp) as mx from data)
select c.device, count(*) as cnt
from data d
join channels c on c.int_id=d.channel, mx
where d.timestamp >= mx.mx-600000
group by c.device
order by cnt desc
limit 20;
"
OU4|590
ch_hp16mirm_2|170
OU3|79
OU2|74
[DTV1]|71
wb-gpio|54
metrics|46
wb-adc|34
Hisense_HCPC_H2M1C_32|33
pvu|25
IN3|24
US2|16
US1|16
system__networks__8a073272-55db-4552-ab44-269999106b52|11
SM1|11
RL4|11
IN27|11
DTV2|9
DM13|9
system__networks__d12c8d3c-1abe-4832-9b71-4ed6e3c20885|8
root@wirenboard-ASOI7OWQ:~# systemctl stop wb-mqtt-db
sleep 10
top -b -n1 | head -20
systemctl start wb-mqtt-db
top - 19:54:17 up 5 days, 2:34, 1 user, load average: 2.19, 2.55, 2.43
Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie
%Cpu(s): 21.5 us, 18.3 sy, 0.0 ni, 60.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 2012.9 total, 138.9 free, 269.0 used, 1605.1 buff/cache
MiB Swap: 256.0 total, 255.5 free, 0.5 used. 1679.4 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1941 root 20 0 172448 14912 6376 S 28.6 0.7 2973:13 wb-mqtt-serial
6366 root 20 0 9916 2612 2132 R 23.8 0.1 0:00.10 top
4603 1000 20 0 215088 103920 43804 S 19.0 5.0 1850:58 node-red
445 root 20 0 65240 13280 10536 S 14.3 0.6 192:36.47 NetworkManager
18928 root 20 0 27164 13272 8308 S 14.3 0.6 134:53.91 python3
340 message+ 20 0 6528 3384 2516 S 9.5 0.2 196:38.53 dbus-daemon
26955 mosquit+ 20 0 14952 8956 4744 S 4.8 0.4 105:02.88 mosquitto
1 root 20 0 32324 7732 5532 S 0.0 0.4 17:16.25 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.63 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_tasks_rude_
root@wirenboard-ASOI7OWQ:~#

никак не получается сбросить нагрузку
везде по 3-5% занимает, а тут 48-50%

Добрый день.

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

timeout --foreground -s 15 60s  mosquitto_sub -v -t "/devices/#" |wc -l

с проблемного контроллера

root@wirenboard-ASOI7OWQ:~# timeout --foreground -s 15 60s  mosquitto_sub -v -t "/devices/#" |wc -l

11948

с другого контроллера

root@wirenboard-AAA4DILM:~# timeout --foreground -s 15 60s  mosquitto_sub -v -t "/devices/#" |wc -l

6152

настройки везде одинаковые
есть контроллеры даже старее чем проблемный, но и там нагрузка 3-5%, а не 50%

Если исключить из истории половину топиков - то нагрузка меняется?

подскажите, пожалуйста, ссылку на инструкцию или команду, как это сделать

Вот подробное описание конфигурирования: GitHub - wirenboard/wb-mqtt-db: Wiren Board database logger

по ходу какие-то системные топики грузят базу

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND    
1917 root      20   0  172448  15552   6796 S  39.0   0.8   9:50.45 wb-mqtt-serial                                                                           
4525 1000      20   0  212176 100856  43848 S  26.6   4.9   7:00.10 node-red
18510 root      20   0   69196  10840   5348 S  18.0   0.5   0:04.05 main
2081 mosquit+  20   0   14424  10028   4920 S  10.8   0.5   2:34.44 mosquitto
7786 root      20   0    7452   4024   3556 S   7.5   0.2   1:42.72 openvpn
18559 root      20   0   29080   8092   6668 S   5.9   0.4   0:00.18 curl      

перечислил только топики устройств и нагрузка стала намного слабее. вопрос в том как понять какие системные топики грузят базу?

root@wirenboard-ASOI7OWQ:~# cat /etc/wb-mqtt-db.conf
{
    "database": "/var/lib/wirenboard/db/data.db",
    "debug": false,
    "groups": [
        {
            "channels": [
                "ch_hp16mirm_2/+",
                "CO2.1/+",
                "CO2.2/+",
                "CO2.3/+",
                "DM1/+",
                "DM2/+",
                "DM3/+",
                "DM4/+",
                "DM5/+",
                "DM6/+",
                "DM7/+",
                "DM8/+",
                "DM9/+",
                "DM10/+",
                "DM11/+",
                "DM12/+",
                "DM13/+",
                "DM14/+",
                "DTV2/+",
                "DTV3/+",
                "DTV4/+",
                "DTV5/+",
                "hisense_HCPC_H2M1C_32/+",
                "IN3/+",
                "IN5/+",
                "IN6/+",
                "IN7/+",
                "IN8/+",
                "IN9/+",
                "IN10/+",
                "IN11/+",
                "IN12/+",
                "IN13/+",
                "IN15/+",
                "IN16/+",
                "IN17/+",
                "IN18/+",
                "IN19/+",
                "IN20/+",
                "IN21/+",
                "IN22/+",
                "IN23/+",
                "IN24/+",
                "IN25/+",
                "IN26/+",
                "IN27/+",
                "IN28/+",
                "IN29/+",
                "IN40/+",
                "OU2/+",
                "OU3/+",
                "OU4/+",
                "pvu/+",
                "RL1/+",
                "RL2/+",
                "RL3/+",
                "RL4/+",
                "RL5/+",
                "RL6/+",
                "RL8/+",
                "RL9/+",
                "RL11/+",
                "RL12/+",
                "RL13/+",
                "SM1/+",
                "US1/+",
                "US2/+",
                "wb-w1/+",
                "[DTV1]/+",
                "wb-adc/+"
            ],
            "max_burst": 30,
            "min_interval": 120,
            "min_unchanged_interval": 1200,
            "name": "all",
            "values": 10000,
            "values_total": 100000
        }
    ]
}root@wirenboard-ASOI7OWQ:~# 

Я не понимаю термина “грузят” к сожалению…
Какие “системные” имеете в виду?

То есть: как именно конфигурируете порядок и количество записей для (какого-то) топика, что работает не так как сконфигурировано?

когда в топиках в настройках выбрано +/+ то нагрузка на cpu 45-50% согласно top
сейчас отфильтровал только по подключенным устройствам и нагрузка 10-15% всего. то бишь отключены только топики которые системные - сеть, версия системы и прочие остальные

не понимаю в чем именно дело, но если сделать +/+ то нагрузка сильно возрастает, и стала она возрастать после обновления системы до актуальной версии недели 2 назад

Сколько при этом публикаций от топиков? В минуту, например?

Иными словами - если вы записываете в базу несколько тысяч записей - то это вполне ожидаемо.

так я не записываю
система записывает
ранее было 165 записей в минуту
на данный момент “одобрены” только подключенные к wb устройства и нагрузка низкая

Система записывает ровно так как сконфигурировано. Я например для контролов в которых излишне (на мой взгляд) частые изменения считаю “max_burst” и определяю его.
Не для всех каналов а расчет - для каждого.
Просто пример:

        {
            "channels": [
                "wb-map6s_27/+",
                "SocketRelay_2floor/+",
                "DaniilComp/energy",
                "Refrigerator/energy",
                "main_powermeter/+"
            ],
            "max_burst": 4,
            "min_interval": 60,
...
        },

А чем они генерировались? То есть - какой источник? И сколько ожидается от этого источника изменений?

Я перечитал снова тему, попробовал воспроизвести у себя. Да, при большом количестве записей (разрешенных) сервис потребляет ресурсы. Это в общем ожидаемо.
Однако при двух сотнях записей в минуту - гораздо меньше. Как снимали статистику?

снимал статистику с помощью команд, которые предложил гпт, в первом сообщении тут
на данный момент в базу пишутся только каналы всех подключенных в wb-mqtt-serial устройств и нагрузка до 10-12%. стоит убрать ограничение (сделать +/+) - сразу до 45-50% возрастает

Понятно, да и воспроизводится, вполне.
Например

//TestSin_value_forTCP.js

// Цель - получить три топика со значениями (ну, пусть от-32767 до 32767)
//Значения должны меняться синусоидой.
//То есть берем значение (радиан)2, делим его на 2^16 То есть (радианы на один полный круг делённые на количество частей)
var stepSizeRadians = 2 * Math.PI / 65536;
var step60Radians = 2 * Math.PI / 6;
var scale16bit = 32767

var curAngle = 0;

function makeNewVirtualControl(vdName, nameControl, typeControl){
  if (getDevice(vdName) === undefined) {
    defineVirtualDevice(vdName, {
      title: vdName,
      cells: {},
    })
  }
     //Тут проверим есть ли уже контрол и если нет - создадим.
    if (!getDevice(vdName).isControlExists(nameControl)) {
      log.debug("Контрола "+nameControl+" нет, создаем.")
      getDevice(vdName).addControl(nameControl, typeControl);
    }
}


makeNewVirtualControl("ForSinValues", "value0", {type:"value", value: 0, readonly: false})
makeNewVirtualControl("ForSinValues", "value1", {type:"value", value: 0, readonly: false})
makeNewVirtualControl("ForSinValues", "value2", {type:"value", value: 0, readonly: false})
makeNewVirtualControl("ForSinValues", "valueZero", {type:"value", value: 0, readonly: false})


//Таймер (бесконечный)
setInterval(function(){
  value=scale16bit*Math.sin(curAngle);
  dev["ForSinValues/value0"] = value;
  value=scale16bit*Math.sin(curAngle+step60Radians);
  dev["ForSinValues/value1"] = value;
  value=scale16bit*Math.sin(curAngle+step60Radians+step60Radians);
  dev["ForSinValues/value2"] = value;
  //log.info("curAngle=", curAngle, "value1=", value1);
  curAngle+=stepSizeRadians;
}, 50)

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

Тут главный вопрос в том почему это стало происходить. Я не менял никакие настройки данного модуля, установил за несколько дней до создания темы актуальные обновления и началась эта проблема. На данный момент отключены все каналы кроме подключенных к wb-mqtt-serial и этой проблемы нет, но если включить каналы контроллера то сразу нагрузка возрастает, хотя каналов контроллера в десятки раз меньше чем каналов устройств

Какие “каналы контроллера”?
Сколько по ним публикаций в минуту?

все каналы контроллера, а не подключенных к контроллеру устройств. как только включаю всё - нагрузка 50%

оставляю все каналы кроме каналов контроллера - всё отлично, как везде.

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