node其实自带提供了性能分析工具:node --profile
但是它分析起来并不是很好用,于是chrome提供了另一种分析和debug工具:Chrome devtool
使用这个工具我们可以分析自己的Node项目调用堆栈里耗时较长的任务,对应去做缓存或者异步调用优化;还可以打断点debug我们的项目。本文就是来介绍一下怎么使用Chrome devtool的性能分析工具的。
为了使优化和测试效果更加明显,建议可以先安装一个apache提供的压测工具:ab。这样可以在大量请求下看到调用情况。
注意是每个平台都有不同的版本,看自己的操作系统寻找安装教程即可。
windows安装ab压测:https://www.jianshu.com/p/2d0a068396cd
使用方法
node --prof
参考:https://blog.csdn.net/m0_53754897/article/details/125308930
- 打开项目,一般我们的项目启动命令都是
node index.js
等等,反正是用node启动的,那么开启性能分析检测就在中间加一个 –prof的参数。开启一个正常运行的本地环境。 - 这样就会在项目目录下生成一个 isolate-xxxxxx.log的文件(如果没有设置路径的话,默认是项目目录下)其实这个文件下的文字都是在描述调用了什么堆栈,方法之类的,就是看起来太复杂。
- 所以我们跳过这个命令,去看chrome提供的可视化devtool工具。
Chrome devtool
-
与上面的命令类似,开启这个工具只需要在参数上增加**–inspect-brk**这样的属性,类似于
node --inspect-brk index.js
这样的命令,就可以生成检测入口链接,如下图生成了一个websoket链接。
–inspect 不会中断,–inspect-brk 在用户代码启动之前会中断,也就是代码在第一行就会暂停执行。
-
打开chrome的devtool网址
chrome://inspect/#devices
,就可以看到远端扫描到的entry,点进去inspect。source里可以看到我们的服务器代码,这时通过source边上的这个开始箭头开启项目,意味着开始debug,在本页面调用接口,可以看到在打开的chrome devtool console里像是平时在客户端一样出现console信息。
看了一些文章说使用nodemon也可以用这个参数调试,我试了一下不行,大家可以自己也试一下。
3. debug可以在vscode内加debugger,也可以直接在devtool里的source里加。在这里加console的断点之后,再访问接口会发现被阻断。
调试分析性能
常见ab压测命令:
options.
-n 请求数量
-c 并发数
-t 测试所进行的最大秒数。
-H 请求头
-p POST请求的请求数据
-T post数据所使用的Content-Type头信息,例如 -T ‘application/x-www-form-urlencoded’GET
e.g :
// 注意 如果需要携带参数必须把url用引号引起来 不然识别不到&
ab -n 10000 -c 10 -H “Cookie:123” “https://test.com?a=1&b=2”POST
ab -n 100 -c 10 -p ‘post.txt’ -T ‘application/x-www-form-urlencoded’
- 首先打开memory栏目,生成一个快照。
- 打开performance栏目开启测试,开始跑ab的压测命令,对自己的某一个接口压测:
ab -n 600 -c 15 “https://test.com?a=1&b=2”
设定并发数15请求量600。 - 可以看到ab生成了一个简单报告,主要看下这个QPS意思是每秒钟我们这个接口可以承载344个请求左右。
- 然后打开performance、Memory看下调用栈情况,Memory记得再生成一个快照。
- 打开performance,看这里,首先看到第一行pool.query,就猜测可能是sql查询的方法,点开调用栈往下看,可以看到文件路径和调用方法,然后跟着内部去尝试优化,其他的调用栈情况也是一样的。
一般来说我们的分析调优看的两点:是否内存泄漏、是否某个方法调用耗时太长,通常的解决方法也是两种:找到内存泄漏的原因予以解决,耗时太长的方法进行数据缓存或者改成异步等其他方式优化。
查看内存使用情况,分析是否内存泄漏问题
如果有内存泄漏问题,随着时间推移服务器无法被回收的内存越占越多影响服务器性能。
同样使用ab压测,这时需要注意,开始之前生成一个快照,中间生成一个快照,结束时生成一个快照。
查看快照时的内存占用,是否执行前后的内存占用一致,中间执行时占用高,结束后回落。看这里可以比较两个快照之间的值变化,按照Size从上往下看,额,目前这个项目太简单,看不出内存问题。
手动制造一下内存泄漏的情况。再跑一下看看。
类似于下图,可以明显看到结束之后内存占用10m,比起开始时候多了1M多,而这我们才跑了600多个请求。打开对比,按照大小排序,可以一个个看,前面的基本看不懂,直到string,往下翻全是我们存起来的数据,这些数据一直没有释放。
就对着这里进行优化即可。
计算性能优化的本质:
- 减少不必要的计算
- 空间换时间
Node.js HTTP服务性能优化方案:提前计算。