
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-0
configuração. Possui 2,25 TB de dados, duplicados em dois discos, totalizando 4,5 TB. Quando criei o pool não especifiquei um ashift
valor.
zpool status
mostra 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 zdb
mostrou que o pool usa o caminho /dev/disk/by-id/ata-WDC_WD30EFRX-xyz-part1
em vez de /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
. fdisk -l /dev/disk/by-id/ata-WDC_WD30EFRX-xyz
menciona 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 sha1sum
em 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/null
relatou uma velocidade de 144 MB/s, usando-a em ata-WDC_WD30EFRX-xyz-part1
134 MB/s e ata-TOSHIBA_DT01ACA300_xyz
195 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 recordsize
de 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_idle
estava 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.