跳到主要内容

认识

2024年12月25日
柏拉文
越努力,越幸运

一、GC


1.1 nodejs_gc_duration_seconds

nodejs_gc_duration_seconds 记录垃圾回收(GC)的持续时间。

二、ART


ART (Active Request Time),即活跃请求时间。在 Node.js 应用程序中,ART 指标用于表示处理某个请求的时间。具体而言,它衡量的是从接收到请求到处理完成的整个周期所消耗的时间,通常用秒或毫秒为单位。ART 可以帮助识别请求处理中的性能瓶颈。如果 ART 数值较高,说明请求的处理时间较长,可能是由于计算密集型操作、数据库查询、外部服务依赖等原因造成的。通过监控 ART 指标,可以在不同路由和方法级别上查看哪些请求花费的时间较长,从而进行优化,比如增加缓存、优化查询、减少阻塞操作等。

三、QPS


3.1 真实 QPS

QPS (Queries per Second) 是衡量系统处理能力的一个重要指标,通常用于表示系统在每秒钟能够处理多少个请求。真实 QPS 是一种专注于计算真实、有效请求的 QPS 指标,区别于那些可能被错误请求、健康检查、静态资源请求等所影响的总 QPS。也就是说,真实 QPS 更关注的是应用层实际处理的请求,通常用来反映应用的实际负载。真实 QPS 能够帮助评估实际业务请求的流量,帮助开发人员和运维团队进行容量规划。

真实 QPS 计算的是每秒处理的有效请求数,通常会排除掉错误请求、无效请求、超时请求等。更多地关注系统健康状况和正常请求的处理能力,排除掉可能对应用健康产生负面影响的请求。

TPS 用来衡量系统处理每秒原子事务的能力,适用于那些涉及多个操作、需要事务保证的一致性的场景。TPS 则更侧重于事务处理,尤其是那些需要保证一致性和原子性的操作。例如: 在数据库中,一个事务可能包括插入、更新和删除等操作。QPS 用来衡量系统处理每秒请求的能力,通常适用于 无状态请求,且不需要事务处理的场景。QPS 是一个更宽泛的概念,适用于大多数的 HTTP 请求和查询操作,关注的是请求的频率。例如,一个 HTTP 请求可能只是查询或获取资源,并不涉及多步骤的操作。

3.2 每秒 QPS

每秒 QPS(Queries Per Second) 是衡量系统每秒处理的请求数量的指标,通常用于衡量一个 Web 应用或服务的吞吐量。在 Node.js 中,QPS 代表每秒钟 HTTP 请求的数量。这个指标对于监控系统性能、分析应用负载、预测资源需求和调优服务器性能非常有用。了解高负载时的 QPS,可以帮助我们提前进行容量规划,避免系统崩溃。可以根据设定的阈值,监控 QPS 指标来触发警报,及时发现系统故障或瓶颈。

每秒 QPS:计算的是每秒处理的请求数,不区分请求类型和状态,所有请求都会计入。更多地用于吞吐量、系统负载的监控,帮助了解系统在特定时间段内的处理能。

TPS 用来衡量系统处理每秒原子事务的能力,适用于那些涉及多个操作、需要事务保证的一致性的场景。TPS 则更侧重于事务处理,尤其是那些需要保证一致性和原子性的操作。例如: 在数据库中,一个事务可能包括插入、更新和删除等操作。QPS 用来衡量系统处理每秒请求的能力,通常适用于 无状态请求,且不需要事务处理的场景。QPS 是一个更宽泛的概念,适用于大多数的 HTTP 请求和查询操作,关注的是请求的频率。例如,一个 HTTP 请求可能只是查询或获取资源,并不涉及多步骤的操作。

四、TPS


TPS (Transactions Per Second) 是衡量系统或服务每秒处理多少事务的指标。它通常用于监控数据库、消息队列和应用层的事务处理能力。对于 Web 服务而言,TPS 代表的是每秒钟系统能够处理的业务请求或事务的数量。通过对 TPS 的监控,系统架构师可以更好地规划服务器的扩容和负载均衡,以适应日益增长的负载。如果 TPS 达到一定阈值并出现下降或不稳定,可以及时发现潜在的性能瓶颈或资源不足问题。

TPS 用来衡量系统处理每秒原子事务的能力,适用于那些涉及多个操作、需要事务保证的一致性的场景。TPS 则更侧重于事务处理,尤其是那些需要保证一致性和原子性的操作。例如: 在数据库中,一个事务可能包括插入、更新和删除等操作。QPS 用来衡量系统处理每秒请求的能力,通常适用于 无状态请求,且不需要事务处理的场景。QPS 是一个更宽泛的概念,适用于大多数的 HTTP 请求和查询操作,关注的是请求的频率。例如,一个 HTTP 请求可能只是查询或获取资源,并不涉及多步骤的操作。

五、CPU


5.1 CPU 负载

CPU 负载 描述的是系统中等待 CPU 执行的任务数量。一般来说,它可以理解为系统队列中任务的数量,包括正在运行和等待运行的任务。CPU 负载的数值越高,说明系统任务越多,CPU 负载越重;数值越低,说明系统任务较少,CPU 有更多的闲暇时间。

CPU 负载 通常以平均值的形式显示,分为 1 分钟平均负载5 分钟平均负载15 分钟平均负载。这些数值分别表示系统在过去 1 分钟5 分钟15 分钟内 的平均负载。这个平均值可以帮助我们判断系统的负载趋势和波动情况。

CPU 负载 反映的是系统的整体负载情况,表示系统的繁忙程度,包括等待 CPUI/O 资源的进程。负载不一定与 CPU 使用率直接相关。

5.2 CPU 使用率

CPU 使用率 是一个衡量计算机中央处理单元(CPU)在给定时间内有多忙碌的指标。它表示在 CPU 能够使用的时间里,CPU 实际上被使用的时间百分比。简单来说,CPU 使用率反映了计算机的处理能力被消耗的程度。

  1. 0% CPU 使用率意味着 CPU 完全空闲,没有任何任务在运行

  2. 100% CPU 使用率意味着 CPU 在该时刻完全处于工作状态,没有闲置

CPU 使用率 主要关注的是 CPU 资源的实际使用情况,反映了 CPU 被占用的百分比。如果系统 CPU 使用率很高,通常意味着系统忙于处理任务。

5.3 process_cpu_seconds_total

process_cpu_seconds_total (总 CPU 时间): 这个指标将 用户 CPU 时间 和 系统 CPU 时间 相加,表示 Node.js 进程在用户态和系统态的总 CPU 使用时间,单位为秒。

5.4 process_cpu_user_seconds_total

process_cpu_user_seconds_total (用户 CPU 时间): 这个指标用于跟踪 Node.js 进程在用户态(用户空间)花费的总 CPU 时间,单位为秒。用户态是指进程执行应用程序代码的时间。

5.5 process_cpu_system_seconds_total

process_cpu_system_seconds_total (系统 CPU 时间): 该指标用于跟踪 Node.js 进程在内核态(操作系统内核空间)花费的总 CPU 时间,单位为秒。系统态时间通常用于处理系统调用(如文件读写、网络请求等)和其他内核任务。

六、内存


6.1 heap_size_used

heapUsed: 当前已使用的堆内存量(字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

6.2 heap_size_total

heapTotal: 堆内存的总量(字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

6.3 external_memory

external: 外部内存(例如 C++ 插件、V8 之外的内存等)的使用量(字节)。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

6.4 resident_memory

rss: 常驻内存集(Resident Set Size),即进程使用的总内存,包括所有的堆内存和外部内存等。

process.memoryUsage() 主要提供进程级别的内存统计信息,包含了堆的总大小、已用大小、外部内存(如 C++ 绑定)的使用情况以及进程的常驻集内存, 是 Node.js 级别的简化接口,适合快速查看进程内存的总体情况; v8.getHeapStatistics() 提供更详细的堆内存统计信息,具体到堆内存的不同区域(如新生代、老生代等)的使用情况, 适用于需要深入分析堆内存使用情况的场景。

这两者并不是完全替代的关系,而是可以结合使用。process.memoryUsage() 更适合监控整个进程的内存使用情况,而 v8.getHeapStatistics() 则为需要深入堆内存分析的场景提供了更多的细节。

6.5 heap_space_size_used

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

6.6 heap_space_size_total

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

6.7 heap_space_size_available

v8.getHeapSpaceStatistics()V8 引擎提供的一个方法,它可以返回关于堆空间的详细统计信息。V8 将堆内存划分为多个空间,每个空间代表堆的不同区域,例如 新生代(new space老生代(old space代码空间(code space大型对象空间(large object space 等。

通过 v8.getHeapSpaceStatistics(),你可以得到关于各个堆空间的详细内存使用情况,该方法返回一个数组,每个元素代表一个堆空间的统计信息,包含以下字段:

  • space_name: 堆空间的名称(例如 new_space, old_space, code_space, large_object_space)。

  • space_size: 堆空间的总大小(字节)。

  • space_used_size: 堆空间的已用内存(字节)。

  • space_available_size: 堆空间的可用内存(字节)。

七、句柄


Node.js 中,句柄(Handles 通常指的是进程中打开的各种资源,如文件描述符、TCP/UDP 套接字、进程的 I/O 等等。每个句柄都占用一些内存,并且可以影响系统的性能。

Node.js 中,文件句柄网络连接句柄 是最常见的两种类型。要计算句柄,我们通常会查看进程的打开文件描述符的数量。这些句柄可以通过 process._getActiveHandles() 来获取。

  • process._getActiveHandles() 返回当前 Node.js 进程的所有活动句柄(如 TCPUDP、定时器、请求等)。

  • process._getActiveRequests() 返回当前 Node.js 进程中的所有活动请求(如 HTTP 请求等)。

八、事件循环


Node.js 中,事件循环延迟是一个重要的性能指标,它反映了 Node.js 事件循环处理异步任务的效率。我们可以通过两种方式来计算事件循环的延迟时间:一种是基于 process.hrtime(),另一种是通过 Node.js 提供的 perf_hooks 模块中的 monitorEventLoopDelay API