Nano Hash - криптовалюты, майнинг, программирование

Супер крошечному веб-серверу NodeMCU с автообновлением не хватает памяти

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

Если я подключаюсь даже только к одному клиенту (моему ПК или смартфону), через некоторое время плата NodeMCU вылетает с этим сообщением:

ПАНИКА: незащищенная ошибка при вызове Lua API (SO-WebSrv-Test.lua:27: нехватка памяти)

Я использовал этот код от Марселя Стоера, который ответил на подобное «нехватка памяти» вопрос.

Я модифицировал код Марселя на Lua, но этот код со временем по-прежнему занимает всю память кучи.

Я немного сузил проблему: если частота обновления HTML-кода ниже 30 секунд, код съедает кучу памяти.

Итак, как мне изменить этот код, чтобы обеспечить постоянное использование памяти кучи?

С наилучшими пожеланиями.

Стефан

tmr.alarm(0, 1000, 1, function()
   if wifi.sta.getip() == nil then
      print("trying to connect to AccessPoint...")
   else
      own_ip, netmask, gateway=wifi.sta.getip()
      print("connected to AccessPoint:")
      print("IP Info: \nIP Address of this device: ",own_ip)
      print("Netmask: ",netmask)
      print("Gateway Addr: ",gateway,"\n")
      print("type IP-Address "..own_ip.." into your browser to display SHT-31-website")
      tmr.stop(0)
   end
end)

counter = 0
srv = net.createServer(net.TCP, 28800)
print("Server created... \n")

srv:listen(80, function(conn)
    conn:on("receive", function(sck, request)
        local message = {}
        counter = counter + 1
        message[#message + 1] = "<head> <meta http-equiv=refresh content=1; URL=http://"..own_ip.."> </head>"
        message[#message + 1] = "<h1> ESP8266 SHT-31 Web Server Ver 003</h1>"
        message[#message + 1] = "<h2>some more text blabla blub"..counter.."</h2>"
        local function send(sk)
            if #message > 0 then
                sk:send(table.remove(message, 1))
            else
                sk:close()
                message = nil
                print("Heap Available:" .. node.heap())
            end
        end
        sck:on("sent", send)
        send(sck)
    end)
end)
17.09.2017

  • У меня есть идея, в чем первопричина. Но сначала я предлагаю вам удалить историю в описании и просто описать, с каким кодом вы сейчас работаете (и который не работает AFAIU). 18.09.2017

Ответы:


1

Вы не сказали нам, какую версию прошивки вы используете. Я протестировал последнюю версию в браузере Chromium и не заметил проблем с памятью. Я прервал тест после 700+ циклов перезагрузки, потребление кучи было абсолютно стабильным.

Ранее в этом году нам пришлось уменьшить значение параметра TCP TIME_WAIT, потому что слишком много сокеты, находящиеся в состоянии ожидания, потребляли память. Объяснение:

ВРЕМЯ – ПОДОЖДИТЕ

(либо сервер, либо клиент) представляет собой ожидание достаточного времени, чтобы убедиться, что удаленный TCP получил подтверждение своего запроса на завершение соединения. [Согласно RFC 793 соединение может оставаться в состоянии TIME-WAIT не более четырех минут, известных как два MSL (максимальное время жизни сегмента).]

Источник: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Protocol_operation

Дополнительные сведения: https://tools.ietf.org/html/rfc7230#section-6.6

Однако:

  • вы, кажется, намереваетесь отправить HTML через HTTP обратно вашему клиенту, но не говорите об этом, это может не понравиться
  • если ваш клиент (браузер?) не закрывает старые сокеты вовремя, вы также можете указать ему сделать это явно

Добавление правильных заголовков HTTP исправляет оба. Следовательно, часть сообщения должна быть такой:

local message = { "HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n" }

counter = counter + 1

message[#message + 1] = "<html><head> <meta http-equiv=refresh content=1; URL=http://" .. own_ip .. "> </head>"
message[#message + 1] = "<body><h1> ESP8266 SHT-31 Web Server Ver 003</h1>"
message[#message + 1] = "<h2>some more text blabla blub" .. counter .. "</h2></body></html>"

Обратите внимание на Connection: close и Content-Type: text/html, а также на правильно структурированную HTML-разметку.

18.09.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..