Por que meu pool ZFS está gastando 97% do tempo lendo o destino e apenas cerca de 3% gravando em uma operação de gravação?

Por que meu pool ZFS está gastando 97% do tempo lendo o destino e apenas cerca de 3% gravando em uma operação de gravação?

Isso me deixa perplexo e não sei como detalhar o que o ZFS está realmente fazendo.

Estou usando uma instalação limpa do FreeNAS 11.1 com um pool ZFS rápido (espelhos importados em 7200s rápidos) mais um SSD UFS solitário para teste. A configuração está praticamente "pronta para uso".

O SSD contém 4 arquivos de tamanhos de 16 a 120 GB, copiados usando o console para o pool. O pool é desduplicado (vale a pena: economia de 4x, tamanho de 12 TB em disco) e o sistema tem bastante RAM (128 GB ECC) e Xeon rápido. A memória é bastante adequada - zdbmostra que o pool tem um total de 121 milhões de blocos (544 bytes cada no disco, 175 bytes cada na RAM), portanto o DDT inteiro tem apenas cerca de 20,3 GB (cerca de 1,7 GB por TB de dados).

Mas quando copio os arquivos para o pool, vejo isso em zpool iostat: insira a descrição da imagem aqui

Ele está realizando um ciclo de até um minuto de leituras de baixo nível e uma breve explosão de gravações. A parte lida é mostrada na foto. A velocidade geral de gravação da tarefa também não é ótima - o pool está 45%/10 TB vazio e nativamente pode gravar em torno de 300 a 500 MB/s.

Sem saber como verificar, suspeito que as leituras de baixo nível sejam provenientes da leitura do DDT e de outros metadados, pois não são pré-carregados no ARC (ou são continuamente empurrados para fora do ARC pela gravação dos dados do arquivo). Talvez.

Talvez esteja encontrando resultados de desduplicação, então não há muita escrita, só que não me lembro de nenhuma versão dup desses arquivos e faz o mesmo em /dev/random pelo que me lembro (vou verificar isso e atualizar em breve). Talvez. Nenhuma ideia real.

O que posso fazer para aprofundar o que está acontecendo com mais exatidão, com o objetivo de otimizá-lo?

Atualização em RAM e desduplicação:

Atualizei o Q para mostrar o tamanho do DDT após o comentário inicial. A RAM de desduplicação é frequentemente citada como 5 GB por TB x 4, mas isso é baseado em um exemplo que realmente não é muito adequado para desduplicação. Você deve calcular a contagem de blocos multiplicada por bytes por entrada. O "x 4" frequentemente citado é apenas um limite padrão "suave" (por padrão, o ZFS limita os metadados a 25% do ARC, a menos que seja solicitado a usar mais - este sistema é especificado para desduplicação e eu adicionei 64 GB, que étodosutilizável para acelerar o cache de metadados).

Portanto, neste pool zdbconfirma que todo o DDT deve precisar de apenas 1,7 GB por TB e não 5 GB por TB (20G no total), e estou feliz em fornecer aos metadados 70% do ARC e não 25% (80G de 123G).

Nesse tamanho, não deveria ser necessário ejetarqualquer coisadiferente do conteúdo do arquivo 'morto' do ARC. Então, estou procurando realmente investigar o ZFS para descobrir o que ele acha que está acontecendo e para poder ver o efeito de quaisquer alterações que fizer, porque estou realmente muito surpreso com sua enorme quantidade de "leituras de baixo nível" e procurando por uma forma de sondar e confirmar a realidade do que pensa que está fazendo.

informação relacionada