Skip to content

Heap consumption until crash #252

@gluca

Description

@gluca

Platform

ESP32

IDE / Tooling

Arduino (IDE/CLI)

What happened?

Free memory heavy reduction after each client request until crash. The effect is huge using firefox as browser while is relatively small using chrome.
Each time you request any URL (in the example i made 2 hooks, one for "/" and one for all others (not found) pages) the free memory in heap reduces drastically, using firefox as client browser (roughly 5 to 6kbytes for each request). Using chrome the heap size reduction is less evident but still here (500 to 600 bytes with recovery), as you can see from Serial output i provided and that can be reproduced by my example code.

Stack Trace

No Stack trace until it crashes for out of memory. Output of main loop (showing memory degradation) follows:

Chrome (Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36)

Memory - Free:174424, Min:171912, Largest:110580
Memory - Free:174424, Min:171912, Largest:110580
Serving request for /-Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:173500, Min:167872, Largest:110580
Memory - Free:173500, Min:167872, Largest:110580
Serving request for /-Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:173272, Min:167312, Largest:110580
Memory - Free:173272, Min:167312, Largest:110580
Serving request for /-Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:172816, Min:166260, Largest:110580
Memory - Free:172816, Min:166260, Largest:110580
Serving request for /-Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172588, Min:166260, Largest:110580
Memory - Free:172588, Min:166260, Largest:110580
Serving request for /-Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:172360, Min:166260, Largest:110580
Memory - Free:172360, Min:166260, Largest:110580
Serving request for /-Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580

Firefox: (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0)

Memory - Free:172132, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580
Serving request for /-Memory - Free:166292, Min:163768, Largest:110580
Memory - Free:166292, Min:163768, Largest:110580
Memory - Free:166292, Min:163768, Largest:110580
Serving request for /-Memory - Free:160492, Min:158056, Largest:110580
Memory - Free:160492, Min:157964, Largest:110580
Memory - Free:160492, Min:157964, Largest:110580
Memory - Free:160720, Min:157964, Largest:110580
Serving request for /-Memory - Free:154880, Min:152356, Largest:110580
Memory - Free:154880, Min:152356, Largest:110580
Memory - Free:154880, Min:152356, Largest:110580
Serving request for /-Memory - Free:149040, Min:146516, Largest:110580
Memory - Free:149040, Min:146516, Largest:110580
Memory - Free:149040, Min:146516, Largest:110580

Minimal Reproductible Example (MRE)

#define WEB_SERVER_PORT 8080

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

static AsyncWebServer _server(WEB_SERVER_PORT);

const char *ssid          = "mySSD";
const char *password = "myPWD";

void wsConnectAP(const char * ssid, const char * pwd) {
  Serial.println("Connecting to wifi");
  WiFi.begin(ssid,pwd);
  int status = WiFi.status();
  while(status!= WL_CONNECTED) {
    delay(1000);
    status = WiFi.status();
  }
  Serial.println("Connected");
}

void wsStartServer() {
  wsSetHandlers();
  _server.begin();
}

void wsSetHandlers() {

  _server.on("/",HTTP_GET,     
    [](AsyncWebServerRequest * request){
        Serial.print("Serving request for /-");
        request->send(200,"application/json","{\"message\":\"Hello World\"}");
    });

    _server.onNotFound(
      [] (AsyncWebServerRequest *request) {
        Serial.print("Serving request for notFound-");
        request->send(404, "application/json", "{\"message\":\"Not Found\"}");
      });
}

void setup() {
  Serial.begin(9600);
  while(!Serial);
  wsConnectAP(ssid, password);
  wsStartServer();
}

void loop() {
    multi_heap_info_t info;
    heap_caps_get_info(&info, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); // internal RAM, memory capable to store data or to create new task
    Serial.printf("Memory - Free:%u, Min:%u, Largest:%u\n",   
    info.total_free_bytes,
    info.minimum_free_bytes,
    info.largest_free_block);
    delay(1000);
}

I confirm that:

  • I have read the documentation.
  • I have searched for similar discussions.
  • I have searched for similar issues.
  • I have looked at the examples.
  • I have upgraded to the lasted version of ESPAsyncWebServer (and AsyncTCP for ESP32).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions