頻繁文件訪問導致 Cache 佔用大量內存,影響應用分配。本文介紹 sync + drop_caches 手動釋放流程、三級釋放模式、sysctl 參數永久調優策略及生產環境注意事項。
手動釋放流程
# 1. 將臟頁寫回磁盤(關鍵步驟)
sync
# 2. 釋放 Cache
echo 3 > /proc/sys/vm/drop_caches
三級釋放模式
| 值 | 釋放內容 | 適用場景 |
1 | PageCache(頁面緩存) | 僅釋放文件數據緩存 |
2 | dentries + inodes(目錄項 + 索引節點) | 釋放文件系統元數據緩存 |
3 | PageCache + dentries + inodes | 徹底釋放(最常用) |
sysctl 永久調優參數 (/etc/sysctl.conf)
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 3000
vm.swappiness = 60
vm.vfs_cache_pressure = 100
vm.overcommit_memory = 0
vm.lowmem_reserve_ratio = 32 32 8
參數詳細解讀
| 參數 | 默認值 | 推薦調優方向 | 說明 |
dirty_ratio | 20% | 5-15% | 臟頁佔比達到此值觸發同步寫回 |
dirty_background_ratio | 10% | 3-10% | 後台寫回線程啟動閾值 |
dirty_writeback_centisecs | 500 | 100-1000 | 後台寫回檢查間隔(厘秒) |
dirty_expire_centisecs | 3000 | 1000-5000 | 臟頁超時強制寫回時間 |
swappiness | 60 | 10-60 | 傾向換出匿名頁 vs 文件頁(數值越大越傾向 Swap) |
vfs_cache_pressure | 100 | 50-200 | 傾向回收 dentry/inode 緩存(數值越大越激進) |
overcommit_memory | 0 | 0/1/2 | 0=啟發式,1=總是允許,2=嚴格檢查 |
生產環境最佳實踐
- 不建議定時腳本釋放:Cache 有益於性能,頻繁釋放反而增加 I/O
- 調優核心參數:根據業務類型(數據庫/文件服務器/Web)調整 dirty_* 與 swappiness
- 監控指標:關注
Cached、Buffers、SwapUsed、PageIn/Out 趨勢
- 應用層優化:數據庫配置
innodb_buffer_pool_size、JVM -Xmx 限制堆內存
驗證命令
free -h # 觀察 available/cached 變化
cat /proc/meminfo # 詳細內存分佈
sysctl -a | grep vm # 查看當前 vm 參數