Meine App läuft auf heroku auf 5 parallelen Dynos. Es gibt eine konstante Last von 500-1500 Req/Min., Also bis zu 25 Req/Sek. Das Problem ist, dass der RSS-Speicher ständig wächst. Momentan starte ich die App manuell neu, wenn der Speicher einen gefährlichen Level erreicht (der maximale Speicher, der von 1 Heroku Dyno benutzt wird, ist 512 MB). Speicher Diagramm sieht wie folgt aus (obere Grauachse 512 MB Grenze):node.js Webserver auf Heroku - konstantes Speicherwachstum
Moments (auf Grafik), wenn der Speicher freigegeben wird, wenn ich app bin neu zu starten.
Das Merkwürdige ist, dass es nur passiert, wenn der Server ständig belastet wird. Wenn zum Beispiel 2 Minuten auf den Server geladen werden, steigt der Speicher und geht danach wieder runter. So scheint es, dass Garbage Collector aus irgendeinem Grund nicht richtig funktioniert (es wird kein Müll gesammelt, bis der Server geladen ist und die App nicht ausgelastet ist).
Kann ich irgendetwas dagegen tun? Es ist nicht Speicherverlust Ich denke, da Speicher freigegeben wird, wenn keine Last auf einem Server ist ...
Was habe ich versucht, so weit war:
- Anruf GC manuell in 2 Minuten Abständen
- Rahmen --max-old-space-size = 300 aber nichts passiert, wenn Speicher 300mb erreicht - es steigt immer noch.
Vielleicht gibt es andere Optionen, die helfen könnten?
Node-Version ist 0.10.20
I Knoten memwatch
Paket verwendet und ich verwalteten Heap diffs von App sammeln:
- http://jsonfiddle.net/auf8d (heap diff zwischen 11 Minuten, 37 MB)
- http://jsonfiddle.net/4nvcd (Heap-Diff zwischen 15 Minuten, +50 MB)
Also muss es irgendwie Leck geben, denke ich. Die größten Speicher Änderungen von ersten diff:
...
{
"what": "Array",
"size_bytes": 9320312,
"size": "8.89 mb",
"+": 79086,
"-": 10215
},
...
{
"what": "Closure",
"size_bytes": 2638224,
"size": "2.52 mb",
"+": 36826,
"-": 184
},
{
"what": "Native",
"size_bytes": 21471232,
"size": "20.48 mb",
"+": 546,
"-": 0
},
{
"what": "String",
"size_bytes": 2068264,
"size": "1.97 mb",
"+": 36968,
"-": 1223
},
...
Was ist Native
Objekt (es 20mb mem zugeordnet!)? Könnten Sie mir Ratschläge geben, wie Sie untersuchen, was genau das Leck verursacht?