您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

你所未知的3种Node.js代码优化方式_node.js

2024/4/24 21:04:19发布4次查看
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,发表过超赞的演讲和推文,帮助你加深对该技术的了解。如果你想在生产程序中保持高吞吐量,可以参考使用这种方法。
2、
2、使用 v8 分析器
另一个选项是直接使用 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开发工具中,开始分析吧!
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 使用量的方式。那么,你应该选用哪一种呢?下面是一些帮助你缩小决策范围的想法:
我需要分析很长一段时间:使用内核级工具。 我想用 chrome 开发工具:使用 v8 分析器或者过程管理器。 我想捕获应用中的特定行为:使用 v8 分析器。 我不想影响到程序性能:使用内核级程序 我希望我不用挨个测试文件来获取程序分析信息:使用过程管理器以上就是本文的全部内容,3种node.js代码优化方式,希望大家可以熟练掌握。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录