2014-09-28 17 views
5

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

enter image description here

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:

  1. Anruf GC manuell in 2 Minuten Abständen
  2. 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:

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?

Antwort

1

Das Problem wurde behoben, indem einfach keine nativen Postgres-Bindungen verwendet wurden (https://github.com/brianc/node-postgres#native-bindings). Als ich aufhörte, native Bindungen zu verwenden (ich benutze Sequelize.js, also änderte ich gerade native Markierung auf falsch) begann Speicher, sich normal zu verhalten ...

Es scheint, dass dort Leck in pg native Bindings sein könnte?

Verwandte Themen