Linux 内存管理扫盲:Buffer 和 Cache 到底是不是内存泄漏?
一、概述
1.1 背景介绍
"我们服务器内存快满了!"
每次听到这句话,我都会先问一句:"你是怎么看的?"
十有八九,对方会说:"free 命令显示只剩 500M 了!"
然后我就知道,又是一个被 Linux 内存管理机制"欺骗"的同学。
1.2 核心概念
Linux 的内存管理哲学是:空闲内存是浪费的内存。
系统会尽可能把空闲内存用作缓存,提高 IO 性能。当应用需要内存时,再把缓存释放出来。
1.3 适用场景
1.4 环境要求
二、详细步骤
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
关键点:
available 有 6.5G,这才是真正可用的内存buff/cache 的 6.8G 大部分可以被回收
2.2 内存分类详解
# 查看详细内存信息cat /proc/meminfo
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
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 参考资料
- Brendan Gregg - Linux Performance
“写在最后:理解 Linux 内存管理,能让你在面对"内存告警"时不再慌张。记住:Buffer 和 Cache 不是敌人,它们是朋友。