lvmcache/dm-cache 写回缓存全部性能

lvmcache/dm-cache 写回缓存全部性能

我在 HDD 前面有一个 SSD 写回缓存,通过 lvmcache 设置(因此是 dm-cache)。当缓存 LV 未满(Data%列中lvs< 100.00%)时,写入将转到缓存设备(通过 监控dstat)。但是,当缓存 LV 已满(Data%= 100.00%)时,写入将直接转到 HDD,本质上成为写通缓存。即使过了一段时间,块也不会从 SSD 缓存中逐出,并且性能会下降。当我尝试从缓存 LV 读取最近读取的数据时,读取来自 SSD,因此我认为整个 SSD 现在已成为读取缓存。即使在写回模式下,这也是 dm-cache 写入缓存的预期行为吗?没有为写入保留的空间吗?这似乎是一个非常糟糕的设计,因为在缓存成为写通缓存之前,用户基本上只能写入一个缓存 LV 的数据。

我的理解是 dm-cache 使用mq 驱逐算法,但这仅适用于读取缓存,因此与我观察到的写入缓存问题无关。

有没有办法为写缓存保留空间,或者同时使用 dm-writecache(我理解它不会执行任何读取缓存)和 dm-cache?

答案1

dm-cache是一个“缓慢移动”的缓存:需要多次读/写未命中才能提升一个块,尤其是当提升一个新块意味着降级已缓存的。

的固定块特性dm-cache,加上没有保留的只写区域,意味着需要对相同的非缓存块进行多次写入才能触发块升级/替换。然而,这也意味着内核页面缓存不会“吸收”这些多次丢失的写入,而是将它们合并为对底层块设备的一次写入。

换句话说,您可能看到了内核页面缓存(吸收和合并写入)的综合效果不愿意dm-cache推广第一个错过的区块。

如果你只想保留一些设备/空间用于写入缓存,你可以利用dm-writecache(和通常lvmcache

附加信息:

dm-cache块升级/降级跟踪访问命中/未命中。首先,您有一个空缓存,所有 I/O 都指向原始(慢速)设备。因此,当您发出 4K 读取时,它将访问底层慢速设备,并dm-cache跟踪未命中。在对相同的缓存块(默认 32K),然后全部的缓存块被复制到快速设备。如果你现在写入缓存块,你的写入将被缓存。但是,如果你的写入是针对未缓存的块,它会直接进入原始(慢速)设备。在进行其他一些未缓存的写入之后,dm-cache最终将分配整个缓存块(请记住,默认情况下为 32K),将原始数据复制到缓存设备。此时,可以从缓存中提供新的读取/写入。降级很简单:当必须提升新块时,最旧的块将被丢弃/刷新。

换句话说,要缓存写入,必须分配相应的缓存段,并且必须在缓存设备上复制备份数据(写入时分配)。为了限制源和缓存设备之间的带宽使用,此复制仅在多次未命中后进行(即:一次未命中将不是提升一个块)。请注意,多次读取同一个未缓存的块将不是工作,因为内核页面缓存将简单地自行提供缓存块。

dm-writecache其工作方式不同,更类似于传统的 RAID 控制器写回缓存。它缓存全部写入,忽略读取。它几乎可以被视为“只写 L2 页面缓存”,其中脏页被“交换”以等待慢速设备赶上。要使用它,您需要在dm-cache(此时必须作为writethrough缓存运行)和之间划分快速设备dm-writecache,或为它们分配不同的设备。我绝不尝试通过 LVM 执行此操作,我怀疑该工具会阻止您嵌套/堆叠两个不同的缓存模块。但是,您可以通过直接dmsetup命令尝试。

相关内容