Node.js性能监控实例分析

发布时间:2022-08-13 14:39:38 作者:iii
来源:亿速云 阅读:246

这篇文章主要讲解了“Node.js性能监控实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js性能监控实例分析”吧!

Node.js性能监控实例分析

为什么需要性能监控

Node作为Javascript在服务端的一个运行时(Runtime),极大的丰富了Javascript的应用场景。

但是Node.js Runtime本身是一个黑盒,我们无法感知运行时的状态,对于线上问题也难以复现

因此性能监控是Node.js应用程序「正常运行」的基石。不仅可以随时监控运行时的各项指标,还可以帮助排查异常场景问题。

组成部分

性能监控可以分为两个部分:

方案对比

Node.js性能监控实例分析

从上图可以看到目前主流的三种Node.js性能监控方案的优缺点,以下是简单介绍这三种方案的组成:

性能指标

CPU

Node.js性能监控实例分析

通过process.cpuUsage()可以获取当前进程的CPU耗时数据,返回值的单位是微秒

Memory

Node.js性能监控实例分析

通过process.memoryUsage()可以获取当前进程的内存分配数据,返回值的单位是字节

Node.js性能监控实例分析

从上图可以看出,rss包含代码段(Code Segment)、栈内存(Stack)、堆内存(Heap)

Heap

通过v8.getHeapStatistics()v8.getHeapSpaceStatistics()可以获取v8堆内存和堆空间的分析数据,下图展示了v8的堆内存组成分布:

Node.js性能监控实例分析

堆内存空间先划分为空间(space),空间又划分为页(page),内存按照1MB对齐进行分页。

GC

v8的垃圾回收算法分为两类:

Scavenge

前提:New space分为fromto两个对象空间

触发时机:当New space空间满了

步骤:

适用于回收频繁,内存不大的对象,典型的空间换时间的策略,缺点是浪费了多一倍的空间

Mark-Sweep-Compact

三个步骤:标记、清除、整理

触发时机:当Old space空间满了

步骤:

Stop-The-World

在最开始v8进行垃圾回收时,需要停止程序的运行,扫描完整个堆,回收完内存,才会重新运行程序。这种行为就叫全停顿(Stop-The-World

虽然新生代活动对象较小,回收频繁,全停顿,影响不大,但是老生代存活对象多且大,标记、清理、整理等造成的停顿就会比较严重。

优化策略

这个理念其实有点像React框架中的Fiber架构,只有在浏览器的空闲时间才会去遍历Fiber Tree执行对应的任务,否则延迟执行,尽可能少地影响主线程的任务,避免应用卡顿,提升应用性能。

空间调整

由于v8对于新老生代的空间默认限制了大小

因此node提供了两个参数用于调整新老生代的空间上限

查看GC日志

node也提供了三种查看GC日志的方式:

由于GC日志比较原始,还需要二次处理,可以使用AliNode团队开发的v8-gc-log-parser

快照工具

Heapsnapshot

对于运行程序的堆内存进行快照采样,可以用来分析内存的消耗以及变化

生成方式

生成.heapsnapshot文件有以下几种方式:

Node.js性能监控实例分析

Node.js性能监控实例分析

Node.js性能监控实例分析

分析方法

生成的.heapsnapshot文件,可以在Chrome devtools工具栏的Memory,选择上传后,展示结果如下图:

Node.js性能监控实例分析

默认的视图是Summary视图,在这里我们要关注最右边两栏:Shallow SizeRetained Size

当发现Retained Size特别大时,该对象内部可能存在内存泄漏,可以进一步展开去定位问题

还有Comparison视图是用于比较分析两个不同时段的堆快照,通过Delta列可以筛选出内存变化最大的对象

Node.js性能监控实例分析

Cpuprofile

对于运行程序的CPU进行快照采样,可以用来分析CPU的耗时及占比

生成方式

生成.cpuprofile文件有以下几种方式:

这是采集5分钟的CPU Profile样例

Node.js性能监控实例分析

分析方法

生成的.cpuprofile文件,可以在Chrome devtools工具栏的Javascript Profiler(不在默认tab,需要在工具栏右侧的更多中打开显示),选择上传文件后,展示结果如下图:

Node.js性能监控实例分析

默认的视图是Heavy视图,在这里我们看到有两栏:Self TimeTotal Time

当发现Total TimeSelf Time偏差较大时,该函数可能存在耗时比较多的CPU密集型计算,也可以展开进一步定位排查

Codedump

当应用意外崩溃终止时,系统会自动记录下进程crash掉那一刻的内存分配信息,Program Counter以及堆栈指针等关键信息来生成core文件

生成方式

生成.core文件的三种方法:

分析方法

获取.core文件后,可以通过mdb、gdb、lldb等工具实现解析诊断实际进程crash的原因

案例分析

观察

Node.js性能监控实例分析

从监控可以观察到堆内存在持续上升,因此需要堆快照进行排查

分析

Node.js性能监控实例分析

根据heapsnapshot可以分析排查到有一个newThing的对象一直保持着比较大的内存

排查

Node.js性能监控实例分析

从代码中可以看到虽然unused方法没有调用,但是newThing对象是引用自theThing,导致其一直存在于replaceThing这个函数的执行上下文中,没有被释放,这就是典型的由于闭包产生的内存泄漏案例

小结

常见的内存泄漏有以下几种情况:

因此在上述这几种情况时,一定要谨慎考虑对象在内存中是否会被自动回收,不会被自动回收的话,需要手动进行回收,比如手动把对象设置为null、移除定时器、解绑事件监听等

感谢各位的阅读,以上就是“Node.js性能监控实例分析”的内容了,经过本文的学习后,相信大家对Node.js性能监控实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. mongodb性能监控
  2. mongodb 性能监控

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nodejs

上一篇:Python OpenCV图像分割算法如何实现

下一篇:windows server 2016怎么搭建FTP服务器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》