OOM bei EspAsyncWebServer auf ESP8266

Gast #7257257
Lesenswert?

Hallo

Ich betreibe AsyncWebServer mit ArduinoJSON auf einem ESP8266. Bei 
meiner Meinung nach eher leichtgewichtigen GET Requests bekomme ich 
OutOfMemory-Fehler sobald die Requests zu schnell hintereinander kommen.

Ich starte mit etwa 15000 bytes freiem Speicher. Wenn zwischen den 
Requests genug Zeit vergeht, erholt sich der Speicher sofort wieder, so 
dass ich nicht von einem Leak ausgehe.
Da er scheinbar bei jedem Request ca. 3k verbraucht, geht er dann aber 
recht schnell in die Knie.

Das Reponse-json hat folgende Form:
1
{
2
    "datetime": "2022-11-18T20:16:59"
3
}

Wird wohl nicht den Ausschlag geben. Eher noch die HTTP-Header, die auf 
etwas über 400 byte kommen.

Die Requests könnte ich clientseitig drosseln, fänd das aber nicht so 
dolle. Gibt es irgendeine Möglichkeit stattdessen den Server zu 
drosseln?
1
AsyncWebServer server(80);
2

3
void Server_init()
4
{
5
  //...
6

7
  server.on(
8
      "/api/gtime",
9
      HTTP_GET,
10
      [](AsyncWebServerRequest *request)
11
      {
12
        debug("requesting time...");
13
        debug("Free memory: " + String(system_get_free_heap_size()) + " bytes");
14
        String datetime = Clock_getDateTimeString();
15
        StaticJsonDocument<50> jsonResponse;
16
        jsonResponse["datetime"] = datetime;
17
        jsonDataSuccess(request, 200, jsonResponse);
18
      });
19

20
  server.begin();
21
}
22

23
void jsonDataSuccess(AsyncWebServerRequest *request, int httpCode, StaticJsonDocument jsonResponse)
24
{
25
  AsyncResponseStream *response = request->beginResponseStream("application/json");
26
  response->setCode(httpCode);
27
  serializeJson(jsonResponse, *response);
28
  
29
  request->send(response);
30
}
#7257280
Lesenswert?

in jsonDataSuccess() wird das jsonResponse by value übergeben, da muss 
das ganze Objekt nochmal kopiert werden. Übergabe als Ref dürfte 
sparsamer sein.
1
void jsonDataSuccess(AsyncWebServerRequest *request, int httpCode, StaticJsonDocument &jsonResponse)
Gast #7257293
Lesenswert?

J. S. schrieb:
> in jsonDataSuccess() wird das jsonResponse by value übergeben, da muss
> das ganze Objekt nochmal kopiert werden. Übergabe als Ref dürfte
> sparsamer sein.
>
>
1
> void jsonDataSuccess(AsyncWebServerRequest *request, int httpCode, 
2
> StaticJsonDocument &jsonResponse)
3
>

Danke für den Hinweis. Leider macht es nicht viel aus. Bestätigt nur, 
dass das json-Dokument nicht das Gewicht hier ist.
Gast #7257580
Lesenswert?

Ich verwende jetzt einen Interceptor/Filter in meinem Client, der 
ausgehende Requests drosselt. Funktioniert ganz gut aber natürlich nur 
solange ich nur eine einzige Clientinstanz am Laufen habe. Bisschen 
armseelig aber naja.
#7257591
Lesenswert?

Gorn schrieb:
> und ich sollte
> auf ESP32 umsteigen.

dann wird das Problem eventuell etwas verzögert.
Der me-no-dev kümmert sich auch nicht mehr um sein Repo, da liegen viele 
unbearbeitete Issues. Bzw. werden die automatisch nach ein paar Wochen 
geschlossen.
Der Khoi Hoang hat das halbe github geforkt, aber reagiert recht schnell 
auf Issues, Viellecht da mal reinschreiben.
Gast #7257639
Lesenswert?

J. S. schrieb:
> Gorn schrieb:
>> und ich sollte
>> auf ESP32 umsteigen.
>
> dann wird das Problem eventuell etwas verzögert.
> Der me-no-dev kümmert sich auch nicht mehr um sein Repo, da liegen viele
> unbearbeitete Issues. Bzw. werden die automatisch nach ein paar Wochen
> geschlossen.

Ja, den Eindruck hatte ich auch. Sehr schade und wundert mich etwas bei 
einem doch "fundamentalen" Projekt für ESP.

> Der Khoi Hoang hat das halbe github geforkt, aber reagiert recht schnell
> auf Issues, Viellecht da mal reinschreiben.

Schau ich mir mal an. Danke
Gast #7257685
Lesenswert?

J. S. schrieb:

> Der Khoi Hoang hat das halbe github geforkt, aber reagiert recht schnell
> auf Issues, Viellecht da mal reinschreiben.

Das hat mich auf jeden Fall schon mal auf eine bessere Spur gebracht. 
Nicht Khoi, aber esphome. Die scheinen einen deutlich besser maintainten 
fork als me-no-dev zu betreiben.

Mit diesen dependencies habe ich einen deutlich geringeren memory 
footprint (ca 10 kbyte!):
1
ottowinter/ESPAsyncTCP-esphome@^1.2.3
2
ottowinter/ESPAsyncWebServer-esphome@^3.0.0

Besten Dank!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren