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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。