在云栈社区,经常有运维小伙伴问:“我们服务器内存快满了!”
每次听到这句话,我都会先问一句:“你是怎么看的?”
十有八九,对方会说:“free 命令显示只剩 500M 了!”
然后我就知道,又是一个被 Linux 内存管理机制“欺骗”的同学。
Linux 的内存管理哲学是:空闲内存是浪费的内存。
系统会尽可能把空闲内存用作缓存,提高 IO 性能。当应用需要内存时,再把缓存释放出来。
| 概念 |
说明 |
| Buffer |
块设备的缓冲区,用于加速磁盘读写 |
| Cache |
文件系统的页缓存,缓存文件内容 |
| Available |
真正可用的内存(free + 可回收的缓存) |
适用场景:
- 服务器内存使用率告警排查
- 应用内存泄漏分析
- 容器内存限制配置
- 系统性能调优
| 工具 |
用途 |
| free |
内存概览 |
| vmstat |
虚拟内存统计 |
| /proc/meminfo |
详细内存信息 |
正确解读 free 命令
$ free -h
total used free shared buff/cache available
Mem: 15Gi 8.2Gi 512Mi 256Mi 6.8Gi 6.5Gi
Swap: 2.0Gi 0B 2.0Gi
free 只有 512M?别慌!
available 有 6.5G,这才是真正可用的内存
buff/cache 的 6.8G 大部分可以被回收
内存分类详解
# 查看详细内存信息
cat /proc/meminfo
| 字段 |
含义 |
| MemTotal |
物理内存总量 |
| MemFree |
完全空闲的内存 |
| MemAvailable |
可用内存(重要!) |
| Buffers |
块设备缓冲 |
| Cached |
页缓存 |
| SwapCached |
交换区缓存 |
| Slab |
内核数据结构缓存 |
OOM Killer 机制
当内存真的不够用时,Linux 会启动 OOM Killer 杀掉进程:
# 查看 OOM 日志
dmesg | grep -i "out of memory"
journalctl -k | grep -i oom
# 查看进程的 OOM 分数(分数越高越容易被杀)
cat /proc/<PID>/oom_score
示例代码和配置
手动清理缓存
# 清理 PageCache
sync; echo 1 > /proc/sys/vm/drop_caches
# 清理 dentries 和 inodes
sync; echo 2 > /proc/sys/vm/drop_caches
# 清理所有缓存
sync; echo 3 > /proc/sys/vm/drop_caches
注意:生产环境慎用,会导致 IO 性能下降!
cgroup 内存限制(容器场景)
# 查看容器内存限制
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 查看容器当前内存使用
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
最佳实践和注意事项
监控指标选择
-
正确:监控 MemAvailable 或 available
-
错误:只看 MemFree 或 free
-
⚠️ Buffer/Cache 不是内存泄漏:这是正常的系统行为
-
⚠️ Swap 使用不一定是坏事:少量 Swap 使用是正常的
-
⚠️ OOM 保护关键进程:
# 降低进程被 OOM 杀掉的概率
echo -1000 > /proc/<PID>/oom_score_adj
故障排查和监控
内存泄漏排查
# 查看进程内存使用
ps aux --sort=-%mem | head -20
# 使用 pmap 查看进程内存映射
pmap -x <PID>
# 持续监控内存变化
watch -n 1 'free -h'
监控告警
结合 Linux 内核文档 与社区经验,我们可以配置 Prometheus 规则实现自动告警:
# Prometheus 告警规则
groups:
- name: memory-alerts
rules:
- alert: LowMemoryAvailable
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "可用内存低于 10%"
总结
- ✅ 看 available 不看 free:这是判断内存是否充足的正确方式
- ✅ Buffer/Cache 是好东西:它们提高了系统 IO 性能
- ✅ OOM Killer 是最后防线:保护关键进程很重要
参考资料:
- Linux 内核文档 - Memory
- Brendan Gregg - Linux Performance
写在最后:理解 Linux 内存管理,能让你在面对“内存告警”时不再慌张。记住:Buffer 和 Cache 不是敌人,它们是朋友。
|