认识
一、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
负载 反映的是系统的整体负载情况,表示系统的繁忙程度,包括等待 CPU
和 I/O
资源的进程。负载不一定与 CPU
使用率直接相关。
5.2 CPU 使用率
CPU
使用率 是一个衡量计算机中央处理单元(CPU
)在给定时间内有多忙碌的指标。它表示在 CPU
能够使用的时间里,CPU
实际上被使用的时间百分比。简单来说,CPU
使用率反映了计算机的处理能力被消耗的程度。
-
0% CPU
使用率意味着CPU
完全空闲,没有任何任务在运行 -
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
进程的所有活动句柄(如TCP
、UDP
、定时器、请求等)。 -
process._getActiveRequests()
返回当前Node.js
进程中的所有活动请求(如HTTP
请求等)。
八、事件循环
在 Node.js
中,事件循环延迟是一个重要的性能指标,它反映了 Node.js
事件循环处理异步任务的效率。我们可以通过两种方式来计算事件循环的延迟时间:一种是基于 process.hrtime()
,另一种是通过 Node.js
提供的 perf_hooks
模块中的 monitorEventLoopDelay API
。