bcache 与 dm-cache:Linux SSD 缓存比较
11 分钟阅读 - 2026年5月28日

比较 bcache 和 dm-cache 在 Linux 上的 SSD 缓存。设置、性能、缓存模式以及何时使用。
bcache 的工作原理
自 3.10 版本(2013 年 6 月)起,bcache 已集成于 Linux 内核中。它在块层运行,因此可与任何支持 UUID 的文件系统配合使用。
在内部,bcache采用混合B+树/日志结构。它将SSD存储空间划分为固定大小的桶(128K至2MB),并对齐至擦除块边界。这将随机写入转换为顺序写入,从而降低写入放大效应并延长SSD使用寿命。超过4MB的顺序I/O操作会自动绕过缓存,使SSD专注于其最具价值的随机访问模式。
Bcache 还会实时监控 SSD 的延迟。如果读取延迟超过 2 毫秒或写入延迟超过 20 毫秒,它会限制流量,以防止缓存设备成为瓶颈。
设置
安装 bcache-tools,然后格式化您的后端设备和缓存设备:
make-bcache -B /dev/sdb # format HDD as backing device
make-bcache -C /dev/sdc # format SSD as cache device
echo <UUID> > /sys/block/bcache0/bcache/attach # attach cache运行时调优通过 /sys/block/bcache<N>/bcache/ sysfs 接口进行,您可以在其中调整缓存模式、顺序 I/O 阈值和延迟目标。对于 RAID 阵列,请使用 --data-offset 与您的条带宽度对齐。
注意事项:此配置会破坏数据。两个设备都必须格式化为 bcache 目标,因此您无法在不先擦除现有文件系统的情况下将其添加到 bcache 中。此外,bcache 设备在创建后无法调整大小。
性能
Bcache 的写入合并功能使其在随机写入方面表现强劲。在基准测试中,其随机 4K 写入 IOPS 约达 18,500,而仅使用原始 SSD 时仅为 12,200 IOPS。在性能强劲的硬件支持下,随机读取吞吐量可达约 1,000,000 IOPS。
对于加密工作负载,建议在 /dev/bcache<N> ,而非单独加密底层驱动器。这种方式通常性能更佳,因为 Bcache 仍可在加密前对写入操作进行合并。
dm-cache 的工作原理
dm-cache 是一个位于现有逻辑卷之上的 Device Mapper 目标。它使用三个子设备:源设备(HDD)、缓存设备(SSD 或 NVMe)以及用于跟踪块位置和脏数据状态的元数据设备。默认缓存策略为 smq(随机多队列),可在混合工作负载中识别热数据。
其主要优势在于:dm-cache 可在不破坏现有数据的情况下,叠加到正在运行的 LVM 卷上。您还可以使用标准的 LVM 命令对其进行调整大小。
通过 LVM 进行配置
配置 dm-cache 的实用方法是通过 lvmcache。手动 dmsetup 配置虽可行,但易出错且无法在重启后保留。LVM 配置方法:
- 在 HDD 和 SSD 上分别创建物理卷 (PV)。
- 将这两个 PV 添加到同一个卷组 (VG) 中。
- 创建三个逻辑卷:一个用于存储数据(HDD),一个用于缓存(SSD),一个用于元数据(SSD)。
- 将缓存和元数据逻辑卷合并为一个缓存池:
lvconvert --type cache-pool --poolmetadata <meta_lv> <cache_lv> - 将缓存池挂载到源设备上:
lvconvert --type cache --cachepool <pool_lv> <data_lv>
需注意一点:应通过其 /dev/mapper/ 路径挂载文件系统,而非通过 UUID。通过 UUID 挂载可能会绕过缓存层,直接访问源设备。
性能与内存
在写回模式下,面对 90/10 读写比例的 Zipf 工作负载,dm-cache 实现了约 193 MB/s 的读取速度和约 21 MB/s 的写入速度。在另一项基准测试中,使用 10 GB NVMe 分区对 100 GB HDD 进行缓存,将随机写入 IOPS 从 118 提升至 798。
相应的代价是内存消耗。dm-cache 的元数据开销取决于块大小。若采用 512 字节的块大小,每 100 GB 缓存可能消耗超过 16 GB 的 RAM。将块大小提升至 4,096 字节后,内存使用量可降至每 100 GB 约 2 GB。 请选择接近平均 I/O 大小的块大小(64 KB 是一个合理的起点),并确保其在 32 KB 至 1 GB 范围内,且为 64 个扇区(32 KB)的倍数。
元数据会在每次 FLUSH 或 FUA 写入时刷新,或至少每秒刷新一次。为确保高可用性,请对元数据设备进行镜像,以避免单点故障。
缓存模式
bcache 和 dm-cache 均支持相同的核心缓存模式。选择哪种模式将同时影响性能和数据安全性。
| 模式 | 工作原理 | 速度 | 风险 |
|---|---|---|---|
| 写穿模式 | 写入数据同时写入 SSD 和 HDD | 仅读取加速 | 低。HDD 始终拥有最新数据。 |
| 写回 | 写入数据先存入 SSD,稍后刷新到 HDD | 读写加速 | 较高。若在数据刷新前 SSD 发生故障,将导致数据丢失。 |
| 绕写/直通 | 写入完全绕过缓存 | 仅提升读取速度,减少 SSD 磨损 | 低。HDD 始终保留最新数据。 |
对于这两款工具,写穿(Writethrough)是安全的默认选项。写回(Writeback)速度更快,但存在实际风险:如果 SSD 在存储未刷新数据时发生故障,这些数据将丢失,且文件系统可能损坏。仅当您拥有冗余 SSD 或能够容忍偶发数据丢失时,才应使用写回模式。
bcache 与 dm-cache:该选哪个
| Factor | bcache | dm-cache |
|---|---|---|
| 在现有数据上的部署 | 破坏性(需要清空) | 非破坏性(在线转换) |
| 调整大小 | 不支持 | 通过 LVM 支持 |
| 随机写入优化 | 强(顺序写入合并) | 标准 |
| 顺序 I/O 旁路 | 自动(>4MB) | 由 smq 策略管理 |
| 内存开销 | 低(B+树) | 较高(取决于块大小) |
| 元数据 | 位于缓存设备上 | 独立设备,可进行镜像 |
当您从零开始构建新系统并希望获得最佳随机 I/O 性能时,请使用 bcache。对于数据库和虚拟机存储等写入密集型工作负载,以及随机写入开销巨大的 RAID 6 阵列,这是更优的选择。
当您需要为已投入生产的服务器添加缓存时,请使用 dm-cache。其与 LVM 的集成意味着您可以在不造成停机或数据迁移的情况下挂载缓存。它更适合读取密集型工作负载,以及需要灵活调整存储容量或实时重新配置存储的环境。
结论
这两种工具虽解决相同的问题,但适用于不同的场景。对于新搭建的系统,Bcache 是性能优选;对于现有的 LVM 系统,dm-cache 则是实用之选。无论您选择哪一种,建议先从写穿模式开始,待您确信 SSD 的可靠性后,若需要更高的写入性能,再切换至写回模式。
若您需要配备 SSD 缓存配置的专用服务器,请了解 FDC 的专用服务器方案。
用于 Linux 数据包处理的 XDP 和 eBPF
XDP 和 eBPF 如何在网卡驱动程序层处理每秒数百万个数据包。基准、DDoS 用例、工具链设置和硬件要求。
14 分钟阅读 - 2026年5月27日
为什么必须拥有功能强大且不计量的 VPS
3 分钟阅读 - 2025年5月9日