lvmcache 和 dm-cache 有什么区别?

lvmcache 和 dm-cache 有什么区别?

最近我发现一篇文章提到最近dm-cachelinux 有了显着的改进。我还发现在用户空间中您将其视为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

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

相关内容