bcache 与 dm-cache:Linux SSD 缓存比较

11 分钟阅读 - 2026年5月28日

hero section cover
目录
  • bcache 与 dm-cache:Linux 上的 SSD 缓存
  • bcache 的工作原理
  • dm-cache 的工作原理
  • 缓存模式
  • bcache 与 dm-cache:该选哪个
  • 结论
分享

比较 bcache 和 dm-cache 在 Linux 上的 SSD 缓存。设置、性能、缓存模式以及何时使用。

bcache 与 dm-cache:Linux 上的 SSD 缓存

SSD 速度快但每 GB 价格昂贵;HDD 价格低廉但速度较慢。Linux 提供了两种内核级工具来将它们结合使用:bcachedm-cache。两者均将 SSD 作为大型 HDD 前端的透明缓存,但在架构、配置要求以及最佳适用场景方面存在差异。


 

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 配置方法:

  1. 在 HDD 和 SSD 上分别创建物理卷 (PV)。
  2. 将这两个 PV 添加到同一个卷组 (VG) 中。
  3. 创建三个逻辑卷:一个用于存储数据(HDD),一个用于缓存(SSD),一个用于元数据(SSD)。
  4. 将缓存和元数据逻辑卷合并为一个缓存池:
    lvconvert --type cache-pool --poolmetadata <meta_lv> <cache_lv>
  5. 将缓存池挂载到源设备上:
    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:该选哪个

Factorbcachedm-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

用于 Linux 数据包处理的 XDP 和 eBPF

XDP 和 eBPF 如何在网卡驱动程序层处理每秒数百万个数据包。基准、DDoS 用例、工具链设置和硬件要求。

14 分钟阅读 - 2026年5月27日

为什么必须拥有功能强大且不计量的 VPS

3 分钟阅读 - 2025年5月9日

更多文章