在 Linux 系统中,“缓存失效”通常指页缓存(page cache)/ 目录项缓存(dentry cache)/ inode 缓存未能命中,或系统主动回收缓存,导致原本应从内存读取的数据被迫访问磁盘,性能下降。下面按常见原因 → 原理 → 排查/解决来梳理。
Linux 设计原则:空闲内存 = 浪费内存,所以会尽量用内存做缓存。
但当 可用内存不足 时,内核会通过 kswapd 回收 page cache。
表现:
free -h 中 available 很小cache/buffer 突然下降查看:
free -h
cat /proc/meminfo | egrep 'MemAvailable|Buffers|Cached'
解决:
Linux 缓存是与文件内容强一致的:
truncate / fallocate 也会失效正常现象,不属于 bug。
以下情况不会走 page cache:
O_DIRECT 打开文件验证:
strace -e trace=open,openat mysql ...
解决:
Linux 不会无限缓存:
现象:
cache 增长但不持久优化:
# 减少 swap 倾向
sysctl vm.swappiness=10
# 保护文件缓存
sysctl vm.vfs_cache_pressure=50
以下操作会频繁刷新元数据缓存:
ls -l 大量文件查看:
slabtop
cat /proc/slabinfo | grep dentry
常见“误操作”:
echo 3 > /proc/sys/vm/drop_caches
这会立即清空:
在以下环境中缓存“看起来失效”:
查看:
numactl --hardware
cat /sys/fs/cgroup/memory/memory.stat
sar -B 1
关注:
cache 使用量pgpgin / pgpgoutfault / majflt(主要缺页 = 缓存未命中)ps -o min_flt,maj_flt,cmd -p <pid>
maj_flt 高 = 缓存没用上vmtouch file
# 或
fincore file
❌ “Linux 缓存不会丢”
✅ 会丢,且应该丢
❌ “free 变少就是内存泄漏”
✅ 很可能只是 cache 在正常工作
❌ “drop_caches 能提升性能”
✅ 通常反而更慢
Linux 缓存“失效”大多不是 bug,而是内存压力、IO 模式、或配置导致缓存被回收或未使用。
如果你能补充:
我可以给你更精准的排查路径。