RAID卡缓存策略需用MegaCli或storcli查看,Current Cache Policy决定实际生效策略,BBU异常会强制降级为WriteThrough;内核page cache无策略开关,仅通过vm参数间接调控。

查 RAID 卡缓存策略用 MegaCli 或 storcli
普通内存缓存(如 page cache)没有“策略开关”,但硬件 RAID 卡(尤其是 LSI/MegaRAID 系统)有明确的可配置缓存策略,且实际生效策略可能和默认值不一致——最常见原因是 BBU(电池备份单元)异常导致自动降级为 WriteThrough。
执行以下命令查看当前生效策略:
MegaCli -LDInfo -Lall -aALL | grep -E "(DefaultCache|Current Cache)"
输出中重点关注 Current Cache Policy 行,例如:
Current Cache Policy: WriteThrough, ReadAhead, Direct, NoWriteCacheifBad BBU
-
WriteThrough表示写操作绕过缓存直写磁盘,性能低但数据安全;WriteBack表示启用回写缓存,需依赖 BBU 正常 -
NoWriteCacheifBad BBU是关键提示:只要 BBU 状态异常(老化、未充电、故障),控制器就会强制禁用写缓存,即使你设了WriteBack - 若需确认 BBU 状态,运行
MegaCli -AdpBbuCmd -GetBbuStatus -aALL,检查Relative State of Charge和Is Battery Pack Missing
查内核页缓存行为看 /proc/sys/vm 参数
Linux 内核不提供“缓存策略”开关,但通过 /proc/sys/vm/ 下的参数影响缓存回收与脏页刷盘节奏,间接决定缓存是否“愿意留久一点”。
常用相关参数:
-
vm.vfs_cache_pressure:控制 inode/dentry 缓存回收强度。值越高(默认 100),越激进地回收元数据缓存;设为50可保留更多目录项缓存 -
vm.swappiness:影响内核倾向使用 swap 还是回收 page cache。值为0并不完全禁用 swap,但会极大降低 page cache 被换出概率 -
vm.dirty_ratio和vm.dirty_background_ratio:决定脏页何时开始后台刷盘、何时阻塞写入。调高前者(如80)可让缓存更“懒”,但增加掉电丢数据风险
查看当前值:sysctl vm.vfs_cache_pressure vm.swappiness;临时修改用 sysctl -w vm.swappiness=10。
区分 Cached 和 Buffers 的真实含义
很多用户误以为 free 输出里的 buff/cache 是“可释放缓存总量”,其实它由两部分组成,用途和释放方式完全不同:
-
Buffers(来自/proc/meminfo的Buffers:行):块设备 I/O 的临时缓冲区,比如 ext4 日志写入前暂存。通常很小(几十 MB),且不能被drop_caches清掉 -
Cached(来自/proc/meminfo的Cached:行):主要是 page cache,即文件内容缓存。这部分在内存压力下会被自动回收,也可手动清:echo 1 > /proc/sys/vm/drop_caches - 注意:
Cached不包含 slab 缓存(如 dentry/inode),后者需用slabtop单独看,或查/proc/meminfo中的SReclaimable
监控缓存命中率只能靠应用层或 eBPF
Linux 内核本身不暴露 page cache 命中/未命中计数,free、vmstat 等工具只告诉你用了多少缓存,不告诉你用得“好不好”。
可行路径只有两个:
- 对特定文件访问场景,用
perf抓page-faults事件,对比 major/minor fault 比例(minor fault 多说明缓存命中) - 用 eBPF 工具如
bpftrace跟踪do_page_fault或filemap_fault,统计缓存路径 vs 磁盘路径调用次数 - 不要依赖
iostat -x的r_await/w_await推断缓存效果——它反映的是 I/O 队列延迟,不是缓存是否起作用
真正难的不是“怎么查”,而是理解:缓存策略在 Linux 里是分层的——硬件层(RAID 卡)、内核层(page cache 回收逻辑)、应用层(open() 时加 O_DIRECT 绕过缓存)。查错时必须先锁定问题发生在哪一层,否则所有命令都只是在看表象。


















