写缓存目标

写缓存目标将写入缓存到持久内存或 SSD 上。它不缓存读取,因为读取通常被缓存在普通 RAM 的页缓存中。

构造设备时,第一个扇区应清零,或者第一个扇区应包含上次调用的有效超级块。

构造函数参数

  1. 缓存设备类型 - “p” 或 “s”
    • p - 持久内存

    • s - 固态硬盘 (SSD)

  2. 将被缓存的底层设备

  3. 缓存设备

  4. 块大小 (推荐 4096;最大块大小为页大小)

  5. 可选参数的数量 (带参数的参数计为两个)

    start_sector n (默认值: 0)

    从缓存设备开始处的偏移量,以 512 字节扇区为单位

    high_watermark n (默认值: 50)

    当已用块数量达到此水印时,开始回写

    low_watermark x (默认值: 45)

    当已用块数量低于此水印时,停止回写

    writeback_jobs n (默认值: 无限制)

    限制回写过程中正在传输的块的数量。设置此值会降低回写吞吐量,但可能会改善读取请求的延迟。

    autocommit_blocks n (默认值: 持久内存为 64,固态硬盘为 65536)

    当应用程序写入此数量的块而未发出 FLUSH 请求时,这些块将自动提交

    autocommit_time ms (默认值: 1000)

    自动提交时间,以毫秒为单位。如果此时间过去且未收到 FLUSH 请求,数据将自动提交

    fua (默认启用)

    仅适用于持久内存 - 将数据从持久内存回写到底层设备时使用 FUA 标志

    nofua

    仅适用于持久内存 - 回写数据时不使用 FUA 标志,并在之后发送 FLUSH 请求

    • 有些底层设备使用 fua 性能更好,有些则使用 nofua。用户应进行测试

    清理器

    当此选项被激活(无论是通过构造函数参数还是通过消息)时,缓存将不会提升新的写入(但是,对已缓存块的写入会得到提升,以避免因写入顺序错误导致的数据损坏),并且它将逐渐回写所有缓存的数据。用户空间随后可以通过“dmsetup status”监控清理过程。当缓存块的数量降至零时,用户空间可以卸载 dm-writecache 目标并将其替换为 dm-linear 或其他目标。

    max_age n

    指定块的最大年龄,以毫秒为单位。如果一个块在缓存中存储时间过长,它将被写入底层设备并被清理。

    仅元数据

    只有元数据被提升到缓存。此选项可提高处理更重度的 REQ_META 工作负载的性能。

    pause_writeback n (默认值: 3000)

    如果在过去的 n 毫秒内有写入 I/O 重定向到原始卷,则暂停回写

状态

  1. 错误指示器 - 如果没有错误则为 0,否则为错误号

  2. 块的数量

  3. 空闲块的数量

  4. 正在回写的块的数量

  5. 读取块的数量

  6. 命中缓存的读取块的数量

  7. 写入块的数量

  8. 命中未提交块的写入块的数量

  9. 命中已提交块的写入块的数量

  10. 绕过缓存的写入块的数量

  11. 在缓存中分配的写入块的数量

  12. 在空闲列表中被阻塞的写入请求数量

  13. 刷新请求的数量

  14. 丢弃块的数量

消息
flush

刷新缓存设备。如果缓存设备成功刷新且无错误,则消息返回成功

flush_on_suspend

在下次暂停时刷新缓存设备。当您要移除缓存设备时使用此消息。移除缓存设备的正确步骤是

  1. 发送“flush_on_suspend”消息

  2. 加载一个非活动表,其线性目标映射到底层设备

  3. 暂停设备

  4. 请求状态并验证没有错误

  5. 恢复设备,以便它将使用线性目标

  6. 缓存设备现在处于非活动状态,可以删除

清理器

请参阅上面“清理器”构造函数文档。

clear_stats

清除状态行上报告的统计信息