回覆列表
-
1 # 物聯網全棧開發
-
2 # 廖亮
密集計算會彪高cpu,這種情況是正常的。相當於你拿很重的東西必須要這麼大的力氣才拿得起。
最佳化:
分析程式碼確保沒有空耗cpu的無用程式碼,比如無限迴圈等。
透過一些演算法進行最佳化,比如一些空間換時間的演算法。
平行計算(因為nodejs不能直接操作執行緒,可以使用child_process多程序模式利用多核運算)。
如果最佳化程式碼不能實現預想的效果,可以考慮c++這種執行效率比v8更高的實現,透過node-gyp編譯為原生模組。
nodejs對於cpu密集計算可怕之處是堵塞eventloop,導致後續任務無法執行,無法發揮併發優勢,對於一個處理請求的伺服器是致命的。解決這個問題可以使用child_process建立子程序,或者換計算能力更強的機器提供微服務。
我們碰到過ngnix的類似情況,可能有參考意義。
該伺服器提供裝置韌體上傳功能,使用者可以透過裝置的網頁前端上傳裝置韌體,以後後端程式將韌體升級到裝置。
裝置的韌體大概有100多M大小,我們在ngnix服務端編寫LUA指令碼接受前端網頁提交的資料包。
在整個接受過程中CPU的佔用率高達100%,裝置整體反應變慢,甚至偶爾崩潰重啟。後來我們研究了ngnix相關配置,沒有找到相關的配置,甚至交叉編譯了相關的模組,也只能配置下載的負荷。
後天我們修改LUA指令碼,在收到一個數據包處理之後,sleep毫秒級時間,整個上傳數率稍有下降,但是cpu利用率下降到了40%左右,系統穩定性大大增加。
我想node.js應該也是類似原因,樓主也可以用這種思路,在做一段時間運算以後,sleep一段時間,釋放資源給系統。
如果是多核cpu,樓主可以做一些合理配置。