nodejs获取cpu使用率,nodejs性能调优

  nodejs获取cpu使用率,nodejs性能调优

  本文带你了解Node.js的性能指标,希望对你有帮助!

  node.js速度课程简介:进入学习

  对于我们前端工程师来说,掌握Node.js应用开发是我们成为资深/专家的必经之路。另外,Node.js是服务器端语言,我们不仅要能够完成开发任务,还要更加关注服务器性能。[推荐研究:《nodejs 教程》]

  本文介绍了Node.js的基本和性能指标。

  

应用场景

  在介绍NodeJS的性能指标之前,我们先来看看它的应用场景。对于不同的应用场景,需要关注的性能指标是不同的。

  BFF中间层是接口的代理,充当网关层。

  开发工具Gulp和webpack都基于Node.js

  桌面应用程序Electron和Node.js的组合

  SSR服务器渲染

  如果Node.js用于前端SSR,那么CPU和网络将成为主要的性能瓶颈;

  如果使用NodeJS进行数据持久化,I/O和磁盘的占用率会很高;

  在大多数场景下,CPU、内存和网络是Node的主要性能瓶颈。

  

优缺点

   node.js是容错的,性能不是很好。

  node.js的运营数据库不专业。

  Node.js在处理异步io方面很强

  Io密集型,不适合cpu密集型

  

事件循环(libuv)

  此处引用官网的一张图,对事件周期的操作顺序进行简化概述。

  阶段描述

  定时器:此阶段执行已由setTimeout()和setInterval()设置的预定回调函数。待定回调:执行I/O回调被推迟到下一次循环迭代。idle, prepare:仅供内部使用。轮询:检索新的I/O事件;执行与I/O相关的回调(在几乎所有情况下,除了关闭的回调函数,那些由timer和setImmediate()调度的回调函数),其余的cases节点将在适当的时间阻塞在这里。检测:这里执行setimmediate()回调函数。关闭的回调函数:一些关闭的回调函数,比如:socket.on (close ),)

V8 GC机制

  我们知道Node.js是基于Chrome V8引擎的JavaScript运行时环境,同时它是单线程的。

  其中,V8内存分为新一代和老一代:

  新生代:采用空间到空间内存回收的清除算法。

  老生代:以引用标记和碎片整理的形式回收内存。

  如果GC时间过长,js线程会被阻塞,服务性能会受到影响。内存使用不当会导致内存溢出。了解了以上Node.js的基础知识之后,我们再来看看性能指标。

  

性能指标

  我们从系统级和Node.js进程级描述一个性能指标。

  系统层面

  根据服务器级别(物理机、虚拟机、Docker等。),提供了以下监控指标:

  使用内存

  CPU利用率

  系统负载、正在使用/等待进度的进程数量

  系统QPS

  硬性绩效指数

  磁盘使用

  GC统计

  ……

  进程层面

  对于每个Node.js进程,提供了以下监视指示器:

  堆内(总内存和已用内存)和堆外内存统计信息

  堆中每个内存空间的内存统计信息

  垃圾收集(GC)与整个进程运行时间的比率

  QPS

  根据1s,15s,30s,60s的CPU统计

  Libuv句柄,计时器统计

  ……

  

如何获取

  怎样才能得到上面提到的性能指标?

  系统层面

  系统级指标可以通过以下两种方式获得

  1.操作系统模块

  constos=require (OS )的代码示例

  执行结果

  2.top和iostat命令检查内存和硬盘使用情况。

  top[参数]

  Iostat[参数]

  内存使用情况

  //此方法返回Node.js进程的内存使用情况的对象。

  process.memoryUsage()代码示例

  执行结果:

  {

  rss: 4935680,

  heapTotal: 1826816,

  heapUsed: 650472,

  外部:49879

  }复制代码名词解释:

  是rss驻留集的大小以及分配给该进程的物理内存量(作为总分配内存的一部分)。

  通常,当该指示器上升时,可能会发生内存泄漏。

  HeapTotal和heapUsed表示V8的内存使用情况。

  External表示由V8管理并绑定到Javascript的C对象的内存使用情况。

  CPU profile

  一般来说,如果涉及内存泄露,可以抢堆快照。如果CPU异常高,您可以获取CPU配置文件。

  它可以通过以下两种方式获得:

  GC trace

  V8提供了很多启动node.js程序的参数选项,GC log的信息可以通过下面的示例代码获取。

  node - trace_gc执行结果

  可以看出,V8对新旧内存采用了不同的GC程序。

  内存快照

  如果使用node-inspector,快照中会有前端变量干扰。建议使用heapdump保存内存快照,使用devtool查看内存快照。使用heapdump保存内存快照时,只会有Node.js环境中的对象,不会受到干扰。heapdump的使用将在后面介绍。

  

压力测试

  项目上线前,需要进行压力测试,了解是否存在内存泄漏。

  压测工具:ab测试(ApacheBench),自动扫描

  使用ab函数的压力测试结果如下所示。

  上述运行结果可以看到

  我们的QPS:4301.28/秒

  每个请求的平均持续时间:23毫秒

  传输速率:617.47kb/s

  

内存泄漏

   Node.js是Java、PHP等相对专业的后端语言,一些基础构造相对不完善。再加上单线程的特性,在大型应用中很容易造成server或者Node.js进程的性能瓶颈。

  通常有以下三种情况会导致节点内存泄漏:

  node v8本身的内存大小限制:64位系统1.4GB左右,32位系统0.7GB左右。

  程序使用不当:全局变量引用,闭包使用不当,破坏事件监控失败。

  大文件应用:要使用缓冲区操作,缓冲区不占用v8内存。

  那怎么查内存泄露呢?您可以使用以下工具

  

工具使用

  一. heapdump:生成内存快照 + chrome面板分析

  需要注意的是,打印内存快照是一项CPU密集型操作,可能会影响在线业务。

  引入

  const heap dump=require( heap dump )获取

  方法1:kill-usr 2 PID命令

  方法2:调用写快照

  heapdump.writeSnapshot(。/ Date.now()。heap snapshot’);chrome面板分析

  二. alinode

  阿里云还提供了Nodejs应用的性能平台alinode,可以方便全面的为我们收集性能指标数据,同时以可视化图表的形式更加直观。访问alinode可以参考5分钟快速入门。

  以下是部分采集数据图表展示

  一些指标描述

  Memory

  Memory_sys:系统内存使用百分比。Memory_node:所有Node.js进程的内存使用量之和占系统内存的百分比。CPU

  Cpu_sys:系统Cpu使用率百分比。Cpu_node:所有Node.js进程的Cpu使用百分比的总和。Load

  负载:1分钟内的平均负载。

  负载:5分钟内的平均负载。

  负载15:15:15分钟内的平均负载。

  下面是负载的一些参考信息(负载已经归一化,如果是N核CPU,那么对应的负载* N):

  0.7负载1:状态好,新任务能及时处理;Load=1:即将到来的任务需要额外的等待时间来处理,需要关注;5:任务需要等待很长时间,所以需要干预。通常先看load15,再看load1和load5,看是否有下降趋势。短时间内load1大于1,不用担心。如果负荷长时间高,就需要注意了。QPS

  此实例的所有Node.js进程每秒处理的HTTP请求数的总和。

  GC

  Gc_avg:所有Node.js进程的平均垃圾收集时间。Gc_max:每分钟垃圾收集时间最多的Node.js进程的垃圾收集时间比。三. 开源Easy-Monitor

  Enterprise Node.js应用性能监控和在线故障定位解决方案。

  Easy-Monitor是一个轻量级的节点性能监控工具。快速进入

  我们也可以给它一个基础,建立和部署一套自己的内部性能平台。

  

总结

  以上是我对Node.js的性能指标及其获取的简单介绍,更多的是一个包括性能点的整体介绍。然后就可以对各项性能指标做更深入的研究了。希望这篇文章能帮到你,感谢你的阅读。期待再次见到你~

  

参考

   Node.js性能平台

  如何分析Node.js中的内存泄漏

  本文的示例代码

  有关编程的更多信息,请访问:编程入门!以上是快速了解Node.js中性能指标的详细内容,更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: