跳转至

Linux 中的buffer 和 cache

在 Linux 性能分析中,buffercache 几乎是绕不开的话题。很多人第一次看到 free -h 时都会产生疑问:none !important

为什么内存几乎用完了?是不是系统有问题? 这篇文章我们不只讲“是什么”,更重点讲:none !important

  • • 它们的本质区别
  • • Linux 为什么这样设计
  • • 在性能调优和问题排查中该怎么判断

一、buffer 和 cache 的定义与区别

1. Buffer(缓冲区)

Buffer 主要用于: 👉 块设备(block device)的 I/O 缓冲 典型场景:none !important

  • • 磁盘写入前的临时存储
  • • 文件系统 metadata 操作 特点:
  • • 面向“块设备”
  • • 更偏向 I/O 过程中的“中间态”

2. Cache(页缓存 / Page Cache)

Cache 主要用于: 👉 文件数据缓存 典型场景:none !important

  • • 文件读取加速
  • • 减少磁盘访问 特点:
  • • 面向“文件内容”
  • • 用于提高读取性能

3. 核心区别总结

维度 Buffer Cache
面向对象 块设备 文件数据
生命周期 短(I/O过程中) 较长(可复用)
作用 I/O缓冲 提高读取性能

4. 一个关键事实(必须知道)

在现代 Linux 内核中:none !important

Buffer 已经被 Page Cache 统一管理 也就是说:none !important

  • • 二者在实现上已经融合
  • free 里的 buff/cache 是合并统计

二、free 命令的正确理解

  free -h
示例:
              total   used   free   shared  buff/cache  available
Mem:           16G     10G    1G      200M        5G         4G

关键点:none !important

  1. \1. buff/cache 是“可回收”的 • 不是“被占死的内存” • 在需要时会被释放
  2. \2. 真正关键指标是: available 表示: 在不影响系统性能的前提下,还能分配的内存
  3. \3. 一个常见误解 free 很少 = 内存不足 ✔ 实际应该看 available

三、Linux 的设计哲学

Linux 有一个经典原则: Unused memory is wasted memory 策略是: • 空闲内存 → 尽量用来做 cache • 应用需要内存 → 自动回收 cache 所以你看到: • cache 越大 ≠ 问题 • 反而通常说明系统利用率高none !important

四、性能调优中的关键观察点

  1. \1. 判断是否真的内存不不足
  free -h
vmstat 1

关注: • available 是否持续很低 • 是否频繁发生 swap \2. 观察 Page Cache 命中情况 sar -B 关注: • pgpgin / pgpgout • fault / majflt 如果 major fault 很多,说明频繁访问磁盘(cache 不够) \3. 判断是否发生内存压压力none !important

  vmstat 1

关注: • si/so(swap in/out) • wa(IO wait) 五、典型问题与分析思路 场景 1:系统很卡,但 CPU 不高 排查方向: • 是否 IO 瓶颈 • Page Cache 是否频繁失效none !important

  iostat -x 1

场景 2:内存“看起来满了” 正确判断: • 看 available • 看是否发生 swap 场景 3:频繁读磁盘 可能原因: • cache 太小 • 数据集远大于内存 优化思路: • 增加内存 • 优化访问模式(顺序读 vs 随机读)none !important

六、调优建议(重点)

  1. \1. 不要轻易清 cache
  echo 3 > /proc/sys/vm/drop_caches

适用于: • benchmark • 测试 不适用于: 线上长期优化 原因: • 会降低性能(失去缓存) \2. 合理调整 dirty 参数none !important

  sysctl -a | grep dirty

关键参数: • vm.dirty_ratio • vm.dirty_background_ratio 作用: 控制“脏页刷盘时机” 调优方向: • IO 密集型系统 → 降低 • 吞吐优先 → 可以提高 \3. 减少不必要的缓存污染 例如大文件一次性扫描: O_DIRECT 或: posix_fadvise() \4. 控制 swap 使用 vm.swappiness 建议: • 数据库:10~20 • 普通系统:60(默认)none !important

七、一个实用的调试套路

Step 1:看整体none !important

  free -h

Step 2:看动态none !important

  vmstat 1

Step 3:看 IOnone !important

  iostat -x 1

Step 4:看 cache 行为none !important

  sar -B

八、总结

Buffer 和 Cache 本质都是为了提升 IO 性能, 在现代 Linux 中已经统一到 Page Cache,cache 占用高是正常现象,调优重点不在“清 cache”,而在观察内存压力 ,理解 IO 行为,调整内核参数 最后一句 Linux 不是在“占用你的内存”, 而是在“帮你把内存用到极致”。