Ich habe einen kleinen Server, der viele Dateien verarbeiten muss. Die Dateien werden über eine PUT-Anfrage an den Server gesendet. Ich verwende das net/http-Paket für den Server. Ich weiß, dass für jede Anfrage eine Go-Routine geöffnet wird. Das Problem besteht jedoch darin, dass nach Beendigung einer Anfrage der verwendete Speicher des Handlers nicht freigegeben wird.Wie kann ich meinen Server (in Golang geschrieben) nicht aus dem Speicher gehen lassen?
Der Server (sollte) auf einem Raspery Pi 3 mit 1 GB Speicher laufen. Das Problem ist, dass nicht genügend Arbeitsspeicher zur Verfügung steht, wenn ich viele Dateien sende. An dieser Stelle kann ich nicht warten, bis der Garbage Collector den Speicher freigibt.
Diese beiden Themen sind über das Problem:
Why is the memory block not cleaned by the garbage collector?
Go 1.3 Garbage collector not releasing server memory back to system
Aber es gibt keine Lösung für mein Problem.
Jetzt ist die Frage: Gibt es eine Möglichkeit, einen HTTP-Handler als totaly bereit zu machen, dass der Garbage Collector den Speicher für die aufrufende Routine freigibt? Ich habe versucht, am Ende des Handlers eine return
hinzuzufügen, aber das funktioniert nicht. Ich habe immer noch keine Erinnerung mehr.
Überprüfen Sie auch dies: [Golang - Speicher kann nicht einmal durch bytes.Buffer] (http://stackoverflow.com/questions/37382600/golang-cannot-free-memory-once-ccupied-by-bytes- Puffer), gibt es ['debug.FreeOSMemory()'] (https://golang.org/pkg/runtime/debug/#FreeOSMemory). Sie können auch gleichzeitige Anfragen/Datei-Uploads/Downloads beschränken. – icza
Um klar zu sein, bist du sicher, dass die Goroutine zurückgekehrt ist und der Handler das Problem ist?Ich denke, Sie können eine Goroutine verlieren, ähnlich wie wenn Sie ein Objekt in nicht-GC'd-Sprachen nicht freigeben. – evanmcdonnal
Erhalten Sie einen Stack-Trace, während Sie unseren Speicher ausführen und sehen Sie, welche Gruoutines noch laufen. Es kann auch nicht schaden, die aktuelle Version von Go zu testen, wenn Sie Probleme mit ARM haben. – JimB