Есть modbus 0-10V, через него происходят измерения параметров двух источников питания - напряжения (через резисторный делитель) и тока (через чипы ACS712). Получаю “сырые” напряжения на WB5. Загрузка процессора где-то 47% . Разумеется, чтобы получить то, что интересует - необходимо эти “сырые” переменные пересчитать простой арифметикой. Скрипт такой:
Скрипт честно отрабатывает что от него требуется и выдает нужные числа. Но при этом утилизация процессора WB5 уходит под 80%. Возникает вопрос - 4 простых арифметических действия в скрипте могут утилизировать процессор дополнительно на 33% (треть ресурса процессора!!!)? Что я делаю не так?
Это уже много. Покажите настройки, расскажите что делаете и вывод top покажите пожалуйста.
Нет, 4 простых арифметических действий не могут утилизировать процессор на 33%.
А вот запуск правил (неважно что именно они делают) например тысячу раз в секунду и последующее протаскивание данных через движок правил, очередь сообщений, БД и веб-интерфейс - вполне может.
Могу предположить, что у вас идёт очень большой поток данных с блока wp3084: опрос идёт на скорости шины, а т.к. блок отдаёт вам сырые аналоговые данные, то они каждый раз приходят разные и честно протаскиваются через всю систему. Можно снизить скорость опроса в настройках Serial Devices Configuration, настройка Poll Interval. Задать можно для всего порта, для одного девайса или для конкретного канала. Только обновите перед этим пожалуйста wb-mqtt-serial:
Знаю, что много. Но меньше 37% как-то не получалось вообще. Замечу, что цифры мной приведенные из мониторинга по SNMP (мне так удобнее), они несколько отличаются от top:
Но даже тут видно, что основной пожиратель - wb-rules. Предлагаю пока не углубляться в сторону (хотя это тоже стоит рассмотреть, но позднее), а акцентировать внимание именно на том скрипте, что я привел - тут все четко - включаю это правило и сразу резко возрастает утилизация процессора.
Все верно Вы говорите. Игрался с параметром “Delay before accessing the device (ms)” для модуля - при его увеличении загрузка действительно снижается (сейчас по умолчанию - 100). Снижать общий Poll interval не могу, как и увеличивать сильно задержку на WP3084 - начинаются проблемы у дискретных модулей с отработкой нажатия физических кнопок. Аналогично было тут: Не срабатывают кнопки Почему настройки одного устройства сказываются на других - пока понять не могу, разбираюсь. Думаю, это будет тема для другого разговора. Пока решаю проблемы скрипта. Какой-нибудь возможности средствами скрипта обсчитывать данные с сильно меньшей частотой есть? Я не сильно большой знаток в этом деле… но меня бы устроило, если бы это происходило раз в несколько секунд, а не по факту изменения “сырой” переменной.
“Delay before accessing the device (ms)” - это не то, это не нужно трогать.
Ну я так понимаю, что кнопки у вас не на WP3084 заведены? Поставьте poll_interval у WP3084 в 500ms, у остального оставьте в дефолтный 0 (т.е. на макс. скорости) и всё.
Кнопки опрашиваются часто, аналоговые значения редко.
Если вы именно Delay before accessing the device (ms) ставили, то так и должно быть. Смысл этого параметра в установке гарантированного периода тишины перед опросом девайса, это иногда требуется для глючных устройств.
Poll Interval - это другое, его использует планировщик. Если по одному устройству он большой, то только это устройство будет редко опрашиваться.
Это не проблема скрипта
Правила в wb-rules привязываются к событиям, поэтому они выполняются при каждом обновлении соответствующей переменной.
Если вы всё-таки хотите бороться с симптомами, а не с проблемой, то можно вместо правил, привязанных к событиям, в wb-rules написать просто периодическое правило для конвертации.
Т.е. что-то вроде
А что надо? Этот параметр тоже сказывается на загрузке. Примерно пропорционально его величине.
Конечно на другие модули. Это как поставить? Я вижу только poll interval 10ms на всю шину. Может быть надо в JSON у нужного модуля добавить что-нибудь такое: “poll_interval”: 500?
Понятно. Кстати, изделия от WP отрабатывают без ошибок на серийном порту даже если этот параметр вообще в 0 поставить (при 100 по умолчанию), что я и сделал для дискретных модулей (были проблемы с теми же кнопками без этого, так кнопки стали нормально работать), хотя у других моих modbus устройств (диммер, счетчик и термостат) при этом сразу валятся ошибки.
Понял, спасибо. Как крайний случай буду иметь ввиду. Конечно, хотелось бы победить проблему
Итак, остается понять как и где сделать настройку poll interval для конкретного устройства. В JSON?
Да, Вы оказались правы. Я как-то обычно делаю apt-get update && apt-get upgrage, но при этом wb-mqtt-serial не обновляется… как оказалось. Сделал apt-get update && apt-get install wb-mqtt-serial, обновилось, при этом обновились и другие пакеты. Действительно, появился poll_interval и действительно после установки 1000 циферки стали скакать реже… Но вот случилось нехорошее - после обновления перестали работать все модули расширения и скрипты. При этом в WEB интерфейсе скрипты видятся, а модули нет. Serial устройства - нормально. Перегрузил питанием - и все стало еще хуже. Пропал и WEB интерфейс - 403 Forbidden. Я в трауре… что делать теперь? SSH работает…
root@wirenboard:~# apt-get install wb-mqtt-serial
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages were automatically installed and are no longer required:
jq libc-dev-bin libc6-dev libevent-2.0-5 libgmp10 liblog4cpp5 linux-libc-dev manpages manpages-dev mqtt-tools python-chardet
python-crypto python-gevent python-greenlet python-gspread python-httplib2 python-oauth2client python-oauthlib python-requests
python-six python-support python-uritemplate tcc ucf
Use ‘apt-get autoremove’ to remove them.
The following extra packages will be installed:
liblog4cpp5 libwbmqtt
The following packages will be REMOVED:
wb-homa-adc wb-homa-gpio wb-homa-w1 wb-hwconf-manager wb-mqtt-db wb-mqtt-homeui wb-mqtt-lirc wb-test-suite
The following NEW packages will be installed:
liblog4cpp5
The following packages will be upgraded:
libwbmqtt wb-mqtt-serial
2 upgraded, 1 newly installed, 8 to remove and 0 not upgraded.
Need to get 231 kB of archives.
After this operation, 11.4 MB disk space will be freed.
Do you want to continue [Y/n]? Y
Get:1 http://releases.contactless.ru/ wheezy/main wb-mqtt-serial armel 1.18 [96.5 kB]
Get:2 http://releases.contactless.ru/ wheezy/main libwbmqtt armel 1.3.4 [17.8 kB]
Get:3 http://httpredir.debian.org/debian/ wheezy/main liblog4cpp5 armel 1.0-4 [117 kB]
Fetched 231 kB in 2s (106 kB/s)
(Reading database … 36817 files and directories currently installed.)
Removing wb-test-suite …
dpkg: warning: while removing wb-test-suite, directory ‘/usr/lib/wb-test-suite/wb5_func_test’ not empty so not removed
dpkg: warning: while removing wb-test-suite, directory ‘/usr/lib/wb-test-suite/common’ not empty so not removed
Removing wb-hwconf-manager …
Stopping initialize Device Tree overlays: wb-hwconf-manager
Unfortunately, overlays unloading is broken … (warning).
If you have removed or replaced modules, please reboot … (warning).
.
Removing wb-homa-adc …
Stopping MQTT Driver for ADC: wb-homa-adc.
Removing wb-homa-gpio …
Stopping MQTT Driver for GPIO-controlled switches: wb-homa-gpio.
Removing wb-homa-w1 …
Removing wb-mqtt-homeui …
Removing wb-mqtt-db …
Removing wb-mqtt-lirc …
Stopping WB LIRC driver: wb-mqtt-lirc.
Selecting previously unselected package liblog4cpp5.
(Reading database … 35668 files and directories currently installed.)
Unpacking liblog4cpp5 (from …/liblog4cpp5_1.0-4_armel.deb) …
Preparing to replace wb-mqtt-serial 1.16.1 (using …/wb-mqtt-serial_1.18_armel.deb) …
Unpacking replacement wb-mqtt-serial …
Preparing to replace libwbmqtt 1.3.2 (using …/libwbmqtt_1.3.4_armel.deb) …
Unpacking replacement libwbmqtt …
Setting up liblog4cpp5 (1.0-4) …
Setting up libwbmqtt (1.3.4) …
Setting up wb-mqtt-serial (1.18) …
Installing new version of config file /etc/wb-mqtt-serial.conf.sample …
root@wirenboard:~#
Объясните, что надо было сделать, чтобы установить обновление и при этом не произошло удаления других пакетов?
Вроде ожило. Спасибо! Изначальный вопрос тоже решился положительно, опрос устройства стал регулироваться через poll_interval и как следствие - снизилась загрузка процессора. Еще раз спасибо!
Есть еще вопросы не по изначальной теме, но как следствие данного обсуждения - как и где узнавать про актуальные обновления, вроде того, что сейчас установил? После обновления wb-mqtt-serial вернулись проблемы с Uniel (оно и понятно отчего - до этого работал serial от Дмитрия). Повторять процедуру правки serial и будет ли когда-нибудь решен этот вопрос хотя бы в варианте Дмитрия?