呃...我回到原點了。我無法弄清楚我的生活。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分鐘的舊堆轉儲是不夠的(因爲該對象不會駐留在內存中)。
只要確保基本基地已被覆蓋。你確定這個過程是用'ulimit'設置運行的嗎,它允許它使用所有的RAM?你知道什麼會進入應用程序,可以創建一個單一的對象這麼大?似乎應用程序使用的內存不足200 MB,然後單個事件突然耗盡額外的7.8 GB。 –
@PeterLyons ulimit在1024(默認)。順便說一句,不ulimit必須做套接字/文件,而不是內存?無論如何,很難說什麼可以創造一個如此之大的對象。這是這個問題的奧祕的一部分。我猜測,一個(或多個)用戶在他們的賬戶中有一些獨特的東西,我沒有預測或者沒有適當的上限,但我甚至無法猜測到哪裏/什麼是。正如我所說,這是一個非常大的應用程序。 –
ulimit可以控制許多資源,包括打開文件,內存,CPU,進程等。請參閱'ulimit -m'和'ulimit -d'特別是http://ss64.com/bash/ulimit.html。內存使用量超過7 GB的情況似乎更真實。我想我的下一個問題將是該應用服務的最大請求。客戶端是否流式傳輸大型上傳?是否有大量的併發客戶端發送大量請求?至少您可以將這些線索放入代碼庫並添加額外的日誌記錄工具。 –