詳解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)文章
node.js連接mongoose數(shù)據(jù)庫方法詳解
之前我們都是通過shell來完成對數(shù)據(jù)庫的各種操作的,在開發(fā)中大部分時候我們都需要通過程序來完成對數(shù)據(jù)庫的操作。而Mongoose就是一個讓我們可以通過Node來操作MongoDB的模塊2022-08-08
node.js實現(xiàn)微信JS-API封裝接口的示例代碼
這篇文章主要介紹了node.js實現(xiàn)微信JS-API封裝接口的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
這篇文章主要介紹了詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11

