2014-09-28 13 views
5

Moja aplikacja działa i działa na Heroku w 5 równoległych dynach. Stałe obciążenie wynosi 500-1500 req/min, czyli do 25 req/sec. Problem polega na tym, że pamięć RSS stale rośnie. Na razie ręcznie uruchamiam aplikację ponownie, gdy pamięć osiąga niebezpieczny poziom (maksymalna pamięć używana przez 1 hamowni heroku wynosi 512 MB). Pamięć wykres wygląda tak (górna oś szary jest w granicach 512):Serwer WWW node.js na Heroku - stała pamięć pamięci

enter image description here

Moments (na wykresie), gdy pamięć jest uwalniany jest, gdy jestem ponownym uruchomieniu aplikacji.

Dziwne jest to, że dzieje się tak tylko wtedy, gdy serwer ma ciągłe obciążenie. Kiedy na przykład serwer ładuje się na przykład przez 2 minuty, pamięć rośnie, po czym znowu spada. Wygląda więc na to, że z jakiegoś powodu garbage collector nie działa poprawnie (nie zbiera śmieci, dopóki nie zakończy się ładowanie serwera i aplikacja nie jest zajęta).

Czy mogę coś z tym zrobić? To nie jest przeciek pamięci myślę, ponieważ pamięć jest zwalniana, gdy nie ma obciążenia na serwerze ...

Co próbowałem dotąd była:

  1. połączeń GC ręcznie w odstępach 2 minutowych
  2. Otoczenie --max-old-space-size = 300 jednak nic się nie dzieje, gdy pamięć trafia 300mb - wciąż rośnie.

Być może są inne opcje, które mogą pomóc?

wersja Węzeł jest 0.10.20


użyłem węzłowi memwatch pakiet i udało mi się zebrać dyferencjału sterty z aplikacji:

Sądzę, że musi być jakiś wyciek. Największe zmiany pamięci z pierwszej 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 
     }, 
     ... 

Co jest Native przedmiot (nie jest przydzielona 20MB mem!)? Czy możesz udzielić mi porady, jak zbadać, co dokładnie powoduje wyciek?

Odpowiedz

1

Problem został rozwiązany przez zwyczajne nie używanie macierzystych wiązań PostgreS (https://github.com/brianc/node-postgres#native-bindings). Kiedy przestałem używać rodzimych powiązań (używam Sequelize.js, więc zmieniłem tylko flagę native na false) pamięć zaczęła normalnie zachowywać się ...

Wygląda na to, że może wystąpić przeciek w pg natywnych wiązaniach?