2016-12-20 16 views
1

我有一個節點服務器正在運行。偶爾,主線程會掛起並佔用100%的CPU資源。線程完全掛起,不處理任何進一步的事件。不幸的是,由於這個原因,即使連接節點調試器也沒有用,因爲線程掛在某處(我運行了節點的調試器並連接到了停滯的進程,但[例如]'暫停'或'bt'不返回)。找出我的nodejs線程掛在哪裏?

我怎樣才能找出它掛在哪裏?是否有可能讓節點跟蹤當前的閉包堆棧,以便在錯誤再次出現時能夠回溯訪問它?

回答

0

一個低級別的檢查方法是使用像strace這樣的工具。你可以像這樣使用它:strace -p <node pid>。然而,這隻會顯示系統調用,所以如果你的程序處於某種無法進行系統調用(比如執行I/O)的無限循環中,你將看不到任何輸出。

您也可以嘗試使用llnode附加到實時進程以獲得節點進程的更節點友好的接口(與使用gdb相比)。

至於看到的處理/請求是在節點過程活躍,有一對夫婦的「私人」(下劃線前綴)可用的方法,如果你喜歡冒險:process._getActiveHandles()process._getActiveRequests()。您可以將這些函數與blocked這樣的模塊結合使用,以幫助檢測事件循環何時執行比您想要的任何閾值更慢。

+0

我欣賞一些非常有用的建議的答案。不幸的是,這些都不能解決問題的癥結所在(如何確定在主線程中掛起節點的關閉堆棧)。不過,我會探討你的建議,看看他們能否提供幫助。謝謝。 – logidelic