-
Notifications
You must be signed in to change notification settings - Fork 85
Description
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).