Qual é a diferença entre o lvmcache e o dm-cache?

4

Recentemente eu encontrei artigo mencionando que recentemente o dm-cache melhorou significativamente no linux. Eu também achei que no userspace você vê isso como lvmcache . E é bastante confuso para mim. Eu pensei que o mecanismo de armazenamento em cache do LVM é algo diferente de dm-cache . No meu servidor, estou usando dm-cache configurado diretamente no nível do mapeador de dispositivo usando os comandos dmsetup . Nenhum comando LVM envolvido.

Então, o que é isso no final? É lvmcache apenas CLI para facilitar a configuração de dm-cache ? É melhor usá-lo insdead dos comandos dmsetup brutos?

Meu script atual é assim:

#!/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

O lvmcache faria melhor? Eu me sinto bem em fazer isso porque vejo o que está acontecendo. Eu não valorizo a facilidade de uso mais do que a clareza de configuração. No entanto, se o cache configurado usando o lvmcache seria melhor otimizado, então eu acho que não é fácil usá-lo.

    
por Lapsio 29.11.2016 / 07:37

2 respostas

3

lvmcache é construído em cima de dm-cache ; ele define dm-cache usando volumes lógicos e evita ter que calcular os offsets de bloco e tamanhos . Tudo está documentado na manpage; a ideia básica é usar

  • o LV original (lento, para ser armazenado em cache)
  • um novo dado de cache LV
  • um novo LV de metadados do cache

Os dois LVs de cache são agrupados em um "pool de cache" LV, então o LV original e o pool de cache LV são agrupados em um LV em cache que você usa em vez do LV original.

O

lvmcache também facilita a configuração de caches redundantes, a alteração do modo ou da política do cache, etc.

    
por 29.11.2016 / 08:44
1

@ stephen-kitt resume bem a diferença. Em cada sistema mais ou menos atual, use o lvmcache (7) para tudo que você puder, isso economizará tempo e esforço. Ele também é integrado e suportado em releases recentes do RHEL 7.2+ (backported do kernel 4.2) e SLESs. É claro que o Debian e o Ubuntu devem estar bem.

Eu dei uma palestra sobre o assunto no LinuxDays 2017 em Praga recentemente: link

os slides: link

    
por 29.10.2017 / 22:00