Linux 核心為提升 I/O 效能會積極佔用空閒記憶體作為 Page Cache、Dentry Cache、Inode Cache。長期運行後可用記憶體極低,但實際應用未必需要這些緩存。本文詳細解析 /proc/sys/vm/drop_caches 三級釋放機制、安全前置操作、自動化腳本與監控告警策略。
| 值 | 釋放內容 | 適用場景 | 風險等級 |
|---|---|---|---|
0 | 不釋放 (預設) | 正常運行 | 無 |
1 | Page Cache (文件內容緩存) | 文件密集型應用釋放 | 低 |
2 | Dentry + Inode Cache (目錄項/索引節點) | 大量文件操作後 (find、ls、備份) | 低 |
3 | 全部 (1+2) | 記憶體壓力臨界、測試基準 | 中 (可能導致短暫 I/O 爆增) |
sync
# 將所有 dirty pages 刷入磁碟,確保數據一致性
# 等同於 syscall sync(),阻塞至完成
# 釋放全部緩存 (最常用)
echo 3 > /proc/sys/vm/drop_caches
# 或釋放特定類型
echo 1 > /proc/sys/vm/drop_caches # 僅 Page Cache
echo 2 > /proc/sys/vm/drop_caches # 僅 Dentry/Inode
sync && echo 3 > /proc/sys/vm/drop_caches
# 釋放前
free -h
# total used free shared buff/cache available
# Mem: 31G 28G 200M 1.2G 2.8G 1.5G
# 釋放後
free -h
# total used free shared buff/cache available
# Mem: 31G 25G 3.2G 1.2G 2.8G 4.0G
# ^^^ available 顯著增加,buff/cache 可能暫時不變 (尚未被回收)
# /etc/sysctl.d/99-drop-caches.conf
# 不建議持久化非 0 值,會導致啟動時釋放緩存,影響啟動速度
# 僅建議配置相關參數:
vm.vfs_cache_pressure = 100 # 預設 100,調大加速 Dentry/Inode 回收
vm.swappiness = 60 # 預設 60,調小減少 Swap 傾向
# /etc/cron.d/drop-caches
# 每天凌晨 3 點釋放 (業務低峰)
0 3 * * * root sync && echo 3 > /proc/sys/vm/drop_caches 2>&1 | logger -t drop-caches
#!/bin/bash
# /usr/local/bin/auto-drop-caches.sh
THRESHOLD_PCT=90 # 記憶體使用率超過 90% 觸發
while true; do
USED_PCT=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
if [[ $USED_PCT -ge $THRESHOLD_PCT ]]; then
logger -t auto-drop-caches "Memory usage ${USED_PCT}% >= ${THRESHOLD_PCT}%, dropping caches"
sync && echo 3 > /proc/sys/vm/drop_caches
fi
sleep 60
done
# /etc/systemd/system/auto-drop-caches.service
[Unit]
Description=Auto Drop Caches on Memory Pressure
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/auto-drop-caches.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
systemctl enable --now auto-drop-caches
kswapd、vmscan 會在記憶體壓力時自動回收page allocation failure)| 方案 | 機制 | 適用場景 |
|---|---|---|
posix_fadvise(..., POSIX_FADV_DONTNEED) | 應用層提示核心釋放特定文件緩存 | 備份/掃描工具主動釋放 |
vmtouch | 用戶態工具鎖定/釋放文件緩存 | 精確控制熱點數據駐留 |
Cgroups memory.limit_in_bytes | 限制進程組緩存佔用 | 多租戶隔離 |
調整 vm.vfs_cache_pressure | 改變核心回收 Dentry/Inode 積極度 | 大量文件元數據操作場景 |
理解 drop_caches 三級機制與 sync 前置強制要求,配合記憶體壓力觸發而非定時釋放策略,才能在保障數據安全前提下精準緩解記憶體壓力,而非盲目追求「可用記憶體數字好看」。