温馨提示×

linux缓存如何生效

小樊
38
2026-10-21 02:50:07
栏目: 智能运维

在 Linux 中,“缓存生效”通常指系统如何利用缓存提高性能,以及你的程序/配置如何正确地使用缓存。可以从三个层面理解:系统缓存(Page Cache)、应用层缓存、如何让缓存真正起作用。


一、Linux 系统缓存(Page Cache)如何生效

1. 基本原理

Linux 会自动把:

  • 读过的文件
  • 写入后未立即刷盘的数据

放进 内存中的 Page Cache。

下次再访问相同文件/数据,就直接从内存读取,不访问磁盘。

2. 示例说明

cat bigfile.txt
cat bigfile.txt   # 第二次明显更快

第一次:磁盘 → 内存
第二次:内存 → 用户态(缓存命中)

3. 查看缓存是否生效

free -h

关注:

  • buff/cache
  • available
cat /proc/meminfo | grep -i cache

4. 系统自动管理

  • 内存够 → 缓存一直保留
  • 内存紧张 → 自动回收(不影响正确性)

二、写缓存(Writeback)如何生效

写流程

write()
  → Page Cache
    → 定时/条件触发
      → 磁盘

相关参数

sysctl -a | grep dirty

常见参数:

  • dirty_ratio:内存占用比例触发写回
  • dirty_background_ratio:后台写回
  • dirty_expire_centisecs:数据最大存活时间

⚠️ 断电可能丢数据(除非 fsync)


三、如何让“你的程序”利用缓存

1. 顺序读大文件(最易命中)

read(fd, buf, 1MB);
  • 顺序访问
  • 大块读取 ✅ 最容易利用 Page Cache

2. 避免频繁 O_DIRECT

open("file", O_DIRECT);

❌ 绕过缓存(用于数据库等特殊场景)

3. 使用 mmap

mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
  • 文件直接映射内存
  • 命中 Page Cache
  • 适合只读/随机访问

四、应用层缓存(Redis / 业务缓存)

示例(伪代码)

if cache.exists(key):
    return cache.get(key)
else:
    data = db.query()
    cache.set(key, data, ttl=60)

✅ 缓存是否生效看:

  • 命中率
  • TTL 是否合理
  • 是否热点数据

五、缓存“没生效”的常见原因

❌ 文件每次都不同
❌ 随机小文件 + 内存不足
❌ 使用 O_DIRECT
❌ 频繁 posix_fadvise(DONTNEED)
❌ 程序重启 + 冷启动


六、手动干预(慎用)

清缓存(调试用)

echo 3 > /proc/sys/vm/drop_caches

预加载文件到缓存

vmtouch -t bigfile

七、总结一句话

Linux 缓存默认就生效,只要你“重复访问相同数据”,且“不刻意绕过它”。

如果你指的是:

  • 某个具体应用(MySQL / Nginx / Docker)
  • 某种缓存(DNS / apt / inode)
  • 或“为什么我的缓存不生效”

可以告诉我具体场景,我可以直接帮你定位。

0 踩