概述

本文档详细解释了在容器监控中常见的内存相关指标。内存指标与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