Forum: Mikrocontroller und Digitale Elektronik OOM bei EspAsyncWebServer auf ESP8266


von Gorn (Gast)


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
}

von J. S. (jojos)


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)

von Gorn (Gast)


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.

von Gorn (Gast)


Lesenswert?

Vielleicht ist die lib einfach zu hungrig für den 8266 und ich sollte 
auf ESP32 umsteigen.

von Gorn (Gast)


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.

von J. S. (jojos)


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.

von Gorn (Gast)


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

von Gorn (Gast)


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!

von Martin M. (ats3788)


Lesenswert?

Gorn schrieb:
> Vielleicht ist die lib einfach zu hungrig für den 8266 und ich sollte
> auf ESP32 umsteigen.
Genau wollte ich auch schreiben

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.