找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3673

积分

0

好友

485

主题
发表于 2 小时前 | 查看: 5| 回复: 0

云栈社区,经常有运维小伙伴问:“我们服务器内存快满了!”
每次听到这句话,我都会先问一句:“你是怎么看的?”
十有八九,对方会说:“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

最佳实践和注意事项

监控指标选择

  • 正确:监控 MemAvailableavailable

  • 错误:只看 MemFreefree

  • ⚠️ 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 不是敌人,它们是朋友。




上一篇:Claude Code动态工作流机制详解:从单窗口到多智能体协作
下一篇:高性能架构演进:从单线程到协程,一次看懂服务器进化史
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-6-5 03:23 , Processed in 1.139896 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表