2012-11-29 27 views
48

呃...我回到原點了。我無法弄清楚我的生活。Node.js「致命錯誤:JS分配失敗 - 進程內存不足」 - 可能獲取堆棧跟蹤?

,我發現了以下錯誤:的事情我已經試圖讓這個問題的根源

FATAL ERROR: JS Allocation failed - process out of memory 

我可以列舉出幾十個(是的,幾十個),但實際上它是遠太多了。因此,這裏的關鍵點:

  • 我只能得到它我生產服務器上發生的,我的應用程序是大而複雜,因此它被證明是非常難以分離
  • 它發生,即使堆大小& RSS大小都< 200 MB,這應該不會有什麼問題考慮到機器(Amazon雲,CentOS的,m1.large)擁有8GB的內存

我的假設是,(因爲第二點的),泄漏可能不是原因;相反,它似乎可能是一個非常大的單個對象。以下線程支持這個理論:: In Node.js using JSON.stringify results in 'process out of memory' error

我真的需要的是一些方法來找出應用程序崩潰時的內存狀態,或者可能是導致致命錯誤的堆棧跟蹤。

基於我上面的假設,一個10分鐘的舊堆轉儲是不夠的(因爲該對象不會駐留在內存中)。

+0

只要確保基本基地已被覆蓋。你確定這個過程是用'ulimit'設置運行的嗎,它允許它使用所有的RAM?你知道什麼會進入應用程序,可以創建一個單一的對象這麼大?似乎應用程序使用的內存不足200 MB,然後單個事件突然耗盡額外的7.8 GB。 –

+0

@PeterLyons ulimit在1024(默認)。順便說一句,不ulimit必須做套接字/文件,而不是內存?無論如何,很難說什麼可以創造一個如此之大的對象。這是這個問題的奧祕的一部分。我猜測,一個(或多個)用戶在他們的賬戶中有一些獨特的東西,我沒有預測或者沒有適當的上限,但我甚至無法猜測到哪裏/什麼是。正如我所說,這是一個非常大的應用程序。 –

+1

ulimit可以控制許多資源,包括打開文件,內存,CPU,進程等。請參閱'ulimit -m'和'ulimit -d'特別是http://ss64.com/bash/ulimit.html。內存使用量超過7 GB的情況似乎更真實。我想我的下一個問題將是該應用服務的最大請求。客戶端是否流式傳輸大型上傳?是否有大量的併發客戶端發送大量請求?至少您可以將這些線索放入代碼庫並添加額外的日誌記錄工具。 –

回答

19

我不得不給巨大的道具Trevor Norris on this one for helping to modify node.js itself這樣它會自動生成一個堆轉儲發生這個錯誤。

但是,最終爲我解決了這個問題,但是,更爲平凡。我寫了一些簡單的代碼,將每個傳入的API請求的端點附加到日誌文件中。我等待收集~10個數據點(崩潰),並比較崩潰前60秒運行的端點。我發現在9/10的情況下,一個在碰撞發生之前就被擊中的終點。

從那裏,它只是一個深入挖掘代碼的問題。我減少了一切 - 從我的mongoDB查詢中返回更少的數據,僅將必要的數據從對象傳遞迴回調等。現在,我們已經比平均時間延長了6倍,沒有任何服務器發生單一崩潰,這導致我希望它現在解決了。

+11

我創建了一個npm包現在包含這個功能:https://npmjs.org/package/ofe –

+0

然後打開堆轉儲文件:Chrome開發工具 - >配置文件 - >加載 – sscarduzio

4

難道它是一個你正在序列化的對象的遞歸問題,這只是一個大的開始,並且在遞歸成爲一個問題之前耗盡內存?

我創建了safe-clone-deep NPM模塊出於這個原因...基本上你會想要做到以下幾點。

var clone = require('safe-clone-deep'); 
... 
    return JSON.stringify(clone(originalObject)); 

這將允許你幾乎克隆任何對象,然後序列化安全。另外,如果其中一個對象繼承自Error,它將序列化繼承的namemessagestack屬性,因爲這些屬性通常不會序列化。

+0

我在無限遞歸中遇到了這個問題,我一直將相同的對象附加到自身。 – ThisClark

49

只是因爲這是目前在谷歌上的答案,我想我會添加一個解決方案,我剛剛跑過的情況下:

我用快遞與EJS模板有這個問題 - 這個問題是我沒能關閉一個EJS塊,文件是js代碼 - 這樣的事情:

var url = '<%=getUrl("/some/url")' 
/* lots more javascript that ejs tries to parse in memory apparently */ 

這顯然是一個超級特定情況下,OP的解決方案應該使用的大部分時間。但是,OP的解決方案不適用於此(ejs堆棧跟蹤將不會被ofe浮出水面)。

+7

你剛剛救了我很多時間先生..謝謝你添加這個。是我的情況,只是不得不追查未封閉的EJS標籤。 –

+4

我有<%= user.username =>而不是<%= user.username%> ...我花了幾天才找到這個-_- – zshift

+2

相同的問題與SailsJS + EJS – Bdwey

10

沒有針對此問題沒有單一的解決方案。
我讀過不同的例子,其中大多數與JS有關,但在我的情況下,例如,只是一個由於代碼錯誤而無限延伸的玉石模板循環。

我想只是一個語法錯誤,節點管理不好。
檢查您的代碼或發佈它以查找問題。

1

在我的情況下,我用[]初始化了一個關聯數組(Object)。只要我將它初始化爲{},問題就消失了。

1

在我的情況下,我正在使用的一個文件在開發過程中種子數據庫導致泄漏。出於某種原因,節點不喜歡我在文件末尾的多行註釋。我看不出有什麼問題,但是一個消除的過程意味着我知道它是這個文件的這一部分。

6

在我來說,我是通過部署生產瓶蓋部署(Capistrano的),並在資產的Rails 4.2.1預編譯收到:

耙標準輸出:耙中止! ExecJS :: RuntimeError:致命錯誤:疏散分配失敗 - 加工出來的內存 (execjs):1

我早前已運行通過active_admin十幾數據導入,它似乎已經習慣了所有的RAM

解決方案:服務器重啓和部署第一次運行....

+1

你有沒有拿出一個長期解決這個問題?在每個部署中重新啓動服務器是不可持續的。謝謝 – Dennis

+1

服務器重啓也爲我解決了這個問題。 – Tintin81

+0

我正在使用webpack的角度4通用,我試圖prod構建,但是在amazon ec2服務器上出現內存不足錯誤,服務器重新啓動修復了我的問題。 –

1

分析一些案例,最常見的問題是無限循環。在一個複雜的應用程序中這將很難解決,這就是測試驅動開發方便的地方!

0

共享這裏發生什麼:

我失去了一些天,這個問題,直到我發現,在一些文件我是從一個靜態文件,建造文件中導入一個類。它使構建過程永不結束。例如:

import PropTypes from "../static/build/prop-types"; 

解決了真正的來源解決了所有問題。

0

在AWS實例上使用npm 5.0.3時,我們對npm全局文件夾本身有權限問題,這可能導致這種情況發生在我們身上。 我們跑:sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} 現在它工作正常

相關問題