Um sistema bastante básico executando mirror + stripe em discos sas 7.2k rpm, não particularmente carregado. Sem redução de redundância, compactação em todos os conjuntos de dados. Scrub está em execução há 15 dias na velocidade de um caracol morto. Existe alguma otimização que precisa ser feita ou pode ser devido a algum problema de hw?
- Dell R510 com gabinete MD1200.
- 2x Xeon E5620
- 48GB
- NexentaStor 3.1.3, edição comunitária
Alguma informação:
scan: scrub in progress since Mon Apr 1 19:00:05 2013
171G scanned out of 747G at 141K/s, 1187h40m to go
0 repaired, 22.84% done
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c7t5000C500414FB2CFd0 ONLINE 0 0 0
c7t5000C500414FCA57d0 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c7t5000C500415C3B1Bd0 ONLINE 0 0 0
c7t5000C500415C5E4Fd0 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
c7t5000C500415DC797d0 ONLINE 0 0 0
c7t5000C500415DC933d0 ONLINE 0 0 0
logs
c7t5000A7203006D81Ed0 ONLINE 0 0 0
cache
c7t5000A72030068545d0 ONLINE 0 0 0
# iostat -en
---- errors ---
s/w h/w trn tot device
0 8887 0 8887 c2t0d0
0 0 0 0 c0t395301D6B0C8069Ad0
0 0 0 0 c7t5000C500415DC933d0
0 0 0 0 c7t5000A72030068545d0
0 0 0 0 c7t5000C500415DC797d0
0 0 0 0 c7t5000C500414FCA57d0
0 0 0 0 c7t5000C500415C3B1Bd0
0 0 0 0 c7t5000C500415C5E4Fd0
0 0 0 0 c7t5000C500414FB2CFd0
0 0 0 0 c7t5000A7203006D81Ed0
O spa_last_io é alterado toda vez que eu executo este
# echo "::walk spa | ::print spa_t spa_name spa_last_io spa_scrub_inflight" | mdb -k
spa_name = [ "syspool" ]
spa_last_io = 0x25661402
spa_scrub_inflight = 0
spa_name = [ "tank" ]
spa_last_io = 0x25661f84
spa_scrub_inflight = 0x21
A cada 5 segundos, aproximadamente 20 a 25 MB / s são gravados. Entre essas gravações, basicamente não há leituras ou gravações.
capacity operations bandwidth latency
pool alloc free read write read write read write
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
syspool 427G 501G 0 0 0 0 0.00 0.00
c0t395301D6B0C8069Ad0s0 427G 501G 0 0 0 0 0.00 0.00
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
tank 903G 1.84T 810 5.21K 1.50M 20.8M 9.42 4.71
mirror 301G 627G 22 1.00K 53.0K 3.96M 8.96 3.93
c7t5000C500414FB2CFd0 - - 20 244 50.1K 3.97M 6.70 1.14
c7t5000C500414FCA57d0 - - 19 242 48.2K 3.97M 7.60 1.12
mirror 301G 627G 25 1016 46.8K 4.10M 16.11 5.28
c7t5000C500415C3B1Bd0 - - 21 257 41.6K 4.11M 4.63 1.24
c7t5000C500415C5E4Fd0 - - 21 255 43.0K 4.11M 16.54 1.15
mirror 301G 627G 62 754 119K 3.03M 19.72 3.78
c7t5000C500415DC797d0 - - 57 219 114K 3.03M 9.99 1.15
c7t5000C500415DC933d0 - - 56 220 119K 3.03M 13.20 1.22
c7t5000A7203006D81Ed0 260K 46.5G 0 0 0 0 0.00 0.00
cache - - - - - -
c7t5000A72030068545d0 93.1G 8M 0 0 0 0 0.00 0.00
------------------------- ----- ----- ----- ----- ----- ----- ----- -----
Os iostats estão me dizendo que estou gastando mais tempo esperando pelo disco do que deveria? Especificamente a coluna% b
# iostat -xe
device r/s w/s kr/s kw/s wait actv svc_t %w %b s/w h/w trn tot
sd3 5.1 43.9 20.6 643.8 0.0 0.1 2.9 0 5 0 0 0 0
sd4 9.4 1.8 141.1 169.6 0.0 0.0 0.5 0 0 0 0 0 0
sd5 3.1 43.8 15.8 643.8 0.0 0.1 1.4 0 3 0 0 0 0
sd6 5.2 38.1 14.3 494.4 0.0 0.1 3.0 0 7 0 0 0 0
sd7 4.2 40.2 11.1 623.2 0.0 0.1 2.7 0 7 0 0 0 0
sd8 3.6 44.3 9.7 623.2 0.0 0.1 1.5 0 4 0 0 0 0
sd9 2.9 37.4 7.0 494.4 0.0 0.1 1.3 0 2 0 0 0 0
sd10 0.7 0.4 3.4 0.0 0.0 0.0 0.0 0 0 0 0 0 0
A latência um pouco no lado alto?
# zpool iostat 10 10
capacity operations bandwidth latency
pool alloc free read write read write read write
tank 909G 1.83T 86 2.82K 208K 12.7M 22.68 13.63
---------- ----- ----- ----- ----- ----- ----- ----- -----
tank 909G 1.83T 29 857 42.4K 3.50M 17.86 4.47
---------- ----- ----- ----- ----- ----- ----- ----- -----
tank 909G 1.83T 30 947 46.1K 3.54M 15.55 5.67
Aplicou alguns ajustes que fizeram pouca diferença. zfs_top_maxinflight definido como 127, zfs_scrub_delay como 0 e zfs_scan_idle como 0.
# echo zfs_top_maxinflight | mdb -k
zfs_top_maxinflight:
zfs_top_maxinflight: 127
# echo zfs_scrub_delay/D |mdb -k
zfs_scrub_delay:
zfs_scrub_delay:0
# echo zfs_scan_idle/D |mdb -k
zfs_scan_idle:
zfs_scan_idle: 0
scan: scrub in progress since Wed Apr 17 20:47:23 2013
1.85G scanned out of 918G at 1.14M/s, 229h36m to go
0 repaired, 0.20% done
ajuste pré-mdb, observe a coluna b% bastante alta
$ iostat -nx -M 5
r/s w/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c2t0d0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c0t395301D6B0C8069Ad0
35.2 44.2 0.3 0.7 0.0 0.4 0.0 5.3 0 32 c7t5000C500415DC933d0
19.8 3.2 0.2 0.0 0.0 0.0 0.0 0.1 0 0 c7t5000A72030068545d0
31.2 46.2 0.2 0.7 0.0 0.3 0.0 4.4 0 27 c7t5000C500415DC797d0
30.6 46.8 0.2 0.8 0.0 0.4 0.0 4.6 0 28 c7t5000C500414FCA57d0
37.6 53.0 0.3 0.8 0.0 0.4 0.0 4.7 0 33 c7t5000C500415C3B1Bd0
37.6 53.6 0.3 0.8 0.0 0.5 0.0 5.6 0 39 c7t5000C500415C5E4Fd0
33.2 46.8 0.3 0.8 0.0 0.5 0.0 6.1 0 33 c7t5000C500414FB2CFd0
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c7t5000A7203006D81Ed0
pós mdb tweak, observe a coluna b%, 80-85% de tempo em espera ocupada
$ iostat -nx -M 5
r/s w/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 c2t0d0
0.2 27.2 0.0 0.3 0.0 1.0 0.0 35.4 0 18 c0t395301D6B0C8069Ad0
129.6 20.2 0.9 0.4 0.0 2.9 0.0 19.5 0 85 c7t5000C500415DC933d0
48.4 4.0 0.4 0.0 0.0 0.0 0.0 0.1 0 1 c7t5000A72030068545d0
130.4 19.8 0.9 0.4 0.0 3.0 0.0 20.2 0 84 c7t5000C500415DC797d0
125.8 25.8 0.9 0.5 0.0 2.9 0.0 19.2 0 80 c7t5000C500414FCA57d0
131.2 24.2 0.9 0.5 0.0 3.1 0.0 20.3 0 83 c7t5000C500415C3B1Bd0
130.6 25.8 0.9 0.5 0.0 3.5 0.0 22.5 0 88 c7t5000C500415C5E4Fd0
126.8 28.0 0.9 0.5 0.0 2.8 0.0 18.0 0 79 c7t5000C500414FB2CFd0
0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0 0 c7t5000A7203006D81Ed0
smartctl -A /dev/disk
diz sobre cada unidade (pode ser necessário instalarsmartctl
, não tenho certeza se ele acompanha a instalação básica).Respostas:
As operações de limpeza do ZFS operam com base em alguns princípios de morte cerebral. Mais notavelmente, ele só gasta tempo esfregando quando não há mais nada acontecendo. Se você vasculhar um pool com apenas um pouco de acesso a dados em uma base bastante constante, a limpeza efetivamente passará fome e não fará quase nada.
Ajustáveis para explorar, com minhas notas rápidas sobre o que ele faz (eu olhei pela última vez há algum tempo atrás):
Tudo isso pode ser alterado em tempo real usando "echo [sintonizável] / W0t [número]" para alterar e "echo [sintonizável] / D" para visualizar a configuração atual (o que eu recomendo fazer antes de alterar).
Portanto, na teoria e na prática geral, se você digitar, por exemplo, alterar zfs_scan_idle para 10 (ou 1 - ou 0, se for compatível com isso, precisaria verificar o código) e zfs_scrub_delay para 1 (ou 0, se suporta isso), e se a sua configuração txg_synctime_ms for 5000 ou mais, talvez altere um pouco o zfs_scan_min_time_ms, deve se tornar muito mais agressivo ao executar operações de limpeza mesmo com algum nível de E / S do usuário.
No seu caso específico, o% be asvc_t relatado implicam em uma carga de trabalho de leitura muito, muito aleatória (os discos giratórios devem fazer melhor do que isso se for realmente seqüencial), e você já fez as coisas "fáceis", como explicado acima . Então, primeiro eu ativaria zfs_no_scrub_prefetch, para desativar a pré-busca nas operações de limpeza, apenas para ver se isso ajudou. Se não houver alegria, dependendo da versão do Nexenta em que você está - você pode estar executando 30/5, 5/1 ou 10/5 (essa é uma abreviação que usamos para as configurações de zfs_txg_timeout & (zfs_txg_synctime_ms * 1000)). Altere zfs_txg_timeout para 10 e zfs_txg_synctime_ms para 5000 e tente aumentar o zfs_scan_min_time_ms para 3000 ou 4000. Isso indica ao ZFS que pode gastar muito mais tempo em scrubs, em comparação com as configurações padrão nas instalações mais antigas do NexentaStor que usam 5/1 como padrão - mas Cuidado,
Espero que isto ajude. Boa sorte!
fonte
Eu suspeito que o hardware ...
Por que você deixou isso funcionar por 15 dias? Isso não é normal. Pare a lavagem
zpool scrub -s tank
e verifique o sistema.fonte
Minha resposta chega um pouco tarde, mas se esse tipo de coisa acontece com mais alguém, aqui está a minha opinião: basta experimentar "dmesg". No meu caso, eu não estava limpando, mas estava copiando arquivos para os discos e ouvia claramente que os discos estavam ativos por alguns segundos, parando por mais tempo e depois trabalhando novamente. Isso ocorreu devido à falha de um controlador SATA e o dmesg me deu todos os erros. Eu pensei que era um disco com falha no começo, mas depois percebi que era realmente o controlador.
fonte
O Scrub usa o tempo de inatividade do sistema disponível, mesmo em um servidor descarregado, é sobre disponibilidade. Ram e Processador são as chaves para limpar a utilização, não o disco. Quanto mais disponíveis, melhor será o desempenho da sua limpeza. No entanto, certamente, nesse caso, quanto melhor seus discos forem dispostos, em termos de ZPools, melhor será o desempenho de sua limpeza.
Portanto, se seu desempenho tiver sido lento, e esse parece ser o caso, eu consideraria esses possíveis motivos.
fonte