概述
本文档详细解释了在容器监控中常见的内存相关指标。内存指标与CPU指标不同,它们通常是仪表(Gauge) 类型,表示当前瞬时值,对于诊断内存压力、泄漏和OOM(内存溢出)问题至关重要。
所有内存相关指标单位通常是字节(Bytes)。
使用量指标(Usage Metrics)
这些指标反映了容器当前的内存占用情况,是日常监控的重点。
| 指标 |
核心用途 |
关键特征 |
container_memory_working_set_bytes |
OOM 判断依据,容器实际使用的不可回收内存 |
最接近真实内存压力,含活跃缓存 |
container_memory_usage_bytes |
容器总内存占用,包含所有缓存 |
反映从主机申请的总内存量 |
container_memory_rss |
物理常驻内存,不含可回收缓存 |
表示”实在”占用的物理内存 |
container_memory_cache |
页面缓存,可被内核回收 |
提升 I/O 性能,不影响 OOM |
container_memory_mapped_file |
mmap 文件映射内存 |
反映 I/O 密集型应用特征 |
container_memory_swap |
交换分区使用量 |
启用 swap 时,可能延迟 OOM 但性能下降 |
工作集内存
| 指标名称 |
container_memory_working_set_bytes |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器当前工作集内存使用量。反映了容器实际正在使用且不能被内核回收的内存总量,包含常驻内存和部分缓存。此指标最接近容器的真实内存需求,是Linux OOM Killer决策的主要依据,监控此指标对预防容器意外终止至关重要。 |
| 内存构成 |
- 包含
container_memory_rss(常驻内存) - 包含
container_memory_cache 中正在被使用的部分(如缓存的文件数据) - 排除:完全未被使用、可被内核随时回收的缓存(如空闲的 page cache)
|
| 特点 |
最接近容器真实内存占用量,常用于判断容器是否接近内存限制并触发 OOM。 |
总内存
| 指标名称 |
container_memory_usage_bytes |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器当前总内存使用量。反映了容器占用的全部内存空间,包括所有类型的内存使用(缓存、RSS、交换等),无论是否活跃。这是一个“所有权”概念而非“压力”概念。 |
| 内存构成 |
container_memory_rss(常驻内存)container_memory_cache(页面缓存)container_memory_swap(交换内存,若启用)- 注意:部分实现可能包含
container_memory_mapped_file(已映射文件)
|
| 特点 |
反映容器从主机申请的总内存量,但可能高估实际使用量(因包含可回收缓存)。 |
常驻内存
| 指标名称 |
container_memory_rss |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器常驻内存集大小。反映了容器实际加载到物理内存中且未被换出的内存量,包含堆内存、栈空间和部分内存映射文件。此指标是应用真正消耗且不可被内核自动回收的核心内存,是分析内存使用模式的核心指标。 |
| 内存构成 |
- 匿名内存(堆、栈、数据段等)
- 文件映射内存中当前活跃的部分(如共享库、mmap 文件)
- 排除:页面缓存(cache)中未被进程主动引用的部分
|
| 特点 |
表示容器“实在”占用的物理内存,不含可回收缓存。 |
页面缓存
| 指标名称 |
container_memory_cache |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器使用的页面缓存大小。反映了操作系统为加速I/O操作而缓存的数据量。此部分内存可在系统需要时快速回收,通常不影响容器稳定性,但过高的缓存可能表明I/O密集型工作负载。 |
| 内存构成 |
- 缓存的文件数据(如读取过的文件块)
- 缓存的文件系统元数据
- 缓存的可回收内存页面
|
| 特点 |
- 可回收性:不影响OOM Killer决策
- 性能优化:提高文件读写速度
- 自动管理:由内核自动调整
|
映射文件
| 指标名称 |
container_memory_mapped_file |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器通过内存映射方式访问的文件大小。反映了通过mmap系统调用映射到进程地址空间的文件数据量。此部分内存计入RSS,影响working_set计算,对数据库和大型文件处理应用特别重要。 |
| 内存构成 |
- 共享库文件映射
- 通过 mmap 映射的数据文件
- 可能被重复计入 container_memory_rss(若该映射正在被使用)
|
| 特点 |
反映容器对文件映射内存的依赖程度,常用于分析 I/O 密集型应用。 |
交换内存
| 指标名称 |
container_memory_swap |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器使用的交换分区大小。反映了因物理内存不足而被换出到磁盘的内存数据量。交换内存的使用会导致显著的性能下降,此指标的增长是内存压力的明确信号。 |
| 内存构成 |
|
| 特点 |
启用 swap 时,容器可能超过物理内存限制而不触发 OOM,但性能下降。 |
峰值与限制指标(Peak & Limit Metrics)
这些指标用于追踪内存使用峰值和资源限制触发的失败事件。
| 指标 |
核心用途 |
关键特征 |
container_memory_max_usage_bytes |
历史峰值记录,用于容量规划 |
单调递增,容器重启重置 |
container_memory_failcnt |
内存分配失败计数,预警信号 |
>0 表示可能限制过紧 |
container_memory_failures_total |
详细内存故障统计(cAdvisor 特有) |
细分 pgfault/pgmajfault |
历史峰值总内存
| 指标名称 |
container_memory_max_usage_bytes |
| 类型 |
Gauge(仪表,瞬时值) |
| 单位 |
字节 |
| 核心说明 |
该指标记录容器自启动以来的历史峰值内存使用量。这是一个历史最大值记录,反映了容器运行期间达到的最高内存占用水平。此指标对容量规划和资源限制设置具有重要参考价值,帮助确定合理的内存限制值,是一个“追踪”和“回顾”型指标。 |
| 内存构成 |
记录的是 container_memory_usage_bytes 的历史最大值 包含容器生命周期内曾经达到的最高总内存使用量,包括:- 峰值时的 container_memory_rss
- 峰值时的 container_memory_cache
- 峰值时的 container_memory_mapped_file
- 峰值时的 container_memory_swap(若启用)
|
| 特点 |
- 单调递增:只增不减,容器重启后重置
- 反映历史峰值:记录容器曾达到的最大内存用量,而非当前值
- 包含缓存:可能因大量文件缓存而偏高
- 无时间衰减:永久记录直到容器重启
|
内存分配失败次数
| 指标名称 |
container_memory_failcnt |
| 类型 |
Counter(累计计数器) |
| 单位 |
个(错误数) |
| 核心说明 |
该指标记录容器内存分配失败的次数。反映了容器自启动以来,当容器达到内存限制时,内存分配请求会被拒绝,该计数器会递增。持续增长表明容器需要调整内存限制或优化内存使用。 |
| 触发条件 |
当容器尝试分配内存(如应用申请堆内存)时,如果当前内存使用量已达到或超过容器设置的 limits.memory,则计数增加 |
| 关联配置 |
与容器的 limits.memory 设置直接相关 |
| 导致后果 |
每次计数增加代表一次内存分配被拒绝,可能导致:- 应用收到内存分配失败错误
- 触发 OOM Killer(如果配置了硬限制)
- 应用性能下降或异常
|
| 特点 |
- 硬限制触发:仅在达到硬性内存限制时增加
- 应用影响:每次增加都可能影响应用正常运行
- 早期预警:在 OOM 发生前提供预警信号
- 可恢复性:某些应用可能处理分配失败并继续运行
|
缺页错误
| 指标名称 |
container_memory_failures_total |
| 类型 |
Counter(累计计数器) |
| 单位 |
字节 |
| 核心说明 |
该指标用于跟踪容器内存缺页错误(page faults)的发生情况。该指标提供了两个子指标:pgfault(次缺页)和 pgmajfault(主缺页)。 |
| 缺页错误(Page Fault) |
当进程尝试访问虚拟内存地址,但对应的物理页不在内存中时,CPU 会触发缺页错误。这不是错误,而是内存管理系统的正常工作机制。 |
| 次缺页(pgfault) |
当所需的内存页已在物理内存中(在页缓存或缓冲区中),但不在当前进程的页表中时发生。 |
| 主缺页(pgmajfault) |
当所需的内存页不在物理内存中,需要从磁盘(交换分区或文件系统)加载时发生。 |
作者:叶奕珺 创建时间:2025-12-24 16:22
最后编辑:叶奕珺 更新时间:2026-01-15 14:15