当前位置:首页>Linux>Linux 内存管理扫盲:Buffer 和 Cache 到底是不是内存泄漏?

Linux 内存管理扫盲:Buffer 和 Cache 到底是不是内存泄漏?

  • 2026-08-22 22:51:16
Linux 内存管理扫盲:Buffer 和 Cache 到底是不是内存泄漏?

Linux 内存管理扫盲:Buffer 和 Cache 到底是不是内存泄漏?

一、概述

1.1 背景介绍

"我们服务器内存快满了!"

每次听到这句话,我都会先问一句:"你是怎么看的?"

十有八九,对方会说:"free 命令显示只剩 500M 了!"

然后我就知道,又是一个被 Linux 内存管理机制"欺骗"的同学。

1.2 核心概念

Linux 的内存管理哲学是:空闲内存是浪费的内存。

系统会尽可能把空闲内存用作缓存,提高 IO 性能。当应用需要内存时,再把缓存释放出来。

概念
说明
Buffer
块设备的缓冲区,用于加速磁盘读写
Cache
文件系统的页缓存,缓存文件内容
Available
真正可用的内存(free + 可回收的缓存)

1.3 适用场景

  • 服务器内存使用率告警排查
  • 应用内存泄漏分析
  • 容器内存限制配置
  • 系统性能调优

1.4 环境要求

工具
用途
free
内存概览
vmstat
虚拟内存统计
/proc/meminfo
详细内存信息

二、详细步骤

2.1 正确解读 free 命令

$ free -h              total        used        free      shared  buff/cache   availableMem:           15Gi       8.2Gi       512Mi       256Mi       6.8Gi       6.5GiSwap:         2.0Gi          0B       2.0Gi

关键点:

  • free 只有 512M?别慌!
  • available 有 6.5G,这才是真正可用的内存
  • buff/cache 的 6.8G 大部分可以被回收

2.2 内存分类详解

# 查看详细内存信息cat /proc/meminfo
字段
含义
MemTotal
物理内存总量
MemFree
完全空闲的内存
MemAvailable
可用内存(重要!)
Buffers
块设备缓冲
Cached
页缓存
SwapCached
交换区缓存
Slab
内核数据结构缓存

2.3 OOM Killer 机制

当内存真的不够用时,Linux 会启动 OOM Killer 杀掉进程:

# 查看 OOM 日志dmesg | grep -i "out of memory"journalctl -k | grep -i oom# 查看进程的 OOM 分数(分数越高越容易被杀)cat /proc/<PID>/oom_score

三、示例代码和配置

3.1 手动清理缓存

# 清理 PageCachesync; echo 1 > /proc/sys/vm/drop_caches# 清理 dentries 和 inodessync; echo 2 > /proc/sys/vm/drop_caches# 清理所有缓存sync; echo 3 > /proc/sys/vm/drop_caches

注意:生产环境慎用,会导致 IO 性能下降!

3.2 cgroup 内存限制(容器场景)

# 查看容器内存限制cat /sys/fs/cgroup/memory/memory.limit_in_bytes# 查看容器当前内存使用cat /sys/fs/cgroup/memory/memory.usage_in_bytes

四、最佳实践和注意事项

4.1 最佳实践

4.1.1 监控指标选择

  • 正确:监控 MemAvailable 或 available
  • 错误:只看 MemFree 或 free

4.2 注意事项

⚠️ Buffer/Cache 不是内存泄漏:这是正常的系统行为

⚠️ Swap 使用不一定是坏事:少量 Swap 使用是正常的

⚠️ OOM 保护关键进程:

# 降低进程被 OOM 杀掉的概率echo -1000 > /proc/<PID>/oom_score_adj

五、故障排查和监控

5.1 内存泄漏排查

# 查看进程内存使用ps aux --sort=-%mem | head -20# 使用 pmap 查看进程内存映射pmap -x <PID># 持续监控内存变化watch -n 1 'free -h'

5.2 监控告警

# Prometheus 告警规则groups:-name:memory-alertsrules:-alert:LowMemoryAvailableexpr:node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes<0.1for:5mlabels:severity:criticalannotations:summary:"可用内存低于 10%"

六、总结

6.1 技术要点回顾

  • ✅ 看 available 不看 free:这是判断内存是否充足的正确方式
  • ✅ Buffer/Cache 是好东西:它们提高了系统 IO 性能
  • ✅ OOM Killer 是最后防线:保护关键进程很重要

6.2 参考资料

  • Linux 内核文档 - Memory
  • Brendan Gregg - Linux Performance

“

写在最后:理解 Linux 内存管理,能让你在面对"内存告警"时不再慌张。记住:Buffer 和 Cache 不是敌人,它们是朋友。

最新文章

随机文章