最近我发现一篇文章提到最近dm-cache
linux 有了显着的改进。我还发现在用户空间中您将其视为lvmcache
.这对我来说很困惑。我认为 LVM 缓存机制与dm-cache
.在我的服务器上,我使用命令dm-cache
直接在设备映射器级别上进行设置dmsetup
。不涉及 LVM 命令。
那么到底是什么?lvmcache
仅使用 CLI 就可以更轻松地进行设置吗dm-cache
?使用它而不是原始dmsetup
命令是更好的主意吗?
我当前的脚本如下所示:
#!/bin/bash
CACHEPARAMS="512 1 writethrough default 0"
CACHEDEVICES="o=/dev/mapper/storage c=/dev/mapper/suse-cache"
MAPPER="storagecached"
if [ "$1" == "-u" ] ; then
{
for i in $CACHEDEVICES ; do
if [ "`echo $i | grep \"^c=\"`" != "" ] ; then
__CACHEDEV=${i:2}
elif [ "`echo $i | grep \"^o=\"`" != "" ] ; then
__ORIGINALDEV=${i:2}
fi
done
dmsetup suspend $MAPPER
dmsetup remove $MAPPER
dmsetup remove `basename $__CACHEDEV`-blocks
dmsetup remove `basename $__CACHEDEV`-metadata
}
else
{
for i in $CACHEDEVICES ; do
if [ "`echo $i | grep \"^c=\"`" != "" ] ; then
__CACHEDEV=${i:2}
elif [ "`echo $i | grep \"^o=\"`" != "" ] ; then
__ORIGINALDEV=${i:2}
fi
done
__CACHEDEVSIZE="`blockdev --getsize64 \"$__CACHEDEV\"`"
__CACHEMETASIZE="$(((4194304 + (16 * $__CACHEDEVSIZE / 262144))/512))"
if [ "$__CACHEMETASIZE" == ""$(((4194303 + (16 * $__CACHEDEVSIZE / 262144))/512))"" ] ; then
__CACHEMETASIZE="$(($__CACHEMETASIZE + 1))" ; fi
__CACHEBLOCKSSIZE="$((($__CACHEDEVSIZE/512) - $__CACHEMETASIZE))"
__ORIGINALDEVSIZE="`blockdev --getsz $__ORIGINALDEV`"
dmsetup create `basename $__CACHEDEV`-metadata --table "0 $__CACHEMETASIZE linear /dev/mapper/suse-cache 0"
dmsetup create `basename $__CACHEDEV`-blocks --table "0 $__CACHEBLOCKSSIZE linear /dev/mapper/suse-cache $__CACHEMETASIZE"
dmsetup create $MAPPER --table "0 $__ORIGINALDEVSIZE cache /dev/mapper/`basename $__CACHEDEV`-metadata /dev/mapper/`basename $__CACHEDEV`-blocks $__ORIGINALDEV $CACHEPARAMS"
dmsetup resume $MAPPER
}
fi
会lvmcache
做得更好吗?我觉得这样做还不错,因为我知道发生了什么,我并不看重易用性,而看重设置的清晰度。但是,如果使用 lvmcache 设置缓存会得到更好的优化,那么我认为使用它是毫不费力的。
答案1
lvmcache
dm-cache
建立在;之上它dm-cache
使用逻辑卷进行设置,并避免必须计算块偏移和大小。一切都记录在联机帮助页中;基本思想是使用
- 原始LV(慢,要缓存)
- 新的缓存数据LV
- 新的缓存元数据 LV
两个缓存 LV 被分组为一个“缓存池”LV,然后原始 LV 和缓存池 LV 被分组为一个缓存 LV,您可以使用该 LV 来代替原始 LV。
lvmcache
还可以轻松设置冗余缓存、更改缓存模式或策略等。
答案2
@stephen-kitt 很好地总结了差异。在每个或多或少的当前系统上,尽可能使用 lvmcache(7),它将节省您大量的时间和精力。它还在 RHEL 7.2+(从内核 4.2 向后移植)和 SLES 最新版本中集成和支持。当然Debian和Ubuntu应该没问题。
我最近在布拉格的 LinuxDays 2017 上就这个问题发表了演讲:https://www.youtube.com/watch?v=6W_xK5Ks-Lw
幻灯片:https://www.linuxdays.cz/2017/video/Adam_Kalisz-SSD_cache_testing.pdf