Esp32 модуль http nodemcu - утечка памяти

Тема в разделе "ESP8266, ESP32", создана пользователем obuhanoe, 22 ноя 2022.

  1. obuhanoe

    obuhanoe Гик

  2. serg3295

    serg3295 Гуру

    Поправил в конфиге сервера строчку. Теперь возвращается 200. Но счастья, как вы понимаете, это не принесло.

    У меня Lua 5.3, а не 5.1. И прошивка esp-idf4. Поведение сборщика мусора в 5.3 существенно отличается от 5.1
    Да и ветка esp32 практически заброшена разработчиками. Все изменения вносятся в esp32-idf4, но на сайте генерации прошивок эта ветка пока не поддерживается. Поэтому компилируйте сами, склонировав репозиторий с Github.

    Для тестирования я сделал для вас прошивку с модулем Heap trace debug и Lua 5.3,
    загрузка по умолчанию из init.lua со SPIFFS.

    Перед использованием esp32-idf4 прочтите тему
    Можно читать с конца :)

    Если у вас в проекте есть битовые операции из библиотеки bit.func(), то закомментируйте их, так как Lua 5.3 использует привычные операторы &, |, << и так далее.

    Я не помню как шить esp32 в Windows, в Linux это можно сделать так:
    Код (C++):
    esptool.py esp32 -p /dev/ttyUSB0 -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 4MB 0x1000 bootloader/bootloader.bin 0x10000 nodemcu.bin 0x8000 partition_table/partition-table.bin
    Коротко про использование модуля heaptrace для вылова утечки памяти.
    1. прочитайте документацию на сайте.
    2. теперь посмотрим на наш код. Замените мои тестовые параметры на ваши реальные запросы к телеграму, таблицу заголовков можно вообще убрать.

    Код (C++):
    heaptrace.init(800)
    collectgarbage()
    heaptrace.start(heaptrace.TRACE_LEAKS)

    do
      local headers = {
      ["User-Agent"] = "test esp"
      }
      Connect = http.createConnection('http://pi3.lan', http.POST, { headers = headers })
      Connect:on("complete", function(status, connected)
      print("Request completed with status code =", status, connected)
      Connect:close()
      Connect = nil
      end)
      Connect:request()
    end

    collectgarbage()
    heaptrace.stop()
    heaptrace.dump()
     
    Посмотрим Lua реестр. Скорее всего будет 8
    Из Esplorer'a выполните по одной строчке команды до блока do ... end. Затем блок do ... end. И, наконец, по одной строчке оставшиеся команды.

    Интересна последняя строка в выводе dump'a, сколько взяли и сколько отдали.
    total allocations 1895 total frees 1875
    Перегрузитесь и повторите действия, только посылайте блоков do ... end штук 5-10
    Посмотрим dump и реестр. У меня памяти осталось отъеденой те же 20-25 байт и реестр не поменялся = 9
     

    Вложения:

    • firmware.zip
      Размер файла:
      684,6 КБ
      Просмотров:
      117
  3. obuhanoe

    obuhanoe Гик

    ESP-IDF v3.3?
    А эти присутствуют?
    Код (Text):
    modules: file,gpio,http,mqtt,net,node,time,tmr,uart,wifi
    Как и в ESP-IDF v3.3?
    Изучаю

    Для ветки esp-idf4
    ESPlorer нужно использовать? https://forum.amperka.ru/threads/Прошивка-для-esp32-nodemcu-lua-на-базе-последней-idf4-4.23119/#post-302922
     
    Последнее редактирование: 22 ноя 2022
  4. obuhanoe

    obuhanoe Гик

    Получилось залить, увидел Lua 5.3.5 и idf4.4.2, но что интересно, завел в сеть модуль и смотрю на память, а она прям скачет:
    Код (Text):
    =node.heap()
    =node.heap()
    197252
    >
    =node.heap()
    =node.heap()
    204504
     
    Это нормальное поведение?
     
  5. obuhanoe

    obuhanoe Гик

    Каким запросом, тот что работал на v3.3 на 4 версии ошибку дает
    Код (Text):
    =========== _G table: ===========
    Lua error:     stdin:1: attempt to call a nil value (field 'foreach')
    stack traceback:
        stdin:1: in main chunk
        [C]: in ?
        [C]: in
    Изыскания:
    1. код выполнялся построчно и 1 вызов do end

    Код (Text):
    2292 bytes 'leaked' in trace (52 allocations)
    total allocations 1522 total frees 1503
    2. код выполнялся построчно, do end - выполнялся 10 раз
    Код (Text):
    2380 bytes 'leaked' in trace (45 allocations)
    total allocations 8468 total frees 8458
    3. все тоже самое что и п.1/2 но для telegram - ошибка в прошивке

    Код (Text):
    [0;31mE (86717) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference[0m
    [0;31mE (86717) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (ESP_ERR_MBEDTLS_SSL_SETUP_FAILED)[0m
    [0;31mE (86727) esp-tls: create_ssl_handle failed[0m
    [0;31mE (86727) esp-tls: Failed to open new connection[0m
    [0;31mE (86737) TRANSPORT_BASE: Failed to open a new connection[0m
    [0;31mE (86747) HTTP_CLIENT: Connection failed, sock < 0[0m
    [0;33mW (86747) http: Error 28674 from esp_http_client_perform[0m
    Request completed with status code =    -28674    false
     
  6. serg3295

    serg3295 Гуру

    Нормальное.
    foreach только в lua 5.1. Перепишите на итератор.
    С памятью всё хорошо.
    Я tls в прошивку не включал. Сейчас посмотрю.
     
  7. obuhanoe

    obuhanoe Гик

    Как тогда фактически , без heaptrace понимать что память не течёт?
     
  8. serg3295

    serg3295 Гуру

    Собрал, но не проверял. Изменился только nodemcu.bin
     

    Вложения:

    • nodemcu.zip
      Размер файла:
      672,4 КБ
      Просмотров:
      92
  9. serg3295

    serg3295 Гуру

    Да я вот всё это время и удивлялся, как это вы определили, что память течёт. В теме у ИгоряК были описаны подходы к поиску утечек памяти. Вообще, увеличение реестра это более явный признак. Но если запустить подозрительный кусок кода в цикле и подождать достаточно долгое время, то будет видно как уменьшилась куча. Или система рестартанёт раньше.
     
  10. obuhanoe

    obuhanoe Гик

    Завтра отпишусь.
    При запросе node.heap() данные были без измений если не отправлялось в телеграмм и изменялось при успешной отправки.

    на версии 4.4.2 при любом запросе node.heap() она скачет как ненормальная.
     
  11. serg3295

    serg3295 Гуру

    Алгоритм работы сборщика мусора и, как следствие, такое поведение кучи был изменён в Lua 5.3. К версии idf он отношения не имеет.
    Вот прошивка с Lua 5.1 на базе idf4. Там куча ведёт себя нормально. Модуль heaptrace и tls там же присутствуют.
     

    Вложения:

    • nodemcu.zip
      Размер файла:
      660,5 КБ
      Просмотров:
      105
  12. obuhanoe

    obuhanoe Гик

    Завтра попробую проверить и отписаться.
    Уточнить только хотел, какие модули в данных подшивках?
    Спасибо
     
  13. serg3295

    serg3295 Гуру

    А вот так вот можно посмотреть
    Код (C++):
    do
    local function printtable(t) for k,v in pairs(t) do print(k.." : "..tostring(v)) end end
    printtable(getmetatable(_G))
    printtable(getmetatable(_G)['__index'])
    end
     
     
    obuhanoe нравится это.
  14. obuhanoe

    obuhanoe Гик

    Lua 5.3.5 idf 4.4.2
    перезалил файл и tls не нашел в модулях
    Код (Text):
    __index : table: 0x3ffb57fc
    encoder : table: 0x3f4034e8
    file : table: 0x3f403690
    gpio : table: 0x3f403910
    heaptrace : table: 0x3f403a6c
    http : table: 0x3f403fbc
    i2c : table: 0x3f4042e0
    ledc : table: 0x3f40496c
    mqtt : table: 0x3f404b00
    net : table: 0x3f405068
    node : table: 0x3f405820
    ow : table: 0x3f405ab4
    pipe : table: 0x3f405b54
    rtcmem : table: 0x3f405c58
    sjson : table: 0x3f405e08
    struct : table: 0x3f405fe4
    time : table: 0x3f4060e4
    tmr : table: 0x3f406210
    uart : table: 0x3f406570
    wifi : table: 0x3f4068a0
    ws2812 : table: 0x3f4070d8
    pulsecnt : table: 0x3f4079c8
    string : table: 0x3f40b1a0
    table : table: 0x3f40b308
    coroutine : table: 0x3f40a0fc
    debug : table: 0x3f40a450
    math : table: 0x3f40aad8
    utf8 : table: 0x3f40b410
    ROM : table: 0x3ffb57fc
    assert : function: 0x400f18f4
    collectgarbage : function: 0x400f15ac
    dofile : function: 0x400f18a4
    error : function: 0x400f155c
    getmetatable : function: 0x400f1870
    ipairs : function: 0x400f145c
    loadfile : function: 0x400f1828
    load : function: 0x400f17a0
    loadstring : function: 0x400f17a0
    next : function: 0x400f1488
    pairs : function: 0x400f1944
    pcall : function: 0x400f16a8
    print : function: 0x400f13a4
    rawequal : function: 0x400f1378
    rawlen : function: 0x400f1344
    rawget : function: 0x400f1318
    rawset : function: 0x400f12e8
    select : function: 0x400f1160
    setmetatable : function: 0x400f16ec
    tonumber : function: 0x400f11bc
    tostring : function: 0x400f1144
    type : function: 0x400f1114
    unpack : function: 0x400f10c8
    xpcall : function: 0x400f1658
    >
    Поэтому ошибка сохраняется при отправке Telegramm (https)
    Код (Text):
    [0;31mE (325039) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure. Check esp_tls API reference[0m
    [0;31mE (325039) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (ESP_ERR_MBEDTLS_SSL_SETUP_FAILED)[0m
    [0;31mE (325059) esp-tls: create_ssl_handle failed[0m
    [0;31mE (325059) esp-tls: Failed to open new connection[0m
    [0;31mE (325069) TRANSPORT_BASE: Failed to open a new connection[0m
    [0;31mE (325069) HTTP_CLIENT: Connection failed, sock < 0[0m
    [0;33mW (325079) http: Error 28674 from esp_http_client_perform[0m
    Request completed with status code =    -28674    false
     

    P.S. - на версии Lua 5.1.4 idf4.4.2 ошибка отправки сохраняется
     
    Последнее редактирование: 23 ноя 2022
  15. obuhanoe

    obuhanoe Гик

    Предварительные тесты показали, что на IDF4.4.2 модуль HTTP не дает утечек памяти.
    Проверка осуществлялась с сайтами не https, так как в прошивке от уважаемого serg3295 почему то не обнаруживается tls.
    Следующая проверка будет с данным модулем.
     
  16. obuhanoe

    obuhanoe Гик

    serg3295, подскажите еще по нескольким вопросам:
    1. На старой версии ESPlorer будет работать idf4.4.2 - я проверил у меня вроде работает.
    2. Есть инструкция как собирать прошивки ветки idf4.4 ? Хочу попробовать.
     
  17. serg3295

    serg3295 Гуру

    Модуль tls как таковой в esp32-idf4 отсутствует. По умолчанию в конфигурации включён CONFIG_MBEDTLS_TLS_ENABLED=y
    По идее, должно было работать. Я просто добавил несколько галочек в секции ESP-TLS, разрешив ряд опций на всякий случай. Но SSL/TLS support of ASIO не включал.
    Я раньше не использовал TLS на esp32-idf4, поэтому не могу предоставить точное решение. Возможно @ИгорьК компилировал прошивку esp32 для использования TLS и подскажет требуемые опции. Я сейчас только разбираюсь с этим вопросом.
    Мне сложно сказать какая версия Esplorera старая, а какая нет. На гитхабе в оригинальном репозитории версия поддерживает работу как с file, так и с io. Можно брать её и использовать. Я просто изменил один параметр в графическом интерфейсе для своего удобства.
    Я могу ответить на вопросы по сборке прошивки из исходников, но только под линукс. Я никогда не использовал ни WSL, ни докер, поэтому по этим темам ничего подсказать не смогу. Инструкцию мне написать несложно, но она представляется мне сейчас как переписывание документации с сайта и учебника по git. Но повторюсь, я отвечу на ваши вопросы по сборке, если где-то будут трудности и непонятки.
     
  18. obuhanoe

    obuhanoe Гик

    Принято
    Можно тогда ссылку на документацию попробую ознакомиться.
    На Raspberry с Debian можно будет собрать ?
     
  19. serg3295

    serg3295 Гуру

    Да, вот.
    Ответ будет неоднозначным. И да, и нет.
    Прочитайте вот это сообщение и подумайте, нужны ли вам такие проблемы. Я во всяком случае второй раз такую работу не хотел бы проводить. Да и не факт, что новые версии idf скомпилируются под Raspberry, я не проверял это.
    На каком-то этапе это было интересно, сейчас я бы запускал убунту в виртуальной машине и там компилировался. Хоть и тяжеловесное решение, но работает. Это если не хотите ставить линукс второй системой. Возможно кто-то использует WSL, и там всё проще делается. Я не знаю.
     
  20. serg3295

    serg3295 Гуру