当前位置: 首页 > 后端技术 > Node.js

Node.js性能分析工具alinode安装使用介绍

时间:2023-04-03 12:33:22 Node.js

long-windalinode基本上是免费开源的,不仅可以在ECS上运行,理论上在任何地方都可以应用(只要长得像样).本文将介绍如何使用alinode。本文首先介绍Node.js平台性能问题分析中包含的一些内容,然后在第二部分介绍alinode的使用方法。性能问题分析定位Node.js的性能问题。过程分析。进程分析一般包括内存、CPU、EventLoop、ActiveHandlers等的分析,对于开发者来说,主要有三项工作:第一,应用压力测试。通常我们要分析的是应用实际生产运行中的一种情况,这种情况可以通过我们自己的压测来模拟。第二,获取数据。也就是获取我们的CPU状态,内存状态等信息。这个一般是通过runtime或者runtime底层提供的一些API来获取的。比如Node的语言执行引擎V8就提供了cpuprofile的能力。第三,分析数据。拿到数据后,我们需要对数据进行分析,这样才能快速定位问题。一般得到的数据可读性比较差,所以这一步通常是对数据进行可视化。比如cpuprofile可以通过工具转换成火焰图。或者通过v8-analysis工具库等其他第三方工具提供分析。有几种常用的压力测试应用程序的工具,例如Apacheab、wrk和Node.js编写的autocannon。这里就不详细说用法了。通过压力测试工具,我们可以量化站点的性能指标,排查性能问题。在此过程中向我们提供证据。一般我们的性能指标需要达到一定的吞吐量req/sec,单次请求的耗时要在预期的范围内。否则,耗时过高会影响用户体验,吞吐量过低会导致部分用户无法访问。通常需要一些时间来观察CPUcpu进行数据采集,以获取其函数执行栈的状态。比如等待alinodedump也需要3分钟。方法一:直接使用v8底层暴露给Node的API。我们只需要在启动node应用的时候传入node--profapp.js即可。Node.js从4.4.0版本开始就有一个内置的分析器。使用--prof命令选项运行应用程序将在当前目录中生成一个性能日志文件。上面的命令会在项目的根目录下生成`isolate-xxxxxxx-v8.log`格式的文件。无法直接分析此日志文件。通常,可视化工具需要一个json文件。因此,需要对日志进行预处理。我们可以这样对日志进行预处理:node--prof-process--preprocessisolate-xxxxxxxxxx-v8.log>v8.json这样就可以转成json字符串文件了。方法二:使用npm包v8-profile如下:profiler.startProfiling('',true);setTimeout(function(){varprofile=profiler.stopProfiling('');profile.export().pipe(fs.createWriteStream(`cpuprofile-${Date.now()}.cpuprofile`)).on('finish',()=>profile.delete())},1000);内存方式一:heapdump这个模块可以用来收集内存数据。这个包需要打入代码,在代码中被引用后,可以通过它的API进行dump。或者向外部进程发送kill-USR2信号。方法二:v8-profile。这也是一个需要侵入节点代码的模块。通过该模块可以得到heapdump和cpuprofile数据分析。无非是通过一些方便查看的数据展示工具或者定位工具来帮助我们更好的展示数据。例如,可以根据功能的热度显示cpuprofile。方法一:使用v8本身提供的接口分析工具。gitclonehttps://github.com/v8/v8.git打开v8/tools/profview/index.html文件,这是一个静态界面。在界面中央选择新生成的v8.json文件。文件解析成功后,界面会显示显示函数调用的时间信息。方法二:使用chromedevTools具体参考:NodePerformanceTroubleshootingGuide这里就不赘述了。chromedevtool提供了heavvvy和chart的多种视图,还是很不错的。方法三:使用v8-analysis工具。v8-analysis模块可以分析v8-profiler和heapdump等工具输出的cpu&heap-memory日志。可提供:v8引擎反优化或优化失败函数红色显示及优化失败原因显示函数执行时间比预期长,红色标记显示当前项目中可疑的内存泄漏点。显示方法四:cpuprofile,也可以自己做一个火焰图(这个有点考验动手能力)。使用工具FlameGraph。使用alinode通过上面的简单介绍,我们可以发现性能分析有两个痛点。一种是采集数据,需要侵入代码,手动执行相应的指令。另一个是:分析工具五花八门,就算用chromedevtool,也得经历下载dump数据再导入的痛苦过程。alinode阿里Node.js性能平台集成了解决上述部分问题的过程,提供更易用的体验,解决了大部分痛点。而且它是免费和开源的(基本上)。Alinode通过错误日志、操作系统指标(cpu/内存/磁盘/IO)、慢日志、异常等监控节点应用,并提供coredump、cpuProfile、heamdump等工具,提供在线web数据可视化配置文件分析功能。总的来说,alinode的几个工具都提供了本文开头提到的性能分析相关的能力,即数据抽取和数据分析能力(当然还有额外的监控通知,漂亮的UI,实时数据展示).总体架构alinode的设计架构如下:?其实看技术细节就知道了。alinode包含了这三部分的组件。从下往上说吧:alinode修改后的Noderuntime。这个节点基本上是一个native节点,但是阿里在里面加了一个dumpdataswitch,可以远程采集性能数据。alinode版本和native版本的对应关系可以点这里。(大佬们自己用的时候不用管什么后门,因为只是增加了一些性能分析能力,开源在路上)agenthub。这是安装在应用程序服务器上的代理。它负责与云端alinode服务进行通信。云管理系统通过这个代理发送命令,机器上报数据。因此,它是节点进程与云管理平台之间的桥梁。阿里云服务。其实就是一个管理平台。云端会有相应的服务与机器上的agenthub建立websocket通信,用于发送命令或收集信息。您可以通过云管理平台的Web界面集中处理所有性能分析任务。使用我在本地macbook上对站点进行性能分析的步骤,让我们看看使用alinode的基本步骤,这对我们学习别人的设计和思路也很有帮助。除了看这里的步骤,还可以参考官方的帮助文档作为辅助。从上面的分析可以看出,我们在这台机器上要做的其实就是安装Alinode修改节点运行时(alinode)和agenthub。下面是具体步骤:安装tnvm。我们知道nvm是一个节点版本管理器。淘宝这里有一个tnvm来管理anlinode的版本。所以我们先安装tnvm,再通过tnvm安装alinode。wget-O-https://raw.githubusercontent.com/aliyun-node/tnvm/master/install.sh|bash执行安装脚本后,我们执行source~/.bash_profile,#Yoursmaybe~/.bash_rc此时tnvm就安装成功了。安装alinode,执行tvnm命令查看alinoderemote的版本tnvmls-remotealinode选择一个alinode版本安装tnvminstallalinode-vx.y.z#4.8.0->10.16.0比如我安装的是v4.8.0,对应nodev10.16.0tnvminstallalinode-v4.8.0接下来,别忘了使用你安装的版本。tnvmusealinode-v4.8.0#不要忘记这句话。此时执行whichnode命令,会发现tnvm管理的alinode已经被使用:/Users/cuiyongjian/.tnvm/versions/alinode/v4.8.0/bin/nodeagenthub安装agenthub只是一个npm命令行工具,通过如下命令安装即可,非常简单:npminstall@alicloud/agenthub-gagenthub需要知道云端的服务ID,才能收发信息。所以它需要配置才能启动,我们在任何地方新建一个config.json1{2"appid":"80535",3"secret":"3c4d************5",//当你在aliyun上新建一个节点监控实例时,会得到一个appid和secret4"logdir":"/tmp"5}然后启动agenthub:DEBUG=*agenthubstartconfig.json注意:这里的/tmp是指到agenthub从中获取转储日志文件的目录。所以这个目录必须和你启动node应用时指定的日志输出目录一致,否则你的agenthub将无法上传dump信息。运行node应用程序启动我们的应用程序:NODE_LOG_DIR=/tmpENABLE_NODE_LOG=YESnodeapp.jsNODE_LOG_DIR=/tmpENABLE_NODE_LOG=YESpm2startapp.js比如我的实际项目:sudoNODE_LOG_DIR=/tmpENABLE_NODE_LOG=YESPORT=80MODE=ssrNODE_ENV=productionCGI_ENV=onlinenode./backend/app.js必须指定这两个LOG环境变量。一是上面说的日志输出目录,二是是否开启日志功能。如果不这样配置,肯定无法进行remotedump。一些小问题。如果你是egg项目,就不需要自己启动agenthub了。egg集成插件中已经内置了agent,直接使用插件即可。我不会在这里详细介绍。安装完alinode运行时,不要忘记使用文档中的tnvm。此外,有时如果您打开一个新终端,您的PATH环境变量将被恢复。这时候可以再次执行source~/.bash_profile,优先使用tnvm的节点路径。在管理平台查看数据或执行dump命令时,可能会报错。这里提供几个排查思路:agenthub需要和阿里云管理平台建立连接,但是我们公司的网络没有agent是连接不上的。在这里你可以找到一种方法来改变agenthub的代理。我这里采用了最简单的方法,直接使用staffWifi。.你可以tail-f~/.agenthub.log查看本地代理日志。例如,在日志中,您会看到您的网络连接出现问题或日志目录配置错误;启动应用程序时不要忘记两个LOG环境变量。在云管理界面,打开node.console.aliyun.com,进入管理控制台首页。首先看到的是:?这里会展示例子。所谓实例就是你的一台机器。在这里,您可以点击首页进入一个实例,您还可以配置与该实例相关的告警(例如配置错误日志、内存等阈值的告警),配置团队成员。点击实例首页,我们可以看到系统整体资源状态的仪表盘:?左边的链接可以看到:当前实例有几个功能:进程信息查看与管理、系统信息、异常信息、慢日志信息、依赖信息。点击流程选项,我们可以找到我们的流程信息。我们在界面右上角的“运行进程”中选择我们要分析的节点进程,然后就可以对其进行各种dump数据和分析操作了。比如我们选中一个节点进程,我们可以查看它的qps、cpu使用率等基本信息:?点击进程面板右下角的“数据趋势”按钮,还可以查看其变化曲线各项指标按时间线排列,便于发现问题。?系统监控数据面板可以看到机器的整体性能:?慢日志面板会根据请求的耗时情况,给出超出预期的耗时,并对耗时进行排序和处理从高到低显示在面板上,让您了解系统最慢的耗时情况。这里没有截图。流程面板右下角的“抓取性能数据”是我们分析性能的工具。这里有heapDump、cpuprofile、heaptimeline(可以看到heap的变化)、gctrace、诊断报告。更多详细信息请参考文档转储,然后点击页面左侧的文件列表菜单,来到文件面板,查看文件生成进度,生成完成后点击转储,点击分析转储完成后。?在线分析当我们点击一??个已经dump出来的CPUprofile文件时,管理平台会打开一个新的页面显示火焰图:浏览器风格分析工具。厉害了:?GcTrace分析:?一些你不知道的Node.js性能优化知识。读完之后,等级直线上升。node项目压测与性能分析阿里云Node.js应用故障排查手册alinodeppt:alinode-基于Node.js运行时的应用性能管理解决方案你所不知道的Node.js性能优化