node服務CPU過高怎麼辦?怎麼排查?以下這篇文章給大家整理分享下node服務CPU過高的檢驗思路,希望對大家有幫助!
幫同事看一個CPU過高的問題
- CPU漲了後掉不下去,最後同事排查出來是某個依賴升級大版本後下線了預設的公共redis 配置,(專案較老,很久沒人動過)但需要業務方代碼裡自己配置關閉redis服務。業務方有資訊gap,所以不知道要關閉redis,導致上線後,一直在重試連接redis(多一個請求就多一次重試)
最終我們總結了排查思路,如下,歡迎補充
排查思路
0. 重啟實例
部分問題,重啟實例就能解決了。
先重啟實例,這是必要做的一步,先讓服務變得可用。如果後續CPU還是飆升過快,那麼可能只能考慮先回滾程式碼了。飆升不快的話,可以不用回滾,盡快排查問題
1. linux shell 確定是否是node進程造成的
命令一:top
- 可以發現,主要是node進程在佔用CPU。 【相關教學推薦:nodejs影片教學】
[root@*** ~]# top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 680 root 20 0 2290976 168176 34976 S 30.3 2.0 103:42.59 node 687 root 20 0 2290544 166920 34984 R 26.3 2.0 96:26.42 node 52 root 20 0 1057412 23972 15188 S 1.7 0.3 11:25.97 **** 185 root 20 0 130216 41432 25436 S 0.3 0.5 1:03.44 **** ...
指令二:vmstat
- 先看一個vmstat 2 指令,表示每隔兩秒鐘採集一次
[root@*** ~]# vmstat 2 procs -----------memory---------------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 233481328 758304 20795516 0 0 0 1 0 0 0 0 100 0 0 0 0 0 233480800 758304 20795520 0 0 0 0 951 1519 0 0 100 0 0 0 0 0 233481056 758304 20795520 0 0 0 0 867 1460 0 0 100 0 0 0 0 0 233481408 758304 20795520 0 0 0 20 910 1520 0 0 100 0 0 0 0 0 233481680 758304 20795520 0 0 0 0 911 1491 0 0 100 0 0 0 0 0 233481920 758304 20795520 0 0 0 0 889 1530 0 0 100 0 0
-
procs
#r #表示執行佇列(就是說多少個行程真的被分配到CPU),當這個數值超過了CPU數目,就會出現CPU瓶頸了。這個也跟top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。 top的負載類似每秒的運行佇列。如果運行佇列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
b #表示阻塞的進程,在等待資源的進程,這個不多說,進程阻塞,大家懂的。
-
memory
swpd #虛擬記憶體已使用的大小,如果大於0,表示你的機器物理記憶體不足了,如果不是程式記憶體外洩的原因,那麼你該升級記憶體了或是把耗記憶體的任務移轉到其他機器。
free # 空閒的實體記憶體的大小
buff #Linux/Unix系統是用來存儲,目錄裡面有什麼內容,權限等的快取
cache #cache直接用來記憶我們打開的文件,給文件做緩衝,把空閒的物理內存的一部分拿來做文件和目錄的緩存,是為了提高程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。
-
swap
si #每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示物理記憶體不夠用或記憶體洩露了,要查找耗內存進程解決掉。我的機器記憶體充裕,一切正常。
so #每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。
-
io
bi #區塊設備每秒接收的區塊數量,這裡的區塊裝置是指系統上所有的磁碟和其他區塊設備,預設區塊大小是1024byte
bo #區塊裝置每秒鐘發送的區塊數量,例如我們讀取文件,bo就要大於0。 bi和bo一般都要接近0,不然就是IO太頻繁,需要調整。
-
system
in #每秒CPU的中斷次數,包含時間中斷
cs #每秒情境切換次數,例如我們呼叫系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目
-
cpu
us #用戶CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳) 。
sy #系統CPU時間,如果太高,表示系統呼叫時間長,例如IO操作頻繁。
id #空閒 CPU時間,一般來說,id us sy = 100,一般我認為id是空閒CPU使用率,us是使用者CPU使用率,sy是系統CPU使用率。
wt #等待IO CPU時間。
-
實踐
#procs r: 運作的進程比較多,系統很忙
bi/bo: 磁碟寫的資料量稍大,如果是大檔案的寫,10M以內基本上不用擔心,如果是小檔案寫2M以內基本正常
cpu us: 持續大於50%,服務高峰期可以接受, 如果長期大於50 ,可以考慮優化
cpu sy: 現實內核進程所佔的百分比,這裡us sy的參考值為80% ,如果us sy 大於80%說明可能有CPU不足。
cpu wa: 列顯示了IO等待所佔用的CPU時間的百分比。這裡wa的參考值為30%,如果wa超過30%,表示IO等待嚴重,這可能是磁碟大量隨機存取造成的, 也可能磁碟或磁碟存取控制器的頻寬瓶頸造成的(主要是區塊操作)
參考連結: https://www.cnblogs.com/zsql/p/11643750.html
2. 看程式碼diff
重啟實例還沒解決,並且確定了是node進程的問題的話,
查看上線commit,檢查一下程式碼diff,看看是否能找到問題點
3. 打運行時的CPU profiler
#這個操作方法和我的另一篇如何快速定位ssr服務端記憶體洩漏問題 類似
用node --inspect開始服務
-
本地模擬線上環境,用build後的程式碼,直接build可能會不能用,要控制好環境變量,並且醜化壓縮要關掉
- 比如,讓一些環境變數(CDN網域等)指向本地,因為打的套件在本地,所以沒上傳到CDN
產生CPU profiler
##如果本地無法模擬出線上的環境?
例如下游RPC和本地就是有隔離,那就只能加程式碼,去打出profile了4. 分析CPU profiler
#結合profiler 和程式碼diff 去找原因
- #還可以把profile 檔案上傳到
www.speedscope.app/# (檔案上傳),就能得到cpu profile火焰圖 (更詳細的使用介紹:www.npmjs.com/package/spe…
5. 壓測校驗
可以用ab,或其他壓測工具總結
- #重啟實例
- 確定是node進程導致的 ##看程式碼diff
- 產生執行階段的CPU profiler
- 結合profiler 與程式碼diff 去找原因
- 壓測校驗
#更多node相關知識,請造訪:nodejs 教學!
以上是node服務CPU過高怎麼辦?聊聊排查思路的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)