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.9K30
代码可运行
举报
文章被收录于专栏:郑清江的专栏郑清江的专栏
运行总次数:0
代码可运行

服务稳定性到一定程度之后,都会开始经历一段精细化运营的过程,从成本意识角度来说也是成立的。作为前端出身的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 删除。

评论
登录后参与评论
3 条评论
热度
最新
良心博主,分享得很详细
良心博主,分享得很详细
回复回复点赞举报
感谢楼主的分享!
感谢楼主的分享!
回复回复点赞举报
很实用,但是还得针对实际情况选择性的优化吧!
很实用,但是还得针对实际情况选择性的优化吧!
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
火焰图:全局视野的Linux性能剖析
日常的工作中,会收到一堆CPU使用率过高的告警邮件,遇到某台服务的CPU被占满了,这时候我们就要去查看是什么进程将服务器的CPU资源占用满了。通常我们会通过top或者htop来快速的查看占据CPU最高的那个进程,如下图:
公众号: 云原生生态圈
2020/07/07
2.5K0
火焰图:全局视野的Linux性能剖析
【Node.js丨主题周】理解perf 与火焰图
火焰图(Flame Graph)看起来就像一团跳动的火焰,因此得名,它可以将 CPU 的使用情况可视化,使我们直观地了解到程序的性能瓶颈。我们通常要结合操作系统的性能分析工具(Profiling Tracer)使用火焰图,常见的操作系统的性能分析工具如下。
博文视点Broadview
2020/06/12
2.1K0
【Node.js丨主题周】理解perf 与火焰图
perf火炬图
让我们从 perf 命令(performance 的缩写)讲起, 它是 Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈(stack)
233333
2022/05/10
7060
perf火炬图
Linux性能优化利器,perf工具介绍
perf是Linux内核内置的性能分析工具,由Ingo Molnar等内核开发者维护。该工具自2.6.31内核版本正式引入,其发展历程体现了Linux性能观测技术的演进:
通信行业搬砖工
2025/04/04
1530
Linux性能优化利器,perf工具介绍
盘点内核中常见的CPU性能卡点
正式开始今天的分享。我们的应用程序都是运行在各种语言的运行时、操作系统内核、以及 CPU 等硬件之上的。大家平时一般都是使用Go、Java等语言进行开发。但这些语言的下面是由运行时、内核、硬件等多层支撑起来的。
开发内功修炼
2023/09/01
3120
盘点内核中常见的CPU性能卡点
Linux性能分析工具与图形化方法
在项目开发中,经常会遇到程序启动时间过长、CPU使用率过高等问题,这个时候需要依靠性能分析工具来定位性能的消耗点。
Techeek
2018/03/16
8.9K10
Linux性能分析工具与图形化方法
perf火焰图 wiki
火焰图 wiki 火焰图的每个框代表一个栈里的一个函数,燃烧在火苗尖部的就是CPU正在执行的函数 纵轴代表调用栈的深度(栈桢数),火焰顶端显示正在运行的函数,这之下都是调用者。在下面的函数是上面函数的
changan
2020/11/19
2.5K0
perf火焰图 wiki
观测 CPU
通常在分析性能问题时,我们会用 `top , sar , perf` 来观测 CPU 的使用情况;多数据情况下是观测别人的程序。
初代庄主
2022/05/17
3800
观测 CPU
C++ 之 perf+火焰图分析与调试
在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
芯动大师
2024/09/10
1710
C++ 之 perf+火焰图分析与调试
差分火焰图,让你的代码优化验证事半功倍
一般来说,我们将这种火焰图称为on-cpu火焰图,可以用来记录CPU上运行的程序的占比情况。除此之外,还有多种其他种类的火焰图,如:
程栩的性能优化笔记
2023/11/01
8180
差分火焰图,让你的代码优化验证事半功倍
使用 perf 和 Flame Graphs 分析 MySQL
性能分析中的一项常见任务是确定哪些代码段消耗的 CPU 时间最多。这通常需要对堆栈跟踪进行剖析。Flame 图形的出现改变了我们对这些剖析进行可视化的方式。它能直观地显示应用程序中占用 CPU 最多的部分。本文将介绍如何使用 perf 生成这些火焰图。
贺春旸的技术博客
2024/06/27
1950
perf + 火焰图分析程序性能
性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果;
叫你不戴帽子
2018/08/04
2.8K0
Flame Graph 火焰图分析 Java 性能
火焰图是分析应用性能问题很好的工具,只是网上的文章都是讲述分析 C, C++ 等语言的,对Java 语言描述甚少,此处记录一下自己使用火焰图分析Java 栈的过程。
Dylan Liu
2019/07/01
1.9K0
线上服务负载异常排查
一般我们会通过各种监控、报警系统,发现和定位问题,关于如何搭建服务监控可以参考之前的文章《Go服务监控搭建入门》。但是呢,一些特殊情况,比如创业初期或者拥有大量技术债的系统,监控可能不够完善。所以今天就来看看这种情况下,如何定位服务负载异常的原因。
用户1093396
2022/03/14
5230
线上服务负载异常排查
LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片
在深入Linux系统的复杂世界中,性能优化始终是SRE关注的热点。最近在拜读国际著名的 LINUX 性能专家 Brendan Gregg 的个人博客和技术书籍。他的工作不仅涵盖了系统性能的监控和分析,还深入探讨了性能问题的根源及其解决方案。通过他的个人博客和技术书籍,我们可以窥见Linux性能优化的精髓,学习到如何利用各种工具和方法来提升系统效率,确保应用的顺畅运行。将会结合 Brendan Gregg博文与个人理解 出一个拜读系列博文。
五分钟学SRE
2024/04/10
7560
LINUX 性能专家 Brendan Gregg博文拜读系列<1>-附九张性能图片
性能分析工具—【perf】使用指南
perf 是Linux的一款性能分析工具,能够进行函数级和指令级的热点查找,可以用来分析程序中热点函数的CPU占用率,从而定位性能瓶颈。
用户9831583
2023/02/27
11.2K0
性能分析工具—【perf】使用指南
性能调优工具-火焰图
工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度。这也是我为什么非常喜欢 shell 的原因,它丰富的命令行工具集加管道特性处理起文本数据集来真的精准而优雅,让人迷醉。
枕边书
2019/07/19
1.6K0
Linux问题故障定位,看这一篇就够了
有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。
十四君
2020/03/13
3.1K0
Linux问题故障定位,看这一篇就够了
掌握运维必备技能--问题故障定位
a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。
用户6543014
2019/10/25
1.2K0
掌握运维必备技能--问题故障定位
四种火焰图,快速定位Off-CPU性能问题
On-CPU性能问题可以借助On-CPU火焰图解决,但是无法了解进程和线程不在CPU上运行所花费的时间。如果有很多的时间花在同步请求上,也会很容易影响性能表现。
程栩的性能优化笔记
2023/11/01
2.4K0
四种火焰图,快速定位Off-CPU性能问题
相关推荐
火焰图:全局视野的Linux性能剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验