博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你所未知的3种 Node.js 代码优化方式
阅读量:5919 次
发布时间:2019-06-19

本文共 3174 字,大约阅读时间需要 10 分钟。

hot3.png

Node.js 程序的运行可能会受 CPU 或输入输出操作的限制而十分缓慢。从 CPU 角度看,程序运行缓慢的典型原因之一就是未经优化的「热点路径」(一段经常被访问的代码)。从输入输出角度看,程序运行速度的局限可能是受底层操作系统影响,也可能是出于 Node 本身的故障。更或者,一个运行缓慢的程序可能跟 Node 本身没有任何关系,问题在于外部资源,比如数据库查询或是 API 调用缓慢,未经过优化处理。

在本文中,我们将重点识别并优化代码库中会导致 CPU 繁重运行的操作。同时,将探讨生产应用的配置文件,分析并作出可提高运作效率的改动。

由于 Node 的单线程性质,避免繁重的 CPU 负载对服务器来说尤为重要。因为在 CPU 上消耗的时间会占用响应其他请求的时间。如果你注意到自己的应用响应速度缓慢,而且 CPU 在这个过程中始终占用率较高,分析你的程序有助于找出瓶颈,并且使程序恢复快速运行的状态。

##分析应用

复制生产环境中出现的缓慢程序问题非常难解决,而且十分耗时。值得庆幸的是,你不需要亲自做这些了。你可以在生产服务器上收集配置文件数据,然后离线分析。下面让我们来看一下几种分析方法。

##1、使用内核级工具

首先,你可以使用内核级工具,比如 DTrace(Solaris, BSD),perf(Linux),或者 XPerf(Windows),从运行的进程中收集堆栈跟踪信息,然后生成。内核级分析对运行中的进程影响最小。火焰图是根据调用栈生成的支持放大缩小查看的向量图形。来自 Netflix 公司的 Yunong Xiao 针对 Linux 系统中 perf,发表过超赞的和,帮助你加深对该技术的了解。如果你想在生产程序中保持高吞吐量,可以参考使用这种方法。

enter image description here

###2、使用 V8 分析器

另一个选项是直接使用 。这种方式会与程序共享进程,因此它会影响程序性能。基于这个原因,请只在你遇到此类问题时运行 V8 分析器来捕获相关输出。该方法的好处是:你可以使用 Chrome 的所有分析工具,结合其输出结果(包括火焰图),对程序进行调查。

请运行以下代码来测试你的程序:

npm install v8-profiler --save

之后,在你的程序中添加以下代码:

const profiler = require('v8-profiler')const fs = require('fs')var profilerRunning = falsefunction toggleProfiling () {  if (profilerRunning) {    const profile = profiler.stopProfiling()    console.log('stopped profiling')    profile.export()      .pipe(fs.createWriteStream('./myapp-'+Date.now()+'.cpuprofile'))      .once('error',  profiler.deleteAllProfiles)      .once('finish', profiler.deleteAllProfiles)    profilerRunning = false    return  }  profiler.startProfiling()  profilerRunning = true  console.log('started profiling')}process.on('SIGUSR2', toggleProfiling)

只要你发送 SIGUSR2 信号到此进程,它就会开始分析。再次发送一个 SIGUSR2 信号可以停止分析(代码如下)。

kill -SIGUSR2 [pid]

该进程的分析结果将被写入到当前工作路径的文件中(请确保该路径可被写入)。由于这是一个可编程接口,你可以随意触发它(使用 web endpoint,IPC,等等)。如果你对程序在何时变得缓慢有预感,你可以在任一时期触发该接口。建立自动触发对避免持续监看程序是非常有用的,但是它要求你对捕获时间以及捕获时长有预测性认知。

一旦已经收集好配置文件数据,将它到Chrome开发工具中,开始吧!

enter image description here

##3、使用进程管理器

尽管直接使用 V8 分析器是非常有效且可定制的,但是它会进入你的代码库,并且会向项目添加又一项你可能不想要的依赖性条件。一种替代方式就是使用进程管理器,它可以在你需要分析时,用各种工具将你的程序包装起来。一种可选的工具是来自 StrongLoop 的 SLC 命令行工具。

首先,运行npm install strongloop –g,然后运行以下代码:

slc start [/path/to/app]

上述代码会在进程管理器中启动你的程序,你可以按需提取 CPU 分析数据。要想验证并获取应用程序 id,请运行:

slc ctl

你将得到与下面类似的运行结果:

Service ID: 1Service Name: my-sluggish-appEnvironment variables:    Name      Value    NODE_ENV  productionInstances:    Version  Agent version  Debugger version  Cluster size  Driver metadata     5.0.1       2.0.2            1.0.0             1             N/AProcesses:        ID      PID   WID  Listening Ports  Tracking objects?  CPU profiling?  Tracing?  Debugging?    1.1.61022  61022   0    1.1.61023  61023   1     0.0.0.0:3000

定位应用的进程 id。在此例中,id 为1.1.61023。现在我们就能在任意时间开始分析了,运行如下代码即可:

slc ctl cpu-start 1.1.61023

当我们觉得已经捕获到了迟滞行为,就可以运行以下代码来停止分析器:

slc ctl cpu-stop 1.1.61023

以下代码将写文件至硬盘:

CPU profile written to `node.1.1.61023.cpuprofile`, load into Chrome Dev Tools

好啦,就是这样。你可以像在 V8 分析器里那样把文件加载到 Chrome 里面进一步分析。

##作出正确决定

在本文中,笔者展示了三种在 Node 中捕获生产环境下 CPU 使用量的方式。那么,你应该选用哪一种呢?下面是一些帮助你缩小决策范围的想法:

  1. 我需要分析很长一段时间:使用内核级工具。
  2. 我想用 Chrome 开发工具:使用 V8 分析器或者过程管理器。
  3. 我想捕获应用中的特定行为:使用 V8 分析器。
  4. 我不想影响到程序性能:使用内核级程序
  5. 我希望我不用挨个测试文件来获取程序分析信息:使用过程管理器。

OneAPM 助您轻松锁定 ,通过强大的 Trace 记录逐层分析,直至锁定行级问题代码。以用户角度展示系统响应速度,以地域和浏览器维度统计用户使用情况。想阅读更多技术文章,请访问 。 本文转自

原文地址:

转载于:https://my.oschina.net/oneapmofficial/blog/619431

你可能感兴趣的文章
第13代PowerEdge强劲升级 五大独有技术是什么?
查看>>
Facebook新地图增加灾难救援功能!
查看>>
日本电气公司1000万美元建大数据分析中心
查看>>
Ovum点评微信小程序:或对应用商店产生破坏性作用
查看>>
《Arduino开发实战指南:LabVIEW卷》——1.2 Arduino的硬件组成
查看>>
《2040大预言:高科技引擎与社会新秩序》——2.11 坐二手无人车的体力工人
查看>>
阿里研究院启动2017年度淘宝村辅助认证活动(附表格下载)
查看>>
《 FreeSWITCH权威指南》——1.7 VoIP
查看>>
消除障碍 加速推进T-SDN产业发展
查看>>
紧紧跟随NSX认证的步伐
查看>>
“大数据”要这样用才赚钱!
查看>>
大数据:如何将信息转化为洞察力?
查看>>
安防行业做大做强 市场需求与行业技术双向驱动
查看>>
《液晶显示器和液晶电视维修核心教程》——导读
查看>>
《NX-OS与Cisco Nexus交换技术:下一代数据中心架构(第2版)》一2.8 Cisco FabricPath...
查看>>
《贝叶斯思维:统计建模的Python学习法》——2.6 M&M豆问题
查看>>
《Sony Vegas Pro 12标准教程》——导读
查看>>
2017 会成为 PaaS 模式的终结年吗?
查看>>
大数据揭秘:在阿里巴巴待满五年的秘诀竟然是……
查看>>
《Excel高手捷径:一招鲜,吃遍天》一第4招 怎样在多张工作表做相同的操作——创建工作组...
查看>>