温馨提示×

linux缓存为何变小

小樊
42
2026-10-18 06:48:03
栏目: 智能运维

在 Linux 系统中,“缓存变小”通常指 page cache / buffer cache / slab cache 等可用缓存减少,或者你观察到 free、top、/proc/meminfo 里 cached 字段下降。常见原因可分为以下几类:


一、系统主动回收缓存(最常见)

1. 内存压力(可用内存不足)

当 空闲内存(free)变少,内核会:

  • 回收 page cache
  • 换出匿名页(如果开了 swap)

表现:

free -h
              total        used        free      shared  buff/cache   available
Mem:           16Gi       14Gi       300Mi       200Mi       1.5Gi       1.2Gi

buff/cache 明显变小

✅ 这是正常行为,Linux 会优先用内存做缓存,不够再回收。


2. swappiness 设置影响

  • swappiness 高 → 更容易回收缓存 / 换出内存
  • 默认值一般是 60

查看:

cat /proc/sys/vm/swappiness

二、手动或自动释放缓存

1. 手动清理

echo 3 > /proc/sys/vm/drop_caches

会立即清空 page cache / dentries / inodes


2. 某些程序或监控脚本自动清理

例如:

  • 运维脚本
  • 容器平台
  • 监控agent

三、应用行为变化

1. 文件读写减少

缓存是“用出来的”:

  • 读文件 → 进 page cache
  • 不再读 → 被回收

如果:

  • 服务重启
  • 流量下降
  • 数据访问模式变化

缓存自然变小


2. 使用了 O_DIRECT

某些数据库(MySQL、PostgreSQL)或程序使用:

open(path, O_DIRECT)

会绕过 page cache


3. 大文件 / 流式处理

大文件顺序读写时:

  • 内核可能认为不值得缓存
  • 或很快被回收

四、内存被其他部分占用

1. 用户进程内存增长

  • Java / Go / Python
  • 容器内存限制

导致:

used ↑
buff/cache ↓

2. slab / 内核内存增长

查看:

cat /proc/meminfo | grep Slab

或

slabtop

常见原因:

  • 网络连接过多
  • 文件句柄多
  • 内核模块泄漏

3. 透明大页(THP)或内存碎片

可能导致:

  • 缓存分配失败
  • 看起来“缓存变小”

五、容器 / 虚拟化环境

1. cgroup 内存限制

容器内:

  • cache 受 cgroup 限制
  • 超阈值被回收

查看:

cat /sys/fs/cgroup/memory/memory.stat

2. 宿主机回收

宿主机内存紧张 → 杀容器或回收缓存


六、系统参数影响缓存

1. dirty ratio 相关

vm.dirty_ratio
vm.dirty_background_ratio

影响写入缓存,不直接减少读缓存,但会影响整体表现


2. vfs_cache_pressure

cat /proc/sys/vm/vfs_cache_pressure

值越大 → 越容易回收 dentry / inode 缓存


七、如何判断“是否正常”

✅ 正常情况:

  • 空闲内存少
  • 缓存自动回收
  • 性能无明显下降

❌ 异常情况:

  • 缓存持续变小
  • 磁盘 IO 明显升高
  • 系统变慢
  • OOM / 频繁 swap

八、快速排查命令

free -h
top
vmstat 1
cat /proc/meminfo
slabtop
dmesg | grep -i oom

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

  • 是 物理机 / 虚拟机 / 容器
  • 用的 发行版和内核版本
  • free -h 和 /proc/meminfo 输出

我可以帮你更精确定位原因。

0 踩