AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 771818
Accepted
Mikko Rantalainen
Mikko Rantalainen
Asked: 2024-03-07 22:55:16 +0800 CST2024-03-07 22:55:16 +0800 CST 2024-03-07 22:55:16 +0800 CST

É seguro adicionar o dispositivo de cache LVM ao grupo de volumes LVM existente enquanto o sistema de arquivos está montado?

  • 772

Eu tenho um grupo de volumes LVM existente com um volume lógico de 10 TB montado como um sistema ext4 que está em uso ativamente.

É seguro executar o comando lvconvert --type cache --cachepool storage/lvmcache-data storage/dataenquanto o sistema de arquivos ext4 já está montado storage/data? (O storage/lvmcache-datafoi previamente configurado lvconvert --type cache-pool --cachemode writeback --poolmetadata storage/lvmcache-metadata storage/lvmcache-datacaso faça diferença.)

Eu diria que sim, é seguro adicionar cache dinamicamente ao volume online com sistema de arquivos montado, mas não consegui encontrar documentação de qualquer maneira.

lvm
  • 1 1 respostas
  • 34 Views

1 respostas

  • Voted
  1. Best Answer
    Mikko Rantalainen
    2024-03-08T22:44:42+08:002024-03-08T22:44:42+08:00

    Isso não foi claramente documentado em nenhum lugar pelos autores do LVM, mas de acordo com https://blog.delouw.ch/2020/01/29/using-lvm-cache-for-storage-tiering/

    Outro benefício do dm-cache sobre o dm-writecache é que o cache pode ser criado, ativado e destruído online .

    Isso significa que, desde que você esteja usando dm-cachemódulo em vez de dm-writecachemódulo, deve ser seguro adicionar e remover o cache LVM enquanto o volume lógico já estiver montado.

    Observe que cachemodea configuração do LVM writebacké diferente de dm-writecache.

    Além disso, a documentação do RedHat em https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/administration_guide/sect-lvm_cache#idm140401735629408 diz o seguinte:

    19.8.3. Configurando o cache LVM
    ...
    A adição ou remoção de pools de cache pode ser feita em volumes ativos, mesmo com sistemas de arquivos montados em uso . No entanto, há sobrecarga na operação e serão observados impactos no desempenho , especialmente ao remover um volume de cache no modo writeback, pois será necessária uma sincronização completa dos dados.

    Eu também verifiquei isso seguindo o teste:

    1. Crie 4 dispositivos de armazenamento adicionais em uma máquina virtual: sda(2 GB), sdb(4 GB), sdc(4 GB), sdd(1 GB). Os tamanhos desses dispositivos não são importantes. Usei dispositivos de tamanhos diferentes para ilustrar a flexibilidade do LVM aqui. Você pode fingir que o menor sddé o dispositivo mais rápido e será usado como cache.

    2. Construa um armazenamento LVM de sda, sdb, sdc usando todas as extensões de todos os dispositivos (o grupo de volumes é chamado storagee o volume lógico é chamado datapara este exemplo):

      pvcreate /dev/sda /dev/sdb /dev/sdc
      vgcreate storage /dev/sda /dev/sdb /dev/sdc
      lvcreate -l100%FREE -n data storage
      mkfs.ext4 /dev/mapper/storage-data
      mkdir -p /root/test
      mount /dev/mapper/storage-data /root/test
      

      No mundo real, eu recomendaria criar partições um pouco mais curtas que todo o dispositivo e usar essas partições para o volume físico do LVM. Isso permite uma substituição mais fácil de um dispositivo porque dispositivos de “1 TB” de fabricantes diferentes podem diferir em alguns megabytes. Prefiro manter os últimos ~ 100 MB não particionados para que os SSDs possam criar partições de tamanho idêntico em diferentes dispositivos SSD. Como bônus, o dispositivo SSD pode usar essa área nunca usada do disco como área extra de nivelamento de desgaste. Se você usar unidades baratas, recomendo deixar 10–20% nunca usadas porque unidades baratas normalmente têm muito menos área de nivelamento de desgaste fora da área acessível ao usuário. Deixar alguma área acessível ao usuário intocada (ou liberada comTRIM) permite que o firmware tenha mais área de nivelamento de desgaste, o que prolonga a vida útil da unidade e normalmente melhora seu desempenho.

    3. Inicie dois loops de teste fio em paralelo em dois terminais separados no diretório /root/test:

      Primeiro ciclo:

      while fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randwrite --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=1 --direct=1 --numjobs=1 --group_reporting --verify=sha1 --do_verify=0 --verify_state_save=1 --verify_backlog=1024 && fio --name TEST --eta-newline=5s --filename=fio-tempfile.dat --rw=randread --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=1 --direct=1 --numjobs=1 --group_reporting --verify=sha1 --do_verify=1 --verify_state_save=1 --verify_backlog=1024 --verify_dump=1 --verify_only ; do printf "\nOK -- %s\n\n\n" "$(date --iso=sec)"; done
      

      Segundo loop (em outro terminal):

      while fio --name TEST --eta-newline=5s --filename=fio-tempfile2.dat --rw=randwrite --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=4 --direct=1 --numjobs=4 --group_reporting --verify=sha1 --do_verify=0 --verify_state_save=1 --verify_backlog=1024 && fio --name TEST --eta-newline=5s --filename=fio-tempfile2.dat --rw=randread --size=500m --blocksize=4k --ioengine=libaio --fsync=1m --iodepth=2 --direct=1 --numjobs=8 --group_reporting --verify=sha1 --do_verify=1 --verify_state_save=1 --verify_backlog=1024 --verify_dump=1 --verify_only ; do printf "\nOK -- %s\n\n\n" "$(date --iso=sec)"; done
      

      Estes criam dois arquivos chamados fio-tempfile.date fio-tempfile2.datque são gravados e verificados continuamente com um total de 5 processos e o conteúdo dos arquivos é verificado. Testei com ddisso que se você modificar um único byte, o loop detectará o erro:

      dd if=/dev/zero of=fio-tempfile.dat seek=1000000 count=1 bs=1
      

      Assim que um erro for detectado, você pode reiniciar o loop e ele continuará testando e verificando o armazenamento até ser interrompido ou até que um erro seja encontrado.

    4. Adicione um novo dispositivo de cache ( sdd) a esse armazenamento existente enquanto os loops de teste acima estão em execução constante para demonstrar que o acesso ao sistema de arquivos é seguro:

      pvcreate /dev/sdd
      vgextend storage /dev/sdd
      lvcreate -n lvmcache-data -l 98%FREE storage /dev/sdd
      lvcreate -n lvmcache-metadata -l 50%FREE storage /dev/sdd
      lvconvert --type cache-pool --cachemode writeback --poolmetadata storage/lvmcache-metadata storage/lvmcache-data
      lvconvert --type cache --cachepool storage/lvmcache-data storage/data
      

      O último comando adiciona o dispositivo de cache LVM dinamicamente sem causar corrupção de dados. O cache também durará reinicializações do sistema sem problemas. A razão para alocar apenas 98% para o cache de dados e 50% do espaço restante (1%) para o cache de metadados é que construir um cachepool a partir deles requer um pouco de espaço livre no grupo de volumes ou falhará. Você também pode usar cachevolem vez disso cachepool, mas software de terceiros normalmente só oferece suporte cachepoolporque é o método mais antigo. Ambos têm desempenho idêntico e cachepoolsão apenas mais complexos de construir, mas têm melhor interoperabilidade com software de reparo e diagnóstico de terceiros, por isso prefiro usá-los. OcachepoolO modo também suporta o uso de dispositivos separados para metadados e dados, o que pode melhorar o desempenho se você tiver vários dispositivos realmente rápidos.

    5. Se você quiser remover o dispositivo de cache, poderá fazer o seguinte imediatamente, sem corrupção de dados:

      lvconvert --uncache storage/data
      

      Isso levará muito tempo se o cache LVM estiver em uso ativo (como no exemplo acima com os loops de teste em execução) e continuará exibindo status como

      Flushing 15610 blocks for cache storage/data.
      Flushing 11514 blocks for cache storage/data.
      Flushing 7418 blocks for cache storage/data.
      Flushing 5481 blocks for cache storage/data.
      ...
      Flushing 1 blocks for cache storage/data.
      Logical volume "lvmcache-data_cpool" successfully removed
      Logical volume storage/data is not cached.
      

      Parece que a descarga pode parar por um longo tempo e continuar exibindo a mesma quantidade de blocos não liberados, mas você só precisa continuar esperando. O sistema de arquivos montado no LVM continua funcionando o tempo todo.

      Não verifiquei o que acontece se houver perda de energia durante a uncacheoperação. Eu presumo que o LVM inicializa com o cache ainda em uso e você pode simplesmente executar uncachenovamente a operação.

    Observe que após o uncachecomando, os volumes lógicos do cache de dados e do cache de metadados serão perdidos (liberados sem qualquer histórico), portanto, se você quiser reconectar o dispositivo de cache, deverá construí-lo desde o início (todos os comandos lvcreatee lvconvertpara o passo 4). O dispositivo de cache ainda fará parte do grupo de volumes após a uncacheoperação, portanto não será necessário refazer isso.

    E como sempre, tenha sempre um backup atualizado, completo e verificado antes de mexer em qualquer dado importante!

    A configuração do cache LVM acima será semelhante a lsblk -sp:

    NAME                                             MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    /dev/mapper/storage-data                         253:3    0    10G  0 lvm  /root/test
    ├─/dev/mapper/storage-lvmcache--data_cpool_cdata 253:0    0   996M  0 lvm  
    │ └─/dev/sdd                                       8:48   0     1G  0 disk 
    ├─/dev/mapper/storage-lvmcache--data_cpool_cmeta 253:1    0    12M  0 lvm  
    │ └─/dev/sdd                                       8:48   0     1G  0 disk 
    └─/dev/mapper/storage-data_corig                 253:2    0    10G  0 lvm  
      ├─/dev/sda                                       8:0    0     2G  0 disk 
      ├─/dev/sdb                                       8:16   0     4G  0 disk 
      └─/dev/sdc                                       8:32   0     4G  0 disk 
    

    Algumas dicas adicionais sobre o uso do cache LVM:

    Você pode ajustar um pouco o cache do LVM, mesmo que a lógica para selecionar o que manter no cache seja totalmente automática. Veja man lvmcachepara detalhes completos. Alguns exemplos:

    • Liste as configurações atuais de cache (os valores padrão não serão listados):

      lvs -o cachesettings storage/data
      
    • Limpe todas as configurações de cache (use padrões para tudo):

      lvchange --cachesettings '' storage/data
      
    • Ajuste o cache para sempre começar a liberar o cache de gravação para o armazenamento de apoio quando mais de 10% do cache for usado para buffer de gravação:

      lvchange --cachesettings 'high_watermark=10' storage/data
      
    • Ajuste o cache para continuar liberando o cache de gravação quando houver algo para liberar depois que a liberação for iniciada por qualquer motivo:

      lvchange --cachesettings 'low_watermark=0' storage/data
      
    • Ajuste o cache para pausar automaticamente a liberação por 50 ms se o armazenamento de apoio for acessado (evite introduzir latência para liberação)

      lvchange --cachesettings 'pause_writeback=50' storage/data
      
    • Descarregue automaticamente até mesmo uma pequena quantidade de dados para o armazenamento de apoio quando eles estiverem no cache por mais de 60 segundos:

      lvchange --cachesettings 'autocommit_time=60000' storage/data
      
    • 2

relate perguntas

  • Instantâneo do LVM não atualizando quando o LVM é modificado

  • grub2-mkconfig não está gerando caminhos de montagem corretos (e também como faço para me livrar de kernels extras que não uso mais?)

  • lvm e uma questão de particionamento

  • Redimensionando um volume físico LVM no dispositivo /dev/sdb

  • snap /dev/loop em 100% de utilização -- sem espaço livre

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve