温馨提示×

如何优化linux缓存

小樊
36
2026-10-09 12:00:25
栏目: 智能运维

在 Linux 中,“缓存”通常指 Page Cache(页缓存)、dentry/inode 缓存,以及可选的 swap 行为。优化 Linux 缓存不是“越大越好”或“越小越好”,而是根据**业务类型(IO 密集 / 内存敏感 / 低延迟)**来做权衡。

下面从 原理 → 常用优化手段 → 场景化建议 系统说明。


一、先理解 Linux 缓存机制

1. 主要缓存类型

  • Page Cache:文件读写缓存(最常见)
  • Buffer Cache:块设备元数据(新内核已合并到 page cache)
  • dentry / inode cache:目录项和 inode 缓存
  • swap cache:匿名内存换出缓存

2. 内存使用逻辑

Linux 默认策略:

空闲内存 = 浪费内存 能缓存就缓存,内存紧张时自动回收

通过命令查看:

free -h
cat /proc/meminfo

关键字段:

  • Buffers
  • Cached
  • SReclaimable(可回收 slab)

二、通用优化手段

1. 调整脏页(write-back)行为(非常重要)

写文件时,数据先进 page cache,再异步刷盘。

关键参数

sysctl -a | grep dirty

常见参数:

  • vm.dirty_background_ratio:后台刷盘阈值(% 内存)
  • vm.dirty_ratio:强制同步刷盘阈值
  • vm.dirty_expire_centisecs:脏页最大存活时间
  • vm.dirty_writeback_centisecs:刷盘周期

示例(数据库 / 低延迟)

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

延迟敏感系统:降低 dirty 比例,避免突发 IO


2. 控制缓存回收倾向

cat /proc/sys/vm/swappiness
  • 默认 60
  • 数据库服务器建议:
vm.swappiness = 1~10
  • 纯计算型(不关心 IO):可保持默认

3. 调整 vfs cache 回收

vm.vfs_cache_pressure
  • 默认 100
  • 增大(如 200):更积极回收 dentry/inode
  • 减小(如 50):更保留文件元数据缓存

4. 透明大页(THP)谨慎开启

cat /sys/kernel/mm/transparent_hugepage/enabled
  • 数据库(MySQL / Redis / Oracle):建议关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled

三、按需“手动清理”缓存(不推荐频繁)

# 释放 pagecache
echo 1 > /proc/sys/vm/drop_caches

# 释放 dentries + inodes
echo 2 > /proc/sys/vm/drop_caches

# 全部
echo 3 > /proc/sys/vm/drop_caches

⚠️ 仅用于:

  • 性能测试前
  • 排查问题
  • 不应作为“优化手段”

四、场景化优化建议

✅ 场景 1:文件服务器 / 视频 / 日志

  • 大 page cache 是好事
  • 可保持高 dirty ratio
  • 不建议频繁 drop cache

✅ 场景 2:数据库(MySQL / PostgreSQL)

vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
THP = never

数据库自己管理缓存,OS 缓存是“辅助”

✅ 场景 3:Redis / 内存型服务

  • 减少 OS 缓存抢占
  • 控制 swappiness
  • 必要时 mlock 关键内存

✅ 场景 4:容器 / Kubernetes

  • 限制 memory limit
  • 避免 cache 导致 OOM
  • 关注 cache 不计入可用内存的误区

五、高级手段(进阶)

  • ionice / nice 控制 IO 与 CPU
  • fadvise / madvise 提示内核
  • 使用 tmpfs 放临时文件
  • 使用 io_uring 降低缓存依赖
  • NUMA 本地内存分配优化

六、诊断工具推荐

vmstat 1
iostat -x 1
sar -r 1
slabtop
cat /proc/buddyinfo

如果你愿意,可以告诉我:

  • 你的 系统用途(数据库 / Web / 存储)
  • 内存大小
  • 是否遇到 OOM / IO 卡顿 / 缓存不释放

我可以直接给你一套 可落地的 sysctl 配置。

0 踩