首页 > 编程语言 >Nodejs APM监控实战分享

Nodejs APM监控实战分享

时间:2023-12-06 17:37:12浏览次数:77  
标签:实战 heapSnapshot Nodejs space 内存大小 gc 内存 APM v8

如何对线上的 nodejs 做监控,了解相关的 GC、内存使用情况、性能,如何更好的了解相关的指标,我们需要做一个采集线上数据的方案,但是又不希望侵入性太强 ,首先收集的指标。

内存相关指标说明

堆内存

  • rss:常驻内存,node 进程分配的总内存大小
  • external:v8 管理的 C++所占用的内存大小
  • arrayBuffers:分配给 ArrayBuffer 的内存大小
  • heapTotal:v8 申请的堆内存大小
  • heapUsed:v8 已使用的堆内存大小

堆内存详情

  • ready_only_space:只读空间
  • old_space:老生代空间,用来存放 New Space 晋升的对象
  • code_space: 存放 v8 JIT 编译后的可执行代码
  • map_space::存放 Object 指向的隐藏类的指针对象,隐藏类指针是 v8 根据运行时记录下的对象布局结构,用于快速访问对象成员
  • large_object_space:用于存放大于 1MB 而无法分配到页的对象
  • code_large_object_space:代码大对象空间
  • new_large_object_space:新生代大对象空间
  • new_space:新生代空间,用来存放一些生命周期比较短的对象数据

其他

  • number_of_native_contextsnative_context 的值是当前活动的顶级上下文的数量。该数字随着时间的推移而增加表明存在内存泄漏。
  • number_of_detached_contextsdetached_context 的值是已分离但尚未进行垃圾收集的上下文的数量。该数字非零表示存在潜在的内存泄漏。
  • heap_size_limit: 就是老生代可以使用的最大内存

GC 监控

  • gc_ts: 1700642047578587,GC 发生的时间,精度可能需要提高到 ms 级别,而不是 second 级别
  • gcScavengeCount: 23, 清除数量, V8 新生代内存中垃圾回收使用 Scavenge 算法。
  • gcScavengeTime: 33933875, 清除耗时 ns,1ns = 十亿分之一秒,1 纳秒(ns)等于 0.000001 毫秒(ms)
  • gcMarkSweepCompactCount: 3,gc 标记扫描压缩计数
  • gcMarkSweepCompactTime: 19564916, gc 标记扫描压缩时间
  • gcIncrementalMarkingCount: 6, gc 增量标记计数
  • gcIncrementalMarkingTime: 2438334, gc 增量标记时间
  • gcProcessWeakCallbacksCount: 3, gc 进程弱回调计数
  • gcProcessWeakCallbacksTime: 24542, gc 进程弱回调时间
  • gc_time: 3474250 gc 时间

性能快照v8 Profile 使用

1、访问 router,生成 main.cpuprofile文件

2、wget ${STATIC_PATH}/main.cpuprofile 获取线上 .cpuprofile 文件,然后基于 vscode 进行性能分析,Flame Chart Visualizer for JavaScript Profiles,下载 vscode 插件可以直接生成火焰图

注意 :请确保 baseRouter 在 nginx 配置指向当前的服务

示例

内存快照 heapSnapshot 使用

1、访问 router,生成 heapSnapshot 文件

2、wget ${STATIC_PATH}/main.heapSnapshot 获取线上 .heapSnapshot 文件,然后使用 Chrome Memory 功能,加载生成的文件

注意 :

1、请确保 baseRouter 在 nginx 配置指向当前的服务

2、等到服务人少的时候进行收集文件,因为生成 heapSnapshot 可能比较耗时,文件可能会比较大,超出系统存储上线(特别是本身申请的内存就比较小的服务,可能需要手动清理生成的 heapSnapshot 文件)

npm 包:@pvjs/nodejs-monitor

更多详情 GitHub - yiyi17/nodejs-monitor: nodejs-monitor 监控

材料参考

Nodejs 调试指南
Node.js 中扩展内存那些事
v8.getHeapStatistics()
nodejs 内存监控 1-监控方案
一文了解 Node.js 性能监控
NodeJs 中内存机制
《深入浅出 Node.js》-内存控制
node-v8 堆内存分析
heap_size_limit 默认是总系统内存的一半 一个 node 诊断的仓库
v8-profiler-node8 生成 json 后,使用 speedscope 加载解析生成火焰图
alinode 性能监控

标签:实战,heapSnapshot,Nodejs,space,内存大小,gc,内存,APM,v8
From: https://www.cnblogs.com/yiyi17/p/17880008.html

相关文章

  • 机器学习-逻辑回归:从技术原理到案例实战
    在本篇文章中,我们对逻辑回归这一经典的机器学习算法进行了全面而深入的探讨。从基础概念、数学原理,到使用Python和PyTorch进行的实战应用,本文旨在从多个角度展示逻辑回归的内在机制和实用性。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团......
  • KubeKey 升级 KubeSphere 和 Kubernetes 补丁版本实战指南
    作者:运维有术前言知识点定级:入门级KubeKey如何升级KubeSphere补丁版本KubeKey如何升级Kubernetes补丁版本KubeSphere和Kubernetes升级准备及验证KubeKey升级KubeSphere和Kubernetes的常见问题实战服务器配置(架构1:1复刻小规模生产环境,配置略有不同)......
  • FX2023全新版-Go开发工程师-从基础到项目实战再到重构zxit666+尾缀
    FX2023全新版-Go开发工程师-从基础到项目实战再到重构zxit666+尾缀Go是一种高效、牢靠和简约的编程言语,它是由Google开发的。下面是运用Go言语编写的示例代码,用于完成一个简单的Web效劳器:这段代码创立了一个简单的Web效劳器,它将返回"Hello,World!"到一切恳求的客户端。首先,我们导......
  • Systemd 入门教程:实战篇
    一、开机启动对于那些支持Systemd的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。$sudosystemctlenablehttpd上面的命令相当于在/etc/systemd/system目录添加一个符号链接,指......
  • PostgreSQL: select for update实战
    场景需要获取用户申请的流水号,其值记录在number_of_form表中。但当多个用户同时申请时,会出现单号重复的情况,现在需要保证单据号码的一致性解决方案以我搜寻来看,大体有两种做法。悲观锁:总是假设最坏的情况,也就是每次拿数据的时候,都认为别人会修改,所以每次拿数据,都会对符合条......
  • JeecgBoot 框架升级至 Spring Boot3 的实战步骤
    JeecgBoot框架升级SpringBoot3.1.5步骤JEECG官方推出SpringBoot3分支:https://github.com/jeecgboot/jeecg-boot/tree/springboot3本次更新由于属于破坏式更新,有几个生态内的组件,无法进行找到平替或无法升级,目前尚不完善,部分功能选择直接注释的方式,以下为功能列表Online......
  • 【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行机制,RTOS Tr
    从源码的角度来看,OS内核源码就是通过各种链表组装起来的,FreeRTOS就是下面几个链表组成的。FreeRTOS的调度,任务切换就是倒腾这几个链表。而其它的几款OS是一个链表就一撸到底了,FreeRTOS是搞了好几个。所以视频里面就重点介绍下这个,其它的支持的也做个拓展说明。搞清楚这几个链表也......
  • 机器学习-学习率:从理论到实战,探索学习率的调整策略
    本文全面深入地探讨了机器学习和深度学习中的学习率概念,以及其在模型训练和优化中的关键作用。文章从学习率的基础理论出发,详细介绍了多种高级调整策略,并通过Python和PyTorch代码示例提供了实战经验。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发......
  • Nginx缓存入门实战(01)-深入实践ETag机制
    1RFC7232指纹1.1响应头部ETag=entity-tag,仅对同一个URL下的比较有意义。为啥需要这玩意?因为HTTP协议本质就是个KV,K=URL,V=body。因为URL并没有变,但我的V是会变的!所以需要对V生成一个摘要!1.2请求头部If-Match="*"/1#entity-tag。用于并发修改资源(POST/PUT/......
  • Java开发者的Python快速实战指南:探索向量数据库之图像相似搜索-文字版
    首先,我要向大家道个歉。原本我计划今天向大家展示如何将图片和视频等形式转换为向量并存储在向量数据库中,但是当我查看文档时才发现,腾讯的向量数据库尚未完全开发完成。因此,今天我将用文本形式来演示相似图片搜索。如果您对腾讯的产品动态不太了解,可以查看官方网址:https://cloud.t......