当前位置: 首页 > 后端技术 > Node.js

Node.js应用CPU占用率高的分析方法

时间:2023-04-03 11:47:28 Node.js

我们在本地运行Node.js应用,使用--inspect标志启动应用,再次执行负载测试,打开chrome://inspect:single点击应用下方的inspect按钮,然后开始CPU使用率分析:等待一段时间后,可以看到CPUprofile的结果:如何收集生产系统上Node.js应用的性能数据?在大多数情况下,如果性能问题只能在生产系统中重现,那么分析这类问题真的很难,因为我们需要相同的环境配置,相同的数据库、缓存等数据。性能问题可能只特定于某些类别的用户,因为他们有特定的数据。在生产环境中启用调试模式?这不是一个好的选择,因为Node.js进程在调试模式下会消耗更多资源并且不安全。但是有更好的方法,使用inspector模块https://nodejs.org/api/inspec...来按需获取配置文件。它是Node.js内置模块,开发者无需安装任何额外的依赖项,但推荐使用inspector-api。这是一个支持Promise的简单包装器。让我们创建一个记录CPU配置文件的端点。这是一个为NestJS创建一个示例,对于其他框架它看起来非常相似:代码如下:api'constprofileRecordTime=10000@Controller('/profile')exportclassProfileController{@Post('/cpu')asynccpu(){//不要等到记录完成setImmediate(async()=>{//cpu配置文件将保存在临时目录中constinspector=newInspector({storage:{type:'fs'}})//启用并开始分析awaitinspector.profiler.enable()awaitinspector.profiler.start()//等待10秒后停止awaitpromisify(setTimeout)(profileRecordTime)awaitinspector.profiler.stop()console.log('CPUprofilehasbeenwritten')awaitinspector.profiler.disable()})returntrue}}all代码用setImmediate包装,因为我们不需要等到录制结束。我们用curl测试一下:curl-XPOSThttp://127.0.0.1/profile/cpu10秒后,我们在temp文件夹中得到了CPUprofile收集结果:如果你不想把这个函数添加为HTTP端点,您可以将它们包装在进程信号处理程序中,如下所示:newInspector({storage:{type:'fs'}})awaitinspector.profiler.enable()awaitinspector.profiler.start()awaitpromisify(setTimeout)(profileRecordTime)awaitinspector.profiler.stop()console.log('CPU配置文件已写入')awaitinspector.profiler.disable()})process.on('SIGUSR2',async()=>{constinspector=newInspector({storage:{type:'fs'}})awaitinspector.heap.enable()awaitinspector.heap.startSampling()awaitpromisify(setTimeout)(profileRecordTime)awaitinspector.heap.stopSampling()console.log('CPU配置文件已写入')awaitinspector.heap。disable()})然后使用kill命令发送信号:kill-USR1${pid}//forCPUkill-USR2${pid}//堆