2014-11-06 48 views
1

我在節點中做了一些繁重的統計,所以我將分支分派給子進程,其中子進程將處理所有mongo查詢並通過數據循環等最後將結果發回給母親進程。它使用相對較小的數據集很好。Node.js分叉的孩子返回消息限制和解決方法

但是當數據變得足夠大時,通信似乎被阻塞或發送回來時出現問題。返回的數據是相當大的HighChart對象,其中包含超過200k的數據點,我可以在子進程調用process.send(data)之前記錄消息,並且cpu活動在子進程中幾乎降到0,這母親使用cpu的使用率很高,只是呆在那裏而不是下降。在這一點上,這個過程似乎只是掛起(沒有掛起,因爲它仍然在響應其他請求),但process.on('message',function(){});即使我讓它坐在那裏跑步也不會觸發。

IPC可以爲節點處理的大小是否有限制?無論如何圍繞這個或者一些破解它?有些人建議使用TCP或其他IP協議而不是IPC,但它有點讓管理孩子生活的問題複雜化。

還有什麼免費的工具,使調試節點更容易旁邊只是使用console.log?

非常感謝您的幫助提前

問候。 G

+0

這很糟糕。除了以前的建議,我無法提供任何幫助,但會對查看您是否找到問題/解決方案感興趣。 – eshortie 2014-11-06 22:26:27

+0

用不同的方法傳遞數據,需要的代碼更改最少的方法是使用filestream將stringyfy json寫入文件,並且一旦完成將文件路徑傳遞迴主進程並使其擁有它閱讀它然後清理....它很慢,但至少現在正在移動:/ – 2014-11-07 06:09:12

+0

是的,這是一個可行的解決方案,但是IPC是一個問題。 – eshortie 2014-11-07 14:21:38

回答

2

編輯:似乎我錯了。請在這裏看到Sam的消息:https://stackoverflow.com/a/40178217/1224279

我的原始答案如下。


當的node.js發送過來IPC的對象,相信它被序列化爲JSON,發送,然後反序列化。

有郵件大小限制。根據此page,在Linux上默認情況下,單個消息的限制爲8KB,消息隊列的限制爲16KB。你可以通過編輯相應的/proc/sys/kernel文件來改變它。

我不知道如何轉化爲節點(也許它需要一些緩衝你的關心),但我想有一個在序列化/發送/解串200K的數據點一些嚴重的開銷。

你可能有更好的運氣發送他們在較小的位。我發現一個能勝任的系統每秒鐘可以解析大約20k-80k的小型Node.js IPC消息。

如果您發送的數據量很大,您必須完成您完成的任務:將數據保存到別處併發送其位置,或使用更適合數據採集的不同傳輸方式(例如如pipes)。

編輯:參見:How to transfer/stream big data from/to child processes in node.js without using the blocking stdio?

4

夥計們,有幾個人正在登陸這個頁面上,並認爲它是有用的。

process.send()不使用System V IPC,所以上面Penryn鏈接到System V消息大小的信息是完全不相關的。

處理沒有根本的限制。send()消息的大小,而不是內存和cpu的可用性來創建和json編碼/解碼這樣的消息。像往常一樣使用node/javascript,JSON.parse()是同步的,所以在非常大的JSON數據緩衝區上調用它會阻塞節點。如果這是一個問題,請在管道中流式傳輸JSON,並使用其中一個流式JSON解碼庫 - 整體性能會更差,但整體響應性會更好,因爲您不會長時間阻止解析。

如果任何人都可以找到的所謂「郵件大小限制」一reproduceable例如,請github.com/nodejs/node

報告這是一個錯誤給我們的所有情況我見過的這在用戶的應用程序代碼中出錯。