温馨提示×

怎样优化linux缓存

小樊
33
2026-10-06 13:02:43
栏目: 智能运维

在 Linux 中,“缓存”通常包含 页缓存(page cache)、目录项缓存(dentry cache)、inode 缓存 等,主要目的是提升 I/O 性能。是否“优化”取决于你的目标:提高命中率、释放内存、降低延迟,还是避免缓存影响特定业务。

下面从 原理 → 常用优化手段 → 实战建议 三个层面说明。


一、先理解 Linux 缓存机制

Linux 默认策略:

  • 尽量用空闲内存做缓存
  • 应用需要内存时,自动回收缓存(drop caches 只是手动触发)
  • 缓存对大多数场景是有益的

查看缓存占用:

free -h
cat /proc/meminfo

关键字段:

  • Cached:文件缓存
  • Buffers:块设备缓冲
  • Slab:内核对象(dentry/inode)

二、常见优化方向与做法

1️⃣ 提高缓存命中率(推荐)

适合:读多、文件大、I/O 频繁

  • 增加可用内存(最有效)
  • 减少不必要的写操作
  • 使用 noop / deadline IO 调度器(SSD)
  • 避免频繁小文件随机写

示例:

# 查看调度器
cat /sys/block/sda/queue/scheduler

2️⃣ 控制缓存回收行为(内核参数)

(1)脏页写回控制

避免缓存堆积导致突发 I/O:

sysctl -a | grep dirty

关键参数:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500

说明:

  • dirty_background_ratio:后台开始写回
  • dirty_ratio:进程被阻塞前最大脏页比例

✅ 数据库服务器建议调小


3️⃣ 手动释放缓存(不推荐常规使用)

sync
echo 1 > /proc/sys/vm/drop_caches   # 页缓存
echo 2 > /proc/sys/vm/drop_caches   # dentries/inodes
echo 3 > /proc/sys/vm/drop_caches   # 全部

⚠️ 注意:

  • 会明显降低性能
  • 仅用于测试或排障

4️⃣ 限制缓存使用(cgroup / 内存控制)

对容器或特定进程:

memory.max = 2G

或使用 vmtouch 控制文件缓存:

vmtouch -t file
vmtouch -e file

5️⃣ 对特定程序禁用缓存(高级)

  • 使用 O_DIRECT(数据库常用)
  • 使用 posix_fadvise(DONTNEED)
  • 数据库(MySQL / PostgreSQL)通常自己管理缓存

6️⃣ NUMA / 大页(高性能场景)

numactl --interleave=all
echo always > /sys/kernel/mm/transparent_hugepage/enabled

适合:

  • 数据库
  • 高频 I/O
  • 大内存服务器

三、典型场景建议

✅ Web / 文件服务器

  • 保持默认缓存
  • 不用 drop cache
  • 加大内存

✅ 数据库服务器

  • 减小 dirty ratio
  • 使用 O_DIRECT
  • 控制 shared buffer

✅ 嵌入式 / 小内存设备

  • 降低 dirty 比例
  • 定期 sync
  • 必要时 drop cache

四、诊断工具推荐

vmstat 1
iostat -x 1
sar -r 1
slabtop

总结一句话

Linux 缓存默认就是优化好的,不要盲目清理;真正优化是:控制脏页、匹配业务 IO 模式、合理使用内存。

如果你能告诉我:

  • 使用场景(数据库 / Web / 嵌入式)
  • 内存大小
  • 性能问题表现

我可以给你具体的参数配置方案。

0 踩