詳解Node.js?應(yīng)用高?CPU?占用率分析方法
本地運(yùn)行 Node.js 應(yīng)用
我們在本地運(yùn)行 Node.js 應(yīng)用,使用 --inspect 標(biāo)志啟動(dòng)應(yīng)用程序,再次執(zhí)行負(fù)載測試,在 Chrome 瀏覽器中打開 chrome://inspect:

單擊應(yīng)用下方的 inspect 按鈕,然后開始 CPU 占用率分析:

等待一段時(shí)間后,就能看到 CPU profile 的結(jié)果:

如何采集生產(chǎn)系統(tǒng)上的 Node.js 應(yīng)用性能數(shù)據(jù)
在大多數(shù)情況下,如果性能問題只能在生產(chǎn)系統(tǒng)重現(xiàn),那么這種問題分析起來確實(shí)很棘手,因?yàn)槲覀冃枰嗤沫h(huán)境配置、相同的數(shù)據(jù)庫、緩存等數(shù)據(jù)。 性能問題可能只針對某些類別的用戶,因?yàn)樗麄冇刑囟ǖ臄?shù)據(jù)。
在生產(chǎn)環(huán)境開啟調(diào)試模式?這不是一個(gè)好的選擇,因?yàn)樵谡{(diào)試模式下 Node.js 進(jìn)程會(huì)消耗更多資源,而且不安全。
但是有一個(gè)更好的方法,使用檢查器模塊 nodejs.org/api/inspect… 按需獲取配置文件。 它是一個(gè) Node.js 內(nèi)置模塊,開發(fā)人員不必安裝任何額外的依賴項(xiàng),但建議使用 inspector-api .
它是一個(gè)帶有 Promise 支持的簡單包裝器。 讓我們創(chuàng)建一個(gè)記錄 CPU 配置文件的端點(diǎn)。
下面是為 NestJS 創(chuàng)建一個(gè)示例,對于其他框架,它看起來非常相似:
代碼如下:
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 包裹,因?yàn)槲覀儾恍枰鹊戒浿平Y(jié)束。 讓我們用 curl 測試一下:
curl -X POST http://127.0.0.1/profile/cpu
10 秒之后,我們在 temp 文件夾得到了 CPU profile 的采集結(jié)果:

如果不想將此功能添加為 HTTP 端點(diǎn),則可以將它們包裝在進(jìn)程信號(hào)處理程序中,如下所示:
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ā)送信號(hào):
kill -USR1 ${pid}// for CPUkill -USR2 ${pid}// for Heap
以上就是詳解Node.js 應(yīng)用高 CPU 占用率分析方法的詳細(xì)內(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í)候我們都需要通過程序來完成對數(shù)據(jù)庫的操作。而Mongoose就是一個(gè)讓我們可以通過Node來操作MongoDB的模塊2022-08-08
node.js實(shí)現(xiàn)微信JS-API封裝接口的示例代碼
這篇文章主要介紹了node.js實(shí)現(xiàn)微信JS-API封裝接口的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
koa2上傳文件及https配置實(shí)現(xiàn)教程
這篇文章主要為大家介紹了koa2上傳文件及https配置實(shí)現(xiàn)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù)
這篇文章主要介紹了詳解如何在Node.js的httpServer中接收前端發(fā)送的arraybuffer數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
package.json版本號(hào)符號(hào)^和~前綴的區(qū)別
這篇文章介紹了package.json版本號(hào)符號(hào)^和~前綴的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

