Velocidades sequenciais lentas no raidz2 de 9x7 unidades (ZFS ZoL 0.8.1)

9

Estou executando um grande pool ZFS criado para leituras e gravações sequenciais com tamanho de solicitação de 256K + via iSCSI (para backups) no Ubuntu 18.04. Dada a necessidade de alta taxa de transferência e eficiência de espaço, e menos necessidade de desempenho aleatório de blocos pequenos, fui com raidz2 listrado sobre espelhos listrados.

No entanto, o desempenho de leitura sequencial de 256K é muito menor do que eu esperava (100 - 200MBps, picos de até 600MBps). Quando os zvols atingem ~ 99% de iowait no iostat, os dispositivos de suporte geralmente rodam entre 10 e 40% de iowait, o que sugere para mim o gargalo é algo que estou perdendo na configuração, já que não deve ser o backplane ou as CPUs esse sistema e cargas de trabalho seqüenciais não devem trabalhar muito o ARC.

Eu brinquei bastante com os parâmetros do módulo (configuração atual abaixo), li centenas de artigos, problemas no github do OpenZFS, etc. A pré-busca e agregação de ajuste me levaram a esse nível de desempenho - por padrão, eu estava rodando a cerca de 50 MBps em leituras seqüenciais quando o ZFS estava enviando solicitações TINY para os discos (~ 16K). Com a agregação e a pré-busca funcionando bem (eu acho), as leituras de disco são muito maiores, em torno de ~ 64K em média no iostat.

As NICs são o destino LIO iscsi com descarregamento de cxgbit + o iniciador do Windows Chelsio iscsi funciona bem fora dos zvols do ZFS, com um optano diretamente mapeado retornando quase a taxa de linha completa nas NICs (~ 3,5 GBps de leitura e gravação).

Estou esperando demais? Eu sei que o ZFS prioriza a segurança sobre o desempenho, mas eu esperaria que um raidz2 7x9 proporcionasse melhores leituras sequenciais do que um único raid mdadm de 9 unidades6.

Especificações do sistema e arquivos de registro / configuração:

Chassis: Supermicro 6047R-E1R72L
HBAs: 3x 2308 IT mode (24x 6Gbps SAS channels to backplanes)
CPU: 2x E5-2667v2 (8 cores @ 3.3Ghz base each)
RAM: 128GB, 104GB dedicated to ARC
HDDs: 65x HGST 10TB HC510 SAS (9x 7-wide raidz2 + 2 spares)
SSDs: 2x Intel Optane 900P (partitioned for mirrored special and log vdevs)
NIC: Chelsio 40GBps (same as on initiator, both using hw offloaded iSCSI)
OS: Ubuntu 18.04 LTS (using latest non-HWE kernel that allows ZFS SIMD)
ZFS: 0.8.1 via PPA
Initiator: Chelsio iSCSI initiator on Windows Server 2019

Configuração do pool:

ashift=12
recordsize=128K (blocks on zvols are 64K, below)
compression=lz4
xattr=sa
redundant_metadata=most
atime=off
primarycache=all

Configuração do ZVol:

sparse
volblocksize=64K (matches OS allocation unit on top of iSCSI)

Layout da piscina:

7x 9-wide raidz2
mirrored 200GB optane special vdev (SPA metadata allocation classes)
mirrored 50GB optane log vdev

/etc/modprobe.d/zfs.conf:

# 52 - 104GB ARC, this system does nothing else
options zfs zfs_arc_min=55834574848
options zfs zfs_arc_max=111669149696

# allow for more dirty async data
options zfs zfs_dirty_data_max_percent=25
options zfs zfs_dirty_data_max=34359738368

# txg timeout given we have plenty of Optane ZIL
options zfs zfs_txg_timeout=5

# tune prefetch (have played with this 1000x different ways, no major improvement except max_streams to 2048, which helped, I think)
options zfs zfs_prefetch_disable=0
options zfs zfetch_max_distance=134217728
options zfs zfetch_max_streams=2048
options zfs zfetch_min_sec_reap=3
options zfs zfs_arc_min_prefetch_ms=250
options zfs zfs_arc_min_prescient_prefetch_ms=250
options zfs zfetch_array_rd_sz=16777216

# tune coalescing (same-ish, increasing the read gap limit helped throughput in conjunction with low async read max_active, as it caused much bigger reads to be sent to the backing devices)
options zfs zfs_vdev_aggregation_limit=16777216
options zfs zfs_vdev_read_gap_limit=1048576
options zfs zfs_vdev_write_gap_limit=262144

# ZIO scheduler in priority order 
options zfs zfs_vdev_sync_read_min_active=1
options zfs zfs_vdev_sync_read_max_active=10
options zfs zfs_vdev_sync_write_min_active=1
options zfs zfs_vdev_sync_write_max_active=10
options zfs zfs_vdev_async_read_min_active=1
options zfs zfs_vdev_async_read_max_active=2
options zfs zfs_vdev_async_write_min_active=1
options zfs zfs_vdev_async_write_max_active=4

# zvol threads
options zfs zvol_threads=32

Estou arrancando meu cabelo com isso. Há pressão dos usuários para usarem todos os Windows com espaços de armazenamento, mas eu usei espaços de armazenamento com paridade (mesmo com espaços de armazenamento diretos com espelhos na parte superior), e isso também não é bom. Estou tentado a ir direto ao mdadm raid60 sob o iSCSI, mas adoraria se alguém pudesse apontar alguma coisa idiota que estou perdendo que desbloqueia o desempenho com a proteção bitrot do ZFS :)

obrienmd
fonte

Respostas:

7

Boa pergunta.

  • Eu acho que o tamanho do seu bloco esparso de zvol deve ser 128k.
  • As configurações do seu planejador ZIO devem ser mais altas, como no mínimo 10 e no máximo 64.
  • O zfs_txg_timeout deve demorar muito mais. Eu faço 15 ou 30 anos nos meus sistemas.
  • Eu acho que os múltiplos RAIDZ3s (ou foram erros de digitação) são um exagero e desempenham um papel importante no desempenho. Você pode fazer benchmark com o RAIDZ2?

Editar: instale o Netdata no sistema e monitore a utilização e as estatísticas do ZFS.

Edit2: Isto é para um repositório Veeam. A Veeam suporta o Linux como alvo e funciona maravilhosamente com o ZFS. Você consideraria compará-lo com seus dados? Os zvols não são um caso de uso ideal para o que você está fazendo, a menos que a descarga da NIC seja uma parte crítica da solução.

ewwhite
fonte
Obrigado! Ponto a ponto nos comentários seguintes, exceto Z3, que foi realmente um erro de digitação :). No volblocksize, testei com 128k e 64k, e o desempenho não mudou muito nas leituras sequenciais. 128k provavelmente seria um pouco mais eficiente em termos de espaço, mas 64k corresponde ao tamanho da unidade de alocação do SO do cliente iniciador e parece se sair significativamente melhor em cenários aleatórios de E / S (que são raros), embora não importe muito em cenários sequenciais de E / S .
obrienmd 7/08/19
Vou testar com txg_timeout mais alto - isso importaria no mínimo para leituras sequenciais? Dado o baixo iowait nos discos de apoio, não parecia que os fluxos de gravação estivessem enfrentando / impactando muito a velocidade média de leitura.
obrienmd 7/08/19
1
O feedback mais interessante que tenho para você (acho) é para o agendador ZIO. Quando movo a agulha em minutos e máximos assíncronos, ela destrói a agregação io e o resultado líquido é bastante ruim. Para leituras, que é o que realmente me interessa aqui, pois as gravações são ótimas, ir para 10/64 faz IOs médias para os discos ~ 16KB no iostat e reduz a velocidade de leitura média em 75% (~ 30 - 60MBps), considerando esses discos 'IOPS. Eu também tenho sincronização tweaked ler #s e não vi muito afeto, mas eu vou dar esse outro tiro independentemente :)
obrienmd
zfs zfs_dirty_data_max_percent = 25 - Normalmente sou 40% ou mais lá.
ewwhite
Oh, leituras são um problema? Que tipo de dados são esses? Quão cheia está a piscina?
ewwhite