Linux 缓存过大的定位与处理
一、先判断是否需要处理
free -h
当 available 充足且系统无异常抖动时,无需人工清理,内核会在需要时自动回收缓存。若观察到频繁回收导致 IO 升高或应用延迟,再考虑干预。二、紧急释放缓存的安全做法
sync
# 仅释放页缓存 PageCache
echo 1 | sudo tee /proc/sys/vm/drop_caches
# 仅释放目录项与索引节点 dentry/inode
echo 2 | sudo tee /proc/sys/vm/drop_caches
# 同时释放 PageCache、dentry 与 inode
echo 3 | sudo tee /proc/sys/vm/drop_caches
三、定位是什么占用了缓存
free -h
vmstat 1
top/htop
# 查找大于 1G 的文件
sudo find / -type f -size +1G -exec du -h {} \; 2>/dev/null
# 使用 hcache 观察进程级文件缓存占用(需先安装)
hcache -top 10
# 或按进程汇总
hcache -pid <PID> | awk '{print $4}' | paste -sd+ - | bc
四、治本优化与参数建议
# 查看当前脏页相关参数
sysctl -a | grep dirty
# 示例:降低脏页阈值,提前回刷(数值需结合业务与内存大小谨慎调整)
sudo sysctl -w vm.dirty_background_ratio=5
sudo sysctl -w vm.dirty_ratio=10
sudo sysctl -w vm.dirty_expire_centisecs=3000
sudo sysctl -w vm.dirty_writeback_centisecs=500
# 查看当前水位线
cat /proc/zoneinfo | grep -A10 'Node 0'
# 适度提高 min_free_kbytes(示例:约 2GB 内存设为 2097152 KB)
sudo sysctl -w vm.min_free_kbytes=2097152
# 如内核支持,可进一步调整 extra_free_kbytes(示例:约 1GB)
sudo sysctl -w vm.extra_free_kbytes=1048576
五、不建议的做法
vm.drop_caches=3 写入 /etc/sysctl.conf 作为长期配置,或在高峰期频繁定时清理。这既治标不治本,又会引入不必要的 IO 抖动与性能波动。vm.min_free_kbytes 或 vm.extra_free_kbytes,可能导致直接回收、应用阻塞甚至 hang,需结合负载与内存容量谨慎评估。