一、内存监控
一.物理内存
这是最直观的内存指标,反映了物理硬件(RAM)的使用情况。
1.1核心指标详解
命令:free -h 或 cat /proc/meminfo
- 指标含义:
| 指标名称 | 对应字段 | 含义详解 | 作用与分析 |
|---|---|---|---|
| Total | MemTotal | 物理内存总大小。 | 硬件上限,评估资源基准。 |
| Used | MemUsed | 已用内存。包含应用程序使用、内核使用(Slab/Vmalloc)等。 | 注意:单纯看 Used 高不代表有问题,因为 Linux 倾向于把空闲内存用作缓存。 |
| Buff/Cache | Buffers/Cached | 缓冲/缓存。Buffers: 块设备(磁盘)读写缓冲。 Cached: 文件系统缓存(加速文件读取)。 | 可回收资源。当应用需要内存时,这部分通常会自动释放。如果过低,会导致磁盘 I/O 变高,系统变慢。 |
| Available | MemAvailable | 可用内存。真正还可以分配给新进程的估算值(Free + 可回收的 Buff/Cache)。 | 判断内存瓶颈的核心指标。比 Free 更具参考价值。 |
作用:用来判断系统整体资源是否紧张,是否会发生 OOM(内存溢出杀进程)。
1.2警报与判断
-
警报阈值:
- 警告 (Warning) :Available < 20%
- 严重 (Critical) :Available < 10%
-
典型场景:
- Java 应用堆内存(Heap)设置过大,接近物理内存上限。
- 数据库(Redis/MySQL)缓存配置不当。
- 内存泄漏(Memory Leak):应用程序申请内存后不释放,Available 持续下降。
-
后果:
- 系统尝试回收 Cache,导致磁盘 I/O 飙升,系统卡顿。
- 触发 OOM Killer ( Out of Memory ) ,Linux 强制杀掉占用内存最高的进程(通常是业务进程)。
二.交换分区
Swap 是磁盘上的空间,当物理内存不足时,操作系统会将内存中不活跃的数据暂时“交换”到磁盘上。
2.1核心指标详解
命令:free -h, vmstat
- 指标含义:
| 指标名称 | 含义详解 | 作用与分析 |
|---|---|---|
| Swap Used | Swap 空间已使用的量。 | 如果物理内存不足,系统开始大量使用 swap,会导致性能下降。 误区提醒:Swap Used 高不一定代表系统卡顿。如果是一些僵尸进程占用了 Swap 且不再活跃,其实是好事(腾出了物理内存给活跃进程)。 |
| Swap In/Out (si/so) | 换入/换出速率。si: 从磁盘读回内存。so: 从内存写入磁盘。 | 真正的性能杀手。如果 si/so 持续大于 0,说明内存严重不足,系统正在疯狂进行磁盘读写(抖动),导致极度卡顿。 |
2.2 警报与判断
-
警报阈值:
- Swap 使用率:> 20%-50%(作为预警,提示物理内存可能不足)。
- Swap 频繁活动 (关键) :
si或so速率持续 > 0 KB/s(持续 1分钟以上)。
-
后果:
- 系统响应极慢,SSH 甚至无法连接。
- 业务接口超时。
三、 虚拟内存与提交
Linux 的内存申请是“超卖”模式,理解这里才能解释“为什么物理内存还有空闲,程序却报无法分配内存”。
3.1 核心指标详解
命令:cat /proc/meminfo, sar -r
| 指标名称 | 含义详解 | 作用与分析 |
|---|---|---|
| CommitLimit | 内存提交上限。计算公式:Swap Total + (Physical RAM * vm.overcommit_ratio)。 | 系统能承诺给所有进程分配的虚拟内存总量上限(在 Strict Overcommit 模式下)。 |
| Committed_AS | 已提交地址空间。所有进程申请的虚拟内存总和(Process A申请 + Process B申请...)。 | 重点:如果 Committed_AS 远大于物理内存,说明应用开启了大量内存申请(如 Java Xmx 设置很大),虽然暂时没用满,但存在 OOM 风险。 |
| VmallocUsed | 内核虚拟内存。内核为了分配大块连续逻辑地址而使用的空间。 | 排查内核问题:主要用于监控内核模块(如驱动、网络协议栈)是否有内存泄漏。真正需要警惕的是:如果 VmallocUsed 持续异常增长且不释放。 |
3.2 警报与判断
-
警报阈值:
Committed_AS>CommitLimit* 90% (如果关闭了 Overcommit)。VmallocUsed出现异常的持续大幅增长。
-
场景:
- 虚高申请:程序申请了 10G 内存但只用了 100M。物理内存看着很空,但
Committed_AS很高。 - 内核泄露:
VmallocUsed暴涨,通常是驱动 Bug。
- 虚高申请:程序申请了 10G 内存但只用了 100M。物理内存看着很空,但
四、 内存健康度指标 (Page Faults)
除了看大小,还要看内存的“分配效率”。
4.1 指标详解
来源命令:vmstat -s , sar -B
| 指标名称 | 含义详解 | 作用与分析 |
|---|---|---|
| pgfault (Minor) | 次缺页异常。进程申请内存时,数据在物理内存中只是没建立映射。 | 正常现象。程序启动或申请内存时都会发生,无需惊慌。 |
| pgmajf (Major) | 主缺页异常。进程需要的数据不在内存中,必须从磁盘(Swap 或文件)读取。 | 危险信号。如果此指标飙升,说明内存严重不足,正在发生频繁的磁盘 I/O 阻塞。 |
五、 总结与排查速查表
| 现象 | 可能原因 | 建议排查工具 | 解决思路 |
|---|---|---|---|
| Available 低,Buffer/Cache 低 | 应用程序真的把内存吃光了 | top (按 M 排序), pidstat -r | 检查 Java 堆配置、检查是否存在内存泄露。 |
| Available 低,Buffer/Cache 高 | 正常现象,系统在缓存文件 | free -h | 无需处理,除非 Swap 开始频繁活动。 |
| Swap Used 高,si/so 为 0 | 历史遗留数据占用了 Swap | vmstat 1 | 暂时无视,说明那些进程是不活跃的。 |
| Swap Used 高,si/so 持续高 | 物理内存严重不足,系统抖动 | vmstat, iotop | 紧急!扩容内存或杀掉占用高的进程。 |
| Used 高,但找不到进程 | 内核 Slab 或 Vmalloc 占用 | slabtop, /proc/meminfo | 检查 Slab 和 VmallocUsed,排查驱动或大量文件系统操作。 |