Configurando o cache do ZFS para IO de alta velocidade

Configurando o cache do ZFS para IO de alta velocidade
A equipe por trás do ZFS acredita que a memória livre e não utilizada é desperdiçada memória. Então, eles projetaram ZFs para armazenar dados de maneira muito agressiva. O ZFS tenta cache o máximo de dados possível na memória (RAM) para fornecer acesso mais rápido ao sistema de arquivos.

Infelizmente, a memória (RAM) é muito cara. Portanto, o ZFS também permite que você use SSDs rápidos para cache de dados também. Os dados de armazenamento em cache na memória são chamados dados de cache de nível 1 ou L1 e cache no SSD são chamados de cache de nível 2 ou L2.

ZFS faz 2 tipos de cache de leitura

1. ARC (cache de reposição adaptável):

O ZFS cache os arquivos mais recentemente e mais frequentemente acessados ​​na RAM. Depois que um arquivo estiver em cache na memória, na próxima vez que você acessar o mesmo arquivo, ele será servido do cache em vez do seu disco rígido lento. O acesso a esses arquivos em cache será muitas vezes mais rápido do que se tivessem que ser acessados ​​de discos rígidos.

2. L2ARC (cache de reposição adaptativa de nível 2):

Cache de arco é armazenado na memória do seu computador. Quando a memória está cheia, os dados mais antigos são removidos do cache do arco e novos dados são armazenados em cache. Se você não deseja que o ZFS jogue fora os dados em cache permanentemente, você pode configurar um SSD rápido como um cache L2arc para o seu pool ZFS.

Depois de configurar um cache L2arc para o seu pool ZFS, o ZFS armazenará dados removidos do cache do arco no cache L2arc. Portanto, mais dados podem ser mantidos no cache para acesso mais rápido.

ZFS faz 2 tipos de cache de gravação

1. ZIL (LOG Intent ZFS):

O ZFS aloca uma pequena parte da piscina para armazenar caches de gravação por padrão. É chamado Zil ou Log de intenção do ZFS. Antes que os dados sejam gravados para os discos rígidos físicos, são armazenados em Zil. Para minimizar o número de operações de gravação e reduzir a fragmentação de dados, os dados são agrupados no ZIL e liberados no disco rígido físico, uma vez que um determinado limite for atendido. É mais como um buffer de gravação do que em cache. Você pode pensar dessa maneira.

2. Slog (log secundário):

Como o ZFS usa uma pequena parte da piscina para armazenar o ZIL, ele compartilha a largura de banda da piscina do ZFS. Isso pode ter um impacto negativo no desempenho do pool ZFS.

Para resolver esse problema, você pode usar um SSD rápido como um dispositivo de slog. Se existir um dispositivo de slog em um pool ZFS, o ZIL será movido para o dispositivo de slog. Os ZFs não armazenam mais dados do ZIL no pool. Então, nenhuma largura de banda da piscina é desperdiçada no ZIL.

Existem outros benefícios também. Se um aplicativo gravar no pool do ZFS sobre a rede (i.e. VMware Esxi, NFS), o ZFS pode escrever rapidamente os dados para slog e enviar um reconhecimento ao aplicativo de que os dados são gravados no disco. Então, ele pode escrever os dados para discos rígidos mais lentos, como de costume. Isso tornará essas aplicações mais responsivas.

Observe que normalmente, o ZFS não lê do slog. O ZFS lê apenas dados do slog em caso de perda de energia ou falha de gravação. As gravações reconhecidas são armazenadas apenas lá temporariamente até serem liberadas para os discos rígidos mais lentos. Só está lá para garantir que, no caso de perda de energia ou falha de gravação, as gravações reconhecidas não sejam perdidas e elas sejam liberadas para os dispositivos de armazenamento permanente o mais rápido possível.

Observe também que, na ausência de um dispositivo de slog, o ZIL será usado para o mesmo propósito.

Agora que você sabe tudo sobre o ZFS Leia e escreve caches, vamos ver como configurá -los no seu pool ZFS.

Índice

  1. Configurando o limite máximo de memória para o arco
  2. Adicionando um dispositivo de cache L2arc
  3. Adicionando um dispositivo de slog
  4. Conclusão
  5. Referências

Configurando o limite máximo de memória para o arco

No Linux, o ZFS usa 50% da memória instalada para cache de arco por padrão. Portanto, se você tiver 8 GB de memória instalada no seu computador, o ZFS usará 4 GB de memória para cache de arco no Max.

Se necessário, você pode aumentar ou diminuir a quantidade máxima de memória que os ZFs podem usar para cache de arco. Para definir a quantidade máxima de memória que os ZFs podem usar para cache de arco, você pode usar o ZFS_ARC_MAX Parâmetro do kernel.

Você pode encontrar muitas informações de uso de cache de arco com o arc_summary Comando o seguinte:

$ sudo arc_summary -s arco

No Tamanho do arco (atual) Seção, você pode encontrar o tamanho máximo que o cache do arco pode crescer (Tamanho máximo (água alta)), o tamanho do cache de arco atual (Tamanho do alvo (adaptativo)) e outras informações de uso do cache do arco, como você pode ver na captura de tela abaixo.

Observe que o tamanho do cache do arco máximo no meu computador é 3.9 GB como eu tenho 8 GB de memória instalada no meu computador. Isso representa cerca de 50% da memória total disponível, como mencionei anteriormente.

Você pode ver quantos dados atingem o cache do arco e quanto dados também perdem o cache do arco. Isso pode ajudá -lo a determinar com que eficácia o cache do arco está funcionando em seu cenário.

Para imprimir um resumo dos hits/erros de cache do arco, execute o seguinte comando:

$ sudo arc_summary -s Archits

Um resumo dos hits e erros de cache do arco deve ser exibido como você pode ver na captura de tela abaixo.

Você pode monitorar o uso da memória do cache do ZFS com o seguinte comando:

$ sudo arcstat 1 2>/dev/null

Como você pode ver, a memória máxima de cache do arco (c), o tamanho atual do cache do arco (Arcsz), dados lidos no cache do arco (ler) e outras informações são exibidas.

Agora, vamos ver como definir um limite de memória personalizado para o cache do ZFS Arc.

Para definir um limite de memória máxima personalizado para o cache do arco ZFS, crie um novo arquivo ZFS.conf no /etc/modprobe.d/ diretório da seguinte maneira:

$ sudo nano /etc /modprobe.D/ZFS.conf

Digite a seguinte linha no ZFS.conf arquivo:

Opções zfs zfs_arc_max =

Substituir, Com o limite máximo de memória máxima desejado para o cache do ZFS Arc em bytes.

Digamos, você quer usar 5 GB de memória para o cache do ZFS Arc. Para converter 5 GB em bytes, você pode usar o seguinte comando:

$ echo $ ((5*2 ** 30))

Como você pode ver, 5 GB é igual a 5368709120 bytes.

Você pode fazer a mesma coisa com o intérprete Python 3 da seguinte forma:

$ python3 -c "Print (5*2 ** 30)"

Depois de definir o limite de memória Max Cache do ZFS Arc, pressione + X seguido pela Y e Para salvar o ZFS.conf arquivo.

Agora, atualize a imagem initramfs do seu kernel atual com o seguinte comando:

$ sudo update -initramfs -u

A imagem initramfs deve ser atualizada.

Para que as mudanças entrem em vigor, reinicie o computador com o seguinte comando:

$ sudo reiniciar

Na próxima vez que você inicializar seu computador, o limite máximo de memória do seu cache de arco ZFS deve ser definido para o tamanho desejado (5 GB no meu caso), como você pode ver na captura de tela abaixo.

$ sudo arc_summary -s arco

Adicionando um dispositivo de cache L2arc

Se um dispositivo de cache L2arc (um SSD ou NVME SSD) for adicionado ao seu pool ZFS, o ZFS descarregará (move) caches de arco para o dispositivo L2arc quando a memória estiver cheia (ou atingiu o limite máximo de arco). Portanto, mais dados podem ser mantidos no cache para um acesso mais rápido ao pool do ZFS.

Para seguir junto com os exemplos, crie um pool de teste ZFS Pool1 com /dev/sdb e /dev/sdc discos rígidos na configuração espelhada da seguinte forma:

$ sudo zpool create -f pool1 espelho /dev /sdb /dev /sdc

Uma piscina ZFS Pool1 deve ser criado com o /dev/sdb e /dev/sdc discos rígidos no modo espelho, como você pode ver na captura de tela abaixo.

$ sudo zpool status pool1

Agora, digamos, você quer adicionar o NVME SSD NVME0N1 Como um dispositivo de cache L2arc para o pool ZFS Pool1.

$ sudo lsblk -e7

Para adicionar o NVME SSD NVME0N1 para o pool ZFS Pool1 Como um dispositivo de cache L2arc, execute o seguinte comando:

$ sudo zpool add -f pool1 cache /dev /nvme0n1

O NVME SSD NVME0N1 deve ser adicionado ao pool ZFS Pool1 Como um dispositivo de cache L2arc, como você pode ver na captura de tela abaixo.

$ sudo zpool status pool1

Depois de adicionar um dispositivo de cache L2arc ao seu pool ZFS, você pode exibir as estatísticas de cache L2arc usando o arc_summary Comando o seguinte:

$ sudo arc_summary -s l2arc

As estatísticas de cache L2arc devem ser exibidas como você pode ver na captura de tela abaixo.

Adicionando um dispositivo de slog

Você pode adicionar um ou mais SSDs SSDs/NVME no seu pool ZFS como um dispositivo de slog (log secundário) para armazenar o log de intenções do ZFS (ZIL) do seu pool ZFS lá.

Geralmente adicionar um SSD é suficiente. Mas como o slog é usado para garantir que as gravações não sejam perdidas no caso de uma falha de energia e outros problemas de gravação, é recomendável usar 2 SSDs em uma configuração espelhada. Isso lhe dará um pouco mais de proteção e garantirá que nenhuma gravação seja perdida.

Digamos, você quer adicionar os SSDs NVME NVME0N2 e NVME0N3 Como um dispositivo de slog no seu pool ZFS Pool1 em uma configuração espelhada.

$ sudo lsblk -e7

Para adicionar os SSDs NVME NVME0N2 e NVME0N3 Como um dispositivo de slog no seu pool ZFS Pool1 Em uma configuração espelhada, execute o seguinte comando:

$ sudo zpool add -f pool1 log espelho /dev /nvme0n2 /dev /nvme0n3

Se você quiser adicionar um único NVME SSD NVME0N2 Como um dispositivo de slog no seu pool ZFS Pool1, Você pode executar o seguinte comando: em vez disso:

$ sudo zpool add -f pool1 log /dev /nvme0n2

O NVME SSDS NVME0N2 e NVME0N3 deve ser adicionado ao seu pool ZFS Pool1 como um dispositivo de slog no modo espelho, como você pode ver na captura de tela abaixo.

$ sudo zpool status pool1

Você pode encontrar informações de transação ZIL e SLOG usando o arc_summary Comando o seguinte:

$ sudo arc_summary -s zil

As informações de transação de Zil e Slog devem ser exibidas como você pode ver na captura de tela abaixo.

Conclusão

Neste artigo, discuti diferentes tipos de recursos de leitura e cache do sistema de arquivos ZFS. Eu também mostrei como configurar o limite de memória para o cache do arco. Eu mostrei como adicionar um dispositivo de cache L2arc e um dispositivo de slog ao seu pool ZFS também.

Referências

[1] ZFS - Wikipedia

[2] ELI5: ZFS Caching (2019) - YouTube

[3] Apresentando ZFs no Linux - Damian Wojstaw

[4] Ubuntu Manpage: ZFS-Module-Parameters-Parâmetros do Módulo ZFS

[5] RAM - é ZFS no Ubuntu 20.04 Usando uma tonelada de memória? - Pergunte ao Ubuntu