RAID6 resync com gravações rápidas, mas leituras lentas

6

Estou usando o Debian Jessie.

# uname -a
Linux host 4.9.0-0.bpo.3-amd64 #1 SMP Debian 4.9.30-2+deb9u5~bpo8+1 (2017-09-28) x86_64 GNU/Linux

E configure um RAID6.

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 1/73 pages [4KB], 65536KB chunk

São 4x o Seagate Enterprise 10TB 7200rpm. Ao copiar um arquivo grande da matriz RAID para o disco do sistema interno (que é um SSD), recebo uma taxa de transferência média de 220MB / s. A cópia de arquivos grandes do SSD para o array é feita com 145MB / s. Quando a verificação RAID mensal é feita (iniciada pela execução da tarefa cron checkarray --cron --all --idle --quiet , que é o comportamento padrão), posso ver

# cat /proc/mdstat                                                                                                                                                 Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      [>....................]  check =  0.7% (72485728/9766305792) finish=817.2min speed=197694K/sec
      bitmap: 1/73 pages [4KB], 65536KB chunk

Então a velocidade de ressincronização também é ótima. Agora, há algum comportamento estranho. Enquanto a verificação é executada, posso gravar dados na matriz paralelamente a um bom desempenho. A velocidade de gravação é de ~ 100MB / s e pode-se ver que a velocidade de sincronização do RAID diminui. Depois que a cópia para o array estiver concluída, a velocidade de sincronização aumentará para a velocidade anterior novamente. O problema é da matriz enquanto a verificação está em execução. As leituras são feitas com < 20MB / s. E a velocidade de ressincronização para RAID não diminui. Eu não tenho idéia do que é o motivo disso.

# ps aux | grep md0
root       211  0.4  0.0      0     0 ?        S    Okt22  93:40 [md0_raid6]
root       648  0.0  0.0      0     0 ?        S    Okt22   0:01 [jbd2/md0-8]
root     15361  4.4  0.0      0     0 ?        DN   02:25   0:00 [md6_resync]
root     15401  0.0  0.0  12752  2040 pts/2    S+   02:26   0:00 grep md6
# ionice -p 211
none: prio 0
# ionice -p 15361
idle

O processo de ressincronização está definido como idle , o que está correto. O agendador de E / S está configurado para CFQ para todos os discos físicos subjacentes.

Há um RAID1 neste sistema também

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sde[0] sdf[1]
      3906887488 blocks super 1.2 [2/2] [UU]
      bitmap: 2/30 pages [8KB], 65536KB chunk

Este array não tem problema. Eu posso escrever e ler a partir do array com boas velocidades enquanto a verificação está em execução. Observando /proc/mdstat , a velocidade de sincronização diminui na atividade de E / S e aumenta após o término novamente. Mas não para leitura de E / S em md0 / RAID6. Quanto a md0 normal a velocidade de sincronização é muito boa, as leituras e gravações normais sem ressincronização são boas e até escritas no array enquanto a execução da verificação RAID é muito boa, porque as leituras são tão ruins quando a verificação mensal está sendo executada ?

    
por rabudde 06.11.2017 / 09:59

1 resposta

1

Deixe-me começar dizendo que não tenho uma idéia real sobre o mdadm ou o Debian - no entanto, acho que o efeito que você está vendo é muito geral.

A velocidade de gravação normalmente mais lenta do que a de leitura é esperada quando você olha como o RAID 6 funciona: com as leituras, todos os quatro discos podem ser lidos de forma simultânea. Os dados de paridade são ignorados e, em vez disso, o próximo segmento de dados pode ser lido antecipadamente para o cache. A melhor velocidade de leitura que pode ser alcançada é n vezes a velocidade de um único disco.

Na gravação, os dados são aumentados por dois segmentos de paridade diferentes que precisam ser gravados no disco também. Quando todos os discos escrevem ao mesmo tempo, a melhor velocidade a ser alcançada é n -2 vezes a velocidade única.

Uma ressincronização ou reconstrução do RAID 6 com poucos discos grandes levará um longo tempo. Essencialmente, cada faixa deve ser lida e comparada com os dados de redundância também armazenados nos discos. Os discos são muito carregados e qualquer E / S produtiva tem que competir com todas as leituras. É por isso que as leituras são lentas. Para ter uma latência de leitura decente, a sincronização em segundo plano precisa ser executada com baixa prioridade, ou seja, ela precisa parar e pausar por um momento quando outra E / S é detectada.

As gravações, por outro lado, vão para o cache primeiro e parecerão terminadas imediatamente - contanto que haja cache disponível. A gravação real acontecerá em segundo plano em algum momento ou outro. Somente quando seu valor de gravação exceder a capacidade de armazenamento em cache, você notará uma séria lentidão.

Para obter a velocidade de leitura em um nível decente durante a ressincronização, é necessário fazer com que a verificação em segundo plano seja executada em um ritmo lento para começar ou descobrir uma maneira de fazê-la pausar quando leituras produtivas forem concluídas.

    
por 08.11.2017 / 22:00