You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
router.get('/cpuprofile',asyncfunction(ctx,next){//Start Profilingconsole.log('Start Profiling');profiler.startProfiling('CPU profile')await_sleep(30*1000);console.log('Stop Profiling after 30s');//Stop Profiling after 30sconstprofile=profiler.stopProfiling()profile.export().pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`)).on('finish',()=>profile.delete())ctx.status=204})
2.1.2 收集测试数据
执行curl localhost:3020/cpuprofile 进行v8数据收集
通过ab工具进行访问 ab -c 20 -n 2000 "http://localhost:3020/encrypt"
1. 基础工具介绍
1.1 ab
1.1.1 简述
ab是apache自带的压测工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试
1.1.2 使用
1.1.3 结果分析(仅列出可能需要关注的)
1.2 Chrome DevTools
1.2.1 简述Chrome
开发者工具是一套内置于Google Chrome中的Web开发和调试工具,可用来对网站进行迭代、调试和分析。
1.2.2 使用
1.3 v8-profiler
1.3.1 简述
v8-profiler集成了node-inspector。我们可以通过v8-profiler 收集一些运行时数据(例如:CPU 和内存)
1.3.2 使用
参考 https://github.com/node-inspector/v8-profiler
2. 问题定位与分析
2.1 CPU
2.1.1 测试代码
2.1.2 收集测试数据
curl localhost:3020/cpuprofile
进行v8数据收集ab -c 20 -n 2000 "http://localhost:3020/encrypt"
2.1.3 数据分析
JS Profiler 一共有三种模式
火焰图
2.2 内存
2.2.1 测试代码
在执⾏函数的时候,如果遇到闭包,则会创建闭包作⽤域的内存空间,将该闭包所⽤到的局部变量添加进去,然后再遇到闭包时,会在之前创建好的作⽤域空间添加此闭包会⽤到⽽前闭包没⽤到的变量。函数结束时,会清除没有被闭包作⽤域引⽤的变量。
可以看上面函数中产生了两个闭包,
leakMethod
和unused
,unused
这个闭包引⽤了⽗作⽤域中的originLeakObject
变量,如果没有后⾯的leakMethod
,则会在函数结束后被清除,闭包作⽤域也跟着被清除了。因为后⾯的leakObject
是全局变量,即leakMethod
是全局变量,它引⽤的闭包作⽤域不会释放。⽽随着testMemoryLeak 不断的调⽤,originLeakObject 指向前⼀次的 leakObject,下次的leakObject.leakMethod ⼜会引⽤之前的 originLeakObject,从⽽形成⼀个闭包引⽤链,⽽ leakStr 是⼀个⼤字符串,得不到释放,从⽽造成了内存泄漏。2.2.2 数据分析
Containment 视图:允许探索堆内容。提供了应用的对象结构的“俯瞰视图”,一般用不到
在 Containment 视图中,我们可以查看整个 GC 路径,当然一般不会用到。因为展开在 Summary 和 Comparison 列举的每一项,都可以看到从 GC roots 到这个对象的路径。通过这些路径,你可以看到这个对象的句柄被什么持有,从而定位问题产生的原因。
3. 集成监控诊断工具
3.1 node-clinic
3.1.1 简介
node-clinic 是 NearForm 开源的一款 Node.js 性能诊断工具,可以迅速地定位性能问题
3.1.2 使用
demo分析 - doctor
![image](https://user-images.githubusercontent.com/16440464/77309063-eff9ab80-6d36-11ea-8898-91e7429b263b.png)
执行
clinic doctor -- node ./bin/www
开启服务且使用ab压测可以看出Event Loop 被阻塞,CPU Usage 也居高不下,一定是有 CPU 密集计算,与我们的测试代码吻合。
demo分析 - flame
从doctor分析得知Event Loop 被阻塞,一定是有 CPU 密集计算,我们执行
clinic flame -- node ./bin/www
可以生成火焰图,定位具体问题3.3 alinode
3.3.1 产品介绍
产品链接: https://www.aliyun.com/product/nodejs
产品介绍:alinode是面向中大型 Node.js 应用提供性能监控、安全提醒、故障排查、性能优化等服务的整体性解决方案。alinode 团队凭借对 Node.js 内核的深入理解,提供了完善的工具链和服务,协助客户主动、快速地发现和定位线上问题。
The text was updated successfully, but these errors were encountered: