Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >NodeJS 性能优化之 CPU 看图篇

NodeJS 性能优化之 CPU 看图篇

原创
作者头像
web爱好者
修改于 2017-09-07 01:43:58
修改于 2017-09-07 01:43:58
7.9K01
代码可运行
举报
文章被收录于专栏:郑清江的专栏郑清江的专栏
运行总次数:1
代码可运行

服务稳定性到一定程度之后,都会开始经历一段精细化运营的过程,从成本意识角度来说也是成立的。作为前端出身的NodeJS开发者们,产生共鸣的那就是如何能够直观且快速发现性能瓶颈,能够像调试前端的JS代码那样可视化,堆栈化,接下来我们就针对常见的CPU性能分析方法来揭开NodeJS的CPU面纱。

一、CPU使用情况可视化展示(火焰图—Flame Graph)

充分利用劳动工具有助于帮助我们提升定位问题的效率,Linux kernal自带的系统性能分析工具perf,为我们提供函数级与指令级的热点查找,常用于性能瓶颈的查找与热点代码定位。

#NodeJS如何正确完整的采集火焰图呢?

1-1、用例构造

NodeJS服务代码示例—JSON编解码,如下片段:

1-2 启动方式:

启动参数:--perf_basic_prof或—perf-basic-prof适用于node@0.11.13

也可以使用--perf_basic_prof_only_functions

标准方式:node --perf_basic_prof JsonParse.js

MIG tafNodeJS启动方式:私有模板配置启动参数,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

<taf>

<application>

    <server>

        node-args=--perf-basic-prof

</server>

</application>

</taf>

注:--perf_basic_prof或--perf-basic-prof会对应生成一个/tmp/perf-pid.map文件,如图:

1-3 perf脚本采集函数和热点代码

#查看NodeJS服务进程pid,采集时需要用到。命令:$ ps –ef | grep ‘worker’

#采集脚本:$ perf record -F 99 -p 182497 -g -- sleep 60

参数说明如下:

采集频率(ms)

进程pid

调用记录

记录时长

-F 99

-p 182497

-g

--sleep 60

#进程对应的符号表perf-pid.map权限设置:$chown root /tmp/perf-pid.map

踩过的坑!!!是为了消除下面这个问题的

File /tmp/perf-PID.map not owned by current user or root, ignoring it (use -f to override).

Failed to open /tmp/perf-PID.map, continuing without symbols

  • 挖出FlameGraph开源库里面的stackcollapse-perf.pl和flamegraph.pl

http://github.com/brendangregg/FlameGraph

  • svg文件生成

单一颜色:$ perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > xxx.svg

多种颜色:perf script | ./stackcollapse-perf.pl | ./flamegraph.pl --color=js –hash > xxx.svg,如下图:

二、CPU火焰图的理解与性能分析

2.1 通过上面的步骤采集出两种不同颜色系的火焰图,如下图

2.2 火焰图颜色对应关系,如下表:

颜色

类型

绿色

JS代码调用

蓝色

优化编译代码

黄色

C++/C代码

红色

libuv系统调用

2.3 火焰图形状对应关系

形状

含义

每一个平面方块

一个函数在栈中的位置(也称一个栈帧)

Y轴

栈的深度(也叫栈的帧数)

X轴

表示总的样例,不过它们左右顺序没有特殊含义

每个平面方块的宽度

方块的宽度标示CPU使用时间或者说相对父函数而言使用CPU的比率,越宽代表占用CPU的时间越长,或者使用CPU很频繁

2.4 JSON序列化与反序列化火焰图分析

采用ab进行压力测试分析JSON.parse与JSON.stringify性能开销

压测命令:ab –n 3000000 -c 50 http://ip:port/jsonParse

从火焰图看到JsonParse.js里面耗时主要消耗在JSON序列化和反序列化

几个常见的栈帧类型说明:

栈帧

含义

LazyCompile

指的是下回会被编译

Builtin

指的是C++内置的运算方法

Stub

C入口桩代码:作用是在js的JIT代码中,如果要调用Runtime的函数,则通过CEntryStub实现

V8::internal

内部命名空间,就是C++的namespace,在V8的源代码可以找到对应的namespace

2.5 JSON反序列化(JSON.parse)源码分析

概念普及——解析器常见原理:

a) 词法分析

b) 语法分析生成抽象语法树(AST)

c) 针对抽象语法树进行语义分析,构建你需要的内部数据结构或生成代码

通过局部查看火焰图分析源码

1 Stub:CEntryStub:C入口桩代码,在JS的JIT代码中,提供调用Runtime的函数(如DOM函数或者JS的builtin函数)

2【编译builtins.h】v8::internal::Builtin_JsonParse

3【解析器json-parser.cc】v8::internal::JsonParser<true>::ParseJson

4【词法分析json-parser.cc】v8::internal::JsonParser<true>::ParseJsonValue

5【语法分析json-parser.cc】v8::internal::JsonParser<true>::ParseJsonObject

小结:通过火焰图我们能够清晰的看到函数的调用栈,并能够找到哪些函数是耗时较多的

JSON序列化流程相似相似,感兴趣的同学可以看一下V8的json-stringifier.cc和对应的.h文件

三、CPU性能分析的另一种可视化dot图

3.1 需要gprof2dot脚本

工程地址:https://github.com/jrfonseca/gprof2dot.git

3.2 基于perf.data文件转换成dot文件

$ perf script -i perf.data.pid | python gprof2dot.py –f perf –e 1 –o xxx.dot

3.3 基于perf.data文件转换成dot文件

$ dot –Tsvg xxx.dot –o xxx.svg

在linux物理机的尝试:

下载到PC磁盘,打开即可:

附录

https://zhuanlan.zhihu.com/p/27147421

https://www.zhihu.com/question/24640264

http://blog.12.rs/notes/V8-0.2.5-JIT/

https://github.com/zfengzhen/Blog/blob/master/article/hold%E4%BD%8F%E4%BD%A0%E7%9A%84%E5%90%8E%E5%8F%B0%E7%A8%8B%E5%BA%8F.md

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot-06 员工管理系统
当然,你也可以在之后添加数据的时候,每次在date对应位置写 new Date();
张小驰出没
2021/12/06
1.4K0
SpringBoot-06 员工管理系统
springboot开发之显示员工信息
在entities包中:有Employee.java、Department.java
西西嘛呦
2020/08/26
2.8K0
springboot开发之显示员工信息
SpringBoot项目|手把手快速搭建员工管理系统(附源码)
静态资源链接:https://blog.csdn.net/qq_58233406/article/details/126838809
啵啵鱼
2022/11/23
1.4K0
SpringBoot项目|手把手快速搭建员工管理系统(附源码)
springBoot——Web开发简介【七】
1. 所有 /webjars/ ,都去 classpath:/META-INF/resources/webjars/ 找资源** webjars:以jar包的方式引入静态资源 http://www.webjars.org/
思索
2024/08/16
920
springBoot——Web开发简介【七】
Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part C)
在templates目录下增加employee文件夹,将list.html页面放入该文件夹下。在controller包中新建EmployeeController,增加list方法来获取Employee列表,然后返回list.html页面
RiemannHypothesis
2022/09/26
8980
Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part C)
SpringBoot项目复盘
如果后端数据判断显示为null或者密码错误。通过上述的语法就可以实现将数据回显出来,而不是一开始就显示数据
用户11097514
2024/05/30
1370
SpringBoot项目复盘
Spring Boot 实现员工信息管理demo
在自定义MVC配置中重写一个 addViewControllers ,用来添加一些基本的视图控制器
LCyee
2020/08/05
1.6K0
Spring Boot 实现员工信息管理demo
Spring boot 从0到0.1 part(1)
这里需要注意一点,去修改Spring boot版本,使其小于3.0.5(如果其他配置与我前面配置一致的话),否则会报错
用户9691112
2023/05/18
7100
Spring boot 从0到0.1 part(1)
springboot开发之添加员工
点击新增跳转到添加员工界面,输入相关信息,注意,springboot默认使用的日期格式是:yyyy/MM/dd,即以“/” 进行分隔。点击添加:
西西嘛呦
2020/08/26
7770
springboot开发之添加员工
SpringBoot 笔记 ( 四 ):web 开发
SpringBoot 笔记 (四): web 开发 1、SpringBoot对静态资源的映射规则 @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false) public class ResourceProperties implements ResourceLoaderAware { //静态资源的路径 private static final String[] CLASSPATH_RESOURCE
lwen
2018/04/16
1.9K0
springboot-web开发基础
2.SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
Java开发者之家
2021/06/17
6560
手把手教你基于【SpringBoot+MyBatis】实现员工管理系统‍【附完整源码】
近期在学习springboot框架相关的内容,相比于SSM,SpringBoot最大的特点就是集成了Spring和SpringMVC,让之前繁琐的配置工作变得更加简洁,同时对于业务逻辑层的处理也更加的友好,
灰小猿
2021/09/08
2.4K1
Spring Boot笔记
–jdk1.8:Spring Boot 推荐jdk1.7及以上;java version “1.8.0_112”
瑞新
2020/07/08
1.2K0
基于maven+ssm的增删改查之添加员工实现
具体流程:我们在index.jsp在中,点击新增按钮,弹出添加员工信息模态框,同时,我们发送ajax请求从数据库中获取部门信息,新增时可以选择部门。输入完毕信息后,在发送请求完成保存操作。
西西嘛呦
2020/08/26
5440
基于maven+ssm的增删改查之添加员工实现
搭建SpringBoot项目问题汇总
大概意思是:日期在转换时 格式错误 String类型无法转换成Util.Date类型
啵啵鱼
2022/11/23
3.4K0
搭建SpringBoot项目问题汇总
SpringBoot之Web开发
测试:localhost:8080/webjars/jquery/3.3.1/dist/jquery.js
OY
2022/03/12
1K0
SpringBoot之Web开发
springboot开发之实现登录功能
2、在com.gong.springbootcurd.controller下新建LoginController.java
西西嘛呦
2020/08/26
6990
springboot开发之实现登录功能
springboot开发之引入资源并实现跳转到登录界面
我们可以在External Libraries下找相应的jar,并查看里面的目录结构:比如
西西嘛呦
2020/08/26
6540
springboot开发之引入资源并实现跳转到登录界面
SpringBoot入门建站全系列(八)集成模板引擎(thymeleaf)渲染页面
本文不讲前后端分离,先讲下模板引擎,Springboot支持很多模板引擎,thymeleaf算是比较好用的一种。
品茗IT
2019/08/09
2K0
SSM整合案例
解释jdbcUrl后面的参数useUnicode Mysql jdbc URL连接参数useSSL、serverTimezone 相关问题
大忽悠爱学习
2021/11/15
4.2K0
推荐阅读
相关推荐
SpringBoot-06 员工管理系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验