詳解Node.js?應(yīng)用高?CPU?占用率分析方法
本地運行 Node.js 應(yīng)用
我們在本地運行 Node.js 應(yīng)用,使用 --inspect
標志啟動應(yīng)用程序,再次執(zhí)行負載測試,在 Chrome 瀏覽器中打開 chrome://inspect:
單擊應(yīng)用下方的 inspect 按鈕,然后開始 CPU 占用率分析:
等待一段時間后,就能看到 CPU profile 的結(jié)果:
如何采集生產(chǎn)系統(tǒng)上的 Node.js 應(yīng)用性能數(shù)據(jù)
在大多數(shù)情況下,如果性能問題只能在生產(chǎn)系統(tǒng)重現(xiàn),那么這種問題分析起來確實很棘手,因為我們需要相同的環(huán)境配置、相同的數(shù)據(jù)庫、緩存等數(shù)據(jù)。 性能問題可能只針對某些類別的用戶,因為他們有特定的數(shù)據(jù)。
在生產(chǎn)環(huán)境開啟調(diào)試模式?這不是一個好的選擇,因為在調(diào)試模式下 Node.js 進程會消耗更多資源,而且不安全。
但是有一個更好的方法,使用檢查器模塊 nodejs.org/api/inspect… 按需獲取配置文件。 它是一個 Node.js 內(nèi)置模塊,開發(fā)人員不必安裝任何額外的依賴項,但建議使用 inspector-api .
它是一個帶有 Promise 支持的簡單包裝器。 讓我們創(chuàng)建一個記錄 CPU 配置文件的端點。
下面是為 NestJS 創(chuàng)建一個示例,對于其他框架,它看起來非常相似:
代碼如下:
import { Controller, Post } from '@nestjs/common' import { promisify } from 'util' import Inspector from 'inspector-api' const profileRecordTime = 10000 @Controller('/profile') export class ProfileController { @Post('/cpu') async cpu() { // don't wait till recording is finished setImmediate(async () => { // cpu profile will be saved in temp dir const inspector = new Inspector({ storage: { type: 'fs' } }) // enabling and starting profiling await inspector.profiler.enable() await inspector.profiler.start() // wait for 10 seconds and stop await promisify(setTimeout)(profileRecordTime) await inspector.profiler.stop() console.log('CPU profile has been written') await inspector.profiler.disable() }) return true } }
所有代碼都用 setImmediate 包裹,因為我們不需要等到錄制結(jié)束。 讓我們用 curl 測試一下:
curl -X POST http://127.0.0.1/profile/cpu
10 秒之后,我們在 temp 文件夾得到了 CPU profile 的采集結(jié)果:
如果不想將此功能添加為 HTTP 端點,則可以將它們包裝在進程信號處理程序中,如下所示:
import { promisify } from 'util' import Inspector from 'inspector-api' const profileRecordTime = 10000 process.on('SIGUSR1', async () => { const inspector = new Inspector({ storage: { type: 'fs' } }) await inspector.profiler.enable() await inspector.profiler.start() await promisify(setTimeout)(profileRecordTime) await inspector.profiler.stop() console.log('CPU profile has been written') await inspector.profiler.disable() }) process.on('SIGUSR2', async () => { const inspector = new Inspector({ storage: { type: 'fs' } }) await inspector.heap.enable() await inspector.heap.startSampling() await promisify(setTimeout)(profileRecordTime) await inspector.heap.stopSampling() console.log('CPU profile has been written') await inspector.heap.disable() })
然后使用 kill 命令發(fā)送信號:
kill -USR1 ${pid}
// for CPUkill -USR2 ${pid}
// for Heap
以上就是詳解Node.js 應(yīng)用高 CPU 占用率分析方法的詳細內(nèi)容,更多關(guān)于Node.js 應(yīng)用高 CPU 占用率的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
NodeJS模塊與ES6模塊系統(tǒng)語法及注意點詳解
這篇文章主要給大家介紹了關(guān)于NodeJS模塊與ES6模塊系統(tǒng)語法及注意點的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Windows安裝Node.js報錯:2503、2502的解決方法
這篇文章主要給大家介紹了關(guān)于在Windows系統(tǒng)下安裝Node.js報錯:2503、2502的解決方法,文中將解決的方法一步步介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10Node.js+Express.js+TS實現(xiàn)簡單圖床腳本
在這篇博客文章中,我將介紹如何使用 TypeScript 和 Express 框架來編寫一個簡單的圖床腳本,可以將本地圖片上傳到服務(wù)器,并返回圖片的 URL,這樣,你就可以在 Markdown 文檔中方便地引用圖片,而不用擔(dān)心圖片的存儲和管理問題2023-10-10