Limpeza lenta do ZFS em dois HDDs

Limpeza lenta do ZFS em dois HDDs

O pool consiste em dois HDDs (WD Red 3 TB, 5200 RPM?, taxa de transferência máxima de 147 MB/s e Verbatim (Toshiba) 3 TB, 7200 RPM) na raidz1-0configuração. Possui 2,25 TB de dados, duplicados em dois discos, totalizando 4,5 TB. Quando criei o pool não especifiquei um ashiftvalor.

zpool statusmostra que "scan: scrub reparado 0 em 32h43m com 0 erros em domingo, 3 de janeiro, 13:58:54 de 2021". Isso significa que a velocidade de digitalização foi de apenas 4.5e6 / (32.717 * 60 * 60) = 38.2 MB / s. Eu esperaria pelo menos 2 x 100 ou até 2 x 200 MB/s, embora o disco WD seja um pouco mais lento que o outro.

Os dados SMART dos discos mostram que tudo está íntegro. Eles têm de 6,5 a 7 anos de tempo de ligação, mas a contagem de start-stop é de apenas cerca de 200.

Então a questão principal: O que pode explicar o fraco desempenho de leitura?

Estranhamente zdbmostrou que o pool usa o caminho /dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1em vez de /dev/disk/by-id/ata-WDC_WD30EFRX-xyz. fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyzmenciona que "A partição 1 não inicia no limite do setor físico", mas li que isso só deve prejudicar o desempenho de gravação. Posso tentar consertar isso removendo o dispositivo e adicionando-o novamente com o caminho completo do disco adequado, já que os dados são duplicados (e copiados em backup).

O pool possui 7,1 milhões de arquivos. Testei a execução sha1sumem um arquivo de 14.276 MB depois de limpar os caches via /proc/sys/vm/drop_caches, demorou 2 minutos e 41 segundos para colocar a velocidade de leitura em 88,5 MB/s.

dd bs=1M count=4096 if=/dev/disk/by-id/ata-WDC_WD30EFRX-xyz of=/dev/nullrelatou uma velocidade de 144 MB/s, usando-a em ata-WDC_WD30EFRX-xyz-part1134 MB/s e ata-TOSHIBA_DT01ACA300_xyz195 MB/s.

Meu NAS executa versões de software bastante antigas:

$ modinfo zfs
filename:       /lib/modules/3.11.0-26-generic/updates/dkms/zfs.ko
version:        0.6.5.4-1~precise
license:        CDDL
author:         OpenZFS on Linux
description:    ZFS
srcversion:     5FC0B558D497732F17F4202
depends:        spl,znvpair,zcommon,zunicode,zavl
vermagic:       3.11.0-26-generic SMP mod_unload modversions 

Possui 24 GB de RAM, dos quais 8 GB são reservados para uma JVM, mas o restante é de uso gratuito. Embora nem tanto pareça ser gratuito:

$ free -m
             total       used       free     shared    buffers     cached
Mem:         23799      21817       1982          0        273       1159
-/+ buffers/cache:      20384       3415
Swap:         7874         57       7817

Editar 1:

Fiz alguns testes com o bonnie++, usando um único arquivo de 4 GB no RAIDZ: escrever 75,9 MB/s, reescrever 42,2 MB/s e ler 199,0 MB/s. Presumo que fiz a conversão corretamente dos "quilo-caracteres/segundo".

Ah, só agora percebi que a limpeza paralela leva tanto tempo quanto o disco mais lento de 5400 RPM, não importa que o 7200 RMP tenha sido (possivelmente) limpo mais rápido.

Editar 2:

Reduzi o número de arquivos no pool de 7,1 milhões para 4,5 milhões (-36,6%) e o tempo de limpeza caiu de 32,72 horas para 16,40 horas (-49,9%). A quantidade de dados é a mesma, pois acabei de colocar esses pequenos arquivos em um ZIP de baixa compactação.

Também aumentei recordsizede 128k para 512k, não tenho ideia se isso fez diferença neste caso. Outros dados pré-existentes não foram alterados, mantendo os originais recordsize. Ah, e /sys/module/zfs/parameters/zfs_scan_idleestava definido para 2.

Responder1

Qual versão do ZFS você está executando?

Pré-0.8.x faz a limpeza percorrendo todos os metadados e dados, conforme eles são dispostos em discos. Isso causa muitas buscas que prejudicam o desempenho em discos mecânicos. Se usado com discos de 5K RPM de baixo desempenho preenchidos com milhões de arquivos pequenos, isso significa tempos de limpeza/resilver muito longos. Com essas versões mais antigas do ZFS, você pode ajustar alguns ajustes do ZFS;por exemplo:

echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 0 > /sys/module/zfs/parameters/zfs_scan_idle

Esteja ciente de que aumentar a prioridade de limpeza levaria a um desempenho mais lento do aplicativo.

0.8.x usa uma abordagem de limpeza em lote, onde os metadados são coletados em lotes maiores e só então os dados relevantes são verificados. Isso resulta em esfregações muito mais rápidas (ou seja: metade do tempo), sem a necessidade de afinar nada (os botões acima nem estão mais presentes).

Portanto, o método mais eficaz para aumentar a velocidade de limpeza/resilver provavelmente é atualizar sua versão do ZFS.

informação relacionada