如何进行Nodejs性能分析?

nodejs性能最重要的两个部分:CPU耗时查看和内存泄漏排查

一,CPU相关

主要思路是两个:借助第三方的工具,以及借助v8自带的性能分析工具

借助第三方的工具

主要思路是:先生成cpuprofile,然后借助第三方工具生成可视化的图或者是文件。

1,如何生成cpuprofile?

v8-profiler

这是一个npm包,用法也很简单,引入后直接调用api:startProfiling,然后结束时调用stopProfiling,会生成一个profile对象,它支持export导出,再利用fs包去生成文件即可,最后删除这个对象,这个写出的文件就是cpuprofile文件了,可以配置指定请求URL去获取它。

2,如何分析cpuprofile?

  1. Chrome自带的DevTools工具
    1. 在More tools里有一个Javascript Profiler工具,然后load我们刚刚生成的cpuprofile文件即可。
    2. 通过默认的Tree选项,会按照调用栈排列展示。
    3. 然后勾选Total Time,按照函数及函数内部所有调用函数的时间总和进行排序,就可以定位到CPU耗时较多的方法了,从而就能定位到问题代码。

(2) flamegraph

这是一个npm包,用来生成火焰图,它是一个svg文件,用法也很简单,通过命令行直接生成即可

(这里补充一下火焰图的知识点)

(1) 每一个小块代表函数在栈中的位置;

(2) Y轴代表栈的深度,顶部的小块表示占据CPU的函数,每一个小块下面是它的祖先,也就是父函数;

(3) X轴没有什么特殊含义,跟时间轴无关,只是字母顺序排列;

(4) 小块的宽度代表CPU的使用时间,小块越宽,CPU耗时越久,这也是我们需要重点关注的,如果性能较优的情况下,火焰图应该只有一小部分密密麻麻的小块,挤在一起靠边上。

(3) v8-analytics

这也是一个npm包,可以通过命令行查看执行时间大于某个时间(比如200ms)的函数

借助V8的Tick Processor

主要思路是:先生成v8.log文件,然后对它进行分析

1,如何生成v8.log?

V8内置了一个性能分析工具Tick Processor,可以记录JavaScript,C,C++代码的堆栈信息,可以通过  —prof 命令开启,就会生成一个v8.log文件。

2,如何分析?

  1. 通过 —prof-process 命令去分析这个log文件,就可以看到每个函数的执行时间了。
  2. V8提供了一个可视化工具来查看生成的v8日志,在v8的GitHub仓库里,直接clone下来即可查看;

二,内存

如何查看内存?

主要思路是:分析heapdump,通过生成heapsnapshot快照,再对快照进行分析。

1,如何生成heapsnapshot快照?

利用heapdump包,用法也很简单,直接引入即可,服务启动后就会在根目录下生成一个heapsnapshot文件了。

2,如何分析?

  1. 利用Chrome DevTools的Memory面板

(1) 通过load生成的heapsnapshot文件,选择Summary模式,就是按构造函数名分类;

(2) 选中Retained Size,按照对象自身及内部包含的所有引用对象的大小总和进行排序,即可看到占比较大的对象,这也就是GC之后能回收的内存大小。

如何分析内存泄漏?

首先我们要明白为什么会造成内存泄漏?

一般是因为闭包所占的内存空间没有被及时回收所导致的。

在同一个函数内部闭包作用域只有一个,所有闭包共享,遇到闭包时会创建一个闭包作用域的内存空间,后续再遇到闭包,就会往之前创建过的闭包作用域里添加变量,函数执行完毕后回收没有用到的变量,而留下的就是导致内存泄漏的变量了。

1,利用 memwatch-next 工具搭配heapdump使用,通过监听stats(每次GC都会触发stats)事件以及leak(连续5次GC后内存都上升就会触发)事件。启动时打印一次heapsnapshot快照,然后触发leak事件后callback里再打印一次快照。

2,利用Chrome DevTools加载两次快照,选择Comparison比较试图,就可发现内存泄漏时增加的函数了,再根据刚刚上面提到的分析过程,定位到具体对象;

Node.js调试相关的更多相关文章

  1. node.js调试

    用了几天node.js感觉很新奇,但是调试问题实在是愁煞人,开始的时候懒的学习调试方法,看看异常内容就可以了,但随着代码复杂程度的上升,并不是所有错误都是语法错误了,不调试搞不定了,只好搜搜资料,学习 ...

  2. node.js 使用----相关常用命令总结

    node.js 使用----相关常用命令总结 1. 下载并安装node.js 2. 设置全局模块存放的目录 2.1 查看默认配置 npm config ls 2.2 修改全局模块存放目录 npm co ...

  3. WebStorm配置node.js调试

    最近因为工作关系,一直在做node.js的开发,学习了koa框架,orm框架sequelize,以及swagger文档的配置.但是,最近因为swagger文档使用了es6的修饰器那么个东西(在java ...

  4. Node.js调试技巧

    1. console.log 跟前端调试相同,通过一步步打印相关变量进行代码调试 2. 使用Node.js内置的调试器 通过node debug xxx.js来进行调试: [root@~/wade/n ...

  5. node.js及相关组件安装

    第一步:下载安装文件(下载地址:官网http://www.nodejs.org/download/ )第二步:安装nodejs(双击直接安装) 安装完成后使用命令行查看版本信息,出现版本号说明安装成功 ...

  6. Node.js 调试器

    稳定性: 3 - 稳定 V8 提供了强大的调试工具,可以通过 TCP protocol 从外部访问.Node 内置这个调试工具客户端.要使用这个调试器,以debug参数启动 Node,出现提示: % ...

  7. node.js 调试问题

    最近打算在项目过程中使用node.js辅助解决一些问题,需要用到node.js的调试技术. 通常而言,大家都会提到debugger或者node-inspector方法. debugger方法谁用谁知道 ...

  8. sublime text配置node.js调试

    1. 首先到 nodejs.org 下载 Node.js 安装包并安装.2. 打开 Sublime Text 2 编辑器.选择菜单 Tools --> Build System --> n ...

  9. nodejs学习笔记Node.js 调试命令

    3.4  调试        47  下面是一个简单的例子: $ node debug debug.js < debugger listening on port 5858 connecting ...

随机推荐

  1. 测试驱动开发学习笔记(UTDD)

    title: 测试驱动开发学习笔记(UTDD) date: 2020-08-01 23:59:17 tags: [2020, 学习一门技能, TDD, DevOps] What TDD(Test-Dr ...

  2. Docker之Ubuntu上使用Docker的简易教程

    Ubuntu上使用Docker的简易教程 原始文档:https://www.yuque.com/lart/linux/fp6cla 说在开头 在天池的比赛中涉及到了docker的使用.经过多番探究,大 ...

  3. mPaaS 小程序架构解析 | 实操演示小程序如何实现多端开发

    对于 mPaaS 小程序开发框架,想必读者们并不陌生.它源自于支付宝小程序框架,继承了易开发性.跨平台性及 Native 性能,不仅帮助开发者实现面向自有 App 投放小程序,还可快速构建打包,覆盖支 ...

  4. lombok的基本使用方法

    在java刚开始学习的时候,首先就会学习封装.继承和多态,就拿封装来说,封装就是为了保护数据安全而将实体类内部数据保持为私有状态,如果外部程序想要访问里面的数据就必须调用此实体类提供的相关数据接口,这 ...

  5. ebook 电子书项目

    ebook电子书网站使用eclipse开发,开发语言主体是JAVA,使用的是servlet+jsp,前端使用javascript和jQuery,页面布局设计使用的是bootstrap,在这里我记下我开 ...

  6. Java 多态 接口继承等学习笔记

    Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字  super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...

  7. 02-java实现单链表

    02-手撸链表 本篇是恋上数据结构第一季个人总结 借鉴https://juejin.im/post/6844904001478066183#heading-0 本人git https://github ...

  8. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  9. 实体类转xml

    看项目中需要实体类转xml,大家是拼接的.感觉可以利用反射实现.于是写了下 代码如下 package com.kevin.util; import org.springframework.util.O ...

  10. 2020大厂web前端面试常见问题总结

    本篇收录了一些面试中经常会遇到的经典面试题以及自己面试过程中遇到的一些问题.通过对本篇知识的整理以及经验的总结,希望能帮到更多的前端面试者. 1.web前端项目的结构是怎样的?文件有哪些命名规范? 项 ...