xfs no lvm no hardware RAID: parâmetros corretos?

10

Eu tenho 10 discos com 8 TB cada um em um RAID6 de hardware (assim, 8 discos de dados + 2 paridade). Seguindo a resposta de uma pergunta muito semelhante , esperava uma detecção automática de todos os parâmetros necessários. No entanto, ao criar o sistema de arquivos XFS no final, recebi

# mkfs.xfs /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=40, agsize=268435455 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418200, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Parece que as faixas não foram usadas. Devido aos diferentes termos que encontrei em sites diferentes (tamanho da faixa, tamanho da faixa, parte da faixa, ...), gostaria de perguntar se obtive os parâmetros manuais corretamente.

O RAID 6 foi configurado com um tamanho de faixa de 256 KB:

# ./storcli64 /c0/v1 show all | grep Strip
Strip Size = 256 KB

Assim, o tamanho da faixa é 8 * 256 KB = 2048 KB = 2 MB. Isso está correto? De acordo com isso (e se eu entendi direito), o pvcreatetem que usar o tamanho da faixa (ou parte) como argumento para dataalignment:

# pvcreate --dataalignment 256K /dev/sdb
  Physical volume "/dev/sdb" successfully created

Observe que eu usei todo o dispositivo RAID sem partições. Agora um

# vgcreate vgdata /dev/sdb
  Volume group "vgdata" successfully created

com um tamanho padrão de PE de 4 MB deve ser bom porque é um múltiplo do tamanho da faixa de 2 MB. Corrigir?

Agora, uma parte do vgroup é atribuída a um volume lógico:

# lvcreate -L 40T vgdata -n lvscratch 
  Logical volume "lvscratch" created.

Finalmente, o sistema de arquivos é criado, mas agora com os argumentos corretos (tamanho da faixa de 2 MB, largura da faixa de 8):

# mkfs.xfs -d su=2048k,sw=8 /dev/vgdata/lvscratch 
meta-data=/dev/vgdata/lvscratch  isize=256    agcount=41, agsize=268434944 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10737418240, imaxpct=5
         =                       sunit=512    swidth=4096 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Essa abordagem está correta? Há algo a ter em mente para uma extensão do volume lógico ou do grupo de volumes? Suponho que, se o grupo de volumes for estendido com outro sistema RAID6, o tamanho da faixa deverá ser igual ao atual RAID6.

EDIT : Minha confusão parece basear-se principalmente no uso diferente dos termos conectados ao stripe. O fabricante do meu controlador RAID, LSI ou Avago, define os termos da seguinte maneira :

Largura da faixa

Largura da faixa é o número de unidades envolvidas em um grupo de unidades em que a faixa é implementada. Por exemplo, um grupo de unidades de quatro discos com faixas de disco tem uma largura de faixa de quatro.

Tamanho da faixa

O tamanho da faixa é o comprimento dos segmentos de dados intercalados que o controlador RAID grava em várias unidades, sem incluir as unidades de paridade. Por exemplo, considere uma faixa que contém 64 KB de espaço em disco e 16 KB de dados que residem em cada disco na faixa. Nesse caso, o tamanho da faixa é de 64 KB e o tamanho da faixa é de 16 KB.

Tamanho da tira

O tamanho da faixa é a parte de uma faixa que reside em uma única unidade.

A Wikipedia (e a IBM ) parecem usar outras definições:

Os segmentos de dados sequenciais gravados ou lidos a partir de um disco antes da operação continuar no próximo disco são geralmente chamados de chunks, strides ou stripe units, enquanto seus grupos lógicos que formam operações com uma única faixa são chamados strips ou stripes. A quantidade de dados em um pedaço (unidade de faixa), geralmente denominada em bytes, é chamada de tamanho do pedaço, tamanho da passada, tamanho da faixa, profundidade da faixa ou profundidade da faixa. Às vezes, o número de discos de dados na matriz é chamado de largura da faixa, mas também pode se referir à quantidade de dados em uma faixa.

A quantidade de dados em uma etapa multiplicada pelo número de discos de dados na matriz (ou seja, profundidade da faixa vezes a largura da faixa, que na analogia geométrica renderia uma área) às vezes é chamada de tamanho ou largura da faixa. A distribuição ampla ocorre quando pedaços de dados são espalhados por várias matrizes, possivelmente todas as unidades do sistema. A distribuição estreita ocorre quando os blocos de dados são espalhados pelas unidades em uma única matriz.

Mesmo no texto da Wikipedia, o tamanho da faixa acima é usado com dois significados diferentes. No entanto, suponho que agora, ao criar o sistema de arquivos xfs, o tamanho de um único bloco armazenado em uma única unidade precise ser fornecido como argumento para su. Isso deve estar mkfs.xfs -d su=256k,sw=8no comando acima. Corrigir?

sebschub
fonte

Respostas:

12

Em vez de "tamanho da faixa" e "tamanho da faixa", as páginas de manual do XFS usam os termos "unidade de faixa" e "largura da faixa", respectivamente.

Isso torna possível decodificar o texto confuso na mkfs.xfs(8)página do manual:

               sunit=value
                      This is used to specify the stripe unit for  a  RAID
                      device  or  a  logical  volume.  The value has to be
                      specified in 512-byte block units. Use the su subop‐
                      tion  to specify the stripe unit size in bytes. This
                      suboption ensures  that  data  allocations  will  be
                      stripe  unit aligned when the current end of file is
                      being extended and the  file  size  is  larger  than
                      512KiB.  Also inode allocations and the internal log
                      will be stripe unit aligned.

               su=value
                      This is an alternative to using sunit.  The su  sub‐
                      option is used to specify the stripe unit for a RAID
                      device or a striped logical volume. The value has to
                      be  specified  in  bytes,  (usually using the m or g
                      suffixes). This value must  be  a  multiple  of  the
                      filesystem block size.

Portanto, com sua matriz relatando um tamanho de faixa de 256KiB, você deve especificar um su=256Kou sunit=512(porque 512 blocos de 512 bytes são iguais a 256KiB).

               swidth=value
                      This  is used to specify the stripe width for a RAID
                      device or a striped logical volume. The value has to
                      be  specified  in  512-byte  block units. Use the sw
                      suboption to specify the stripe width size in bytes.
                      This  suboption  is  required  if  -d sunit has been
                      specified and it has to be  a  multiple  of  the  -d
                      sunit suboption.

               sw=value
                      suboption is an alternative to using swidth.  The sw
                      suboption is used to specify the stripe width for  a
                      RAID  device or striped logical volume. The value is
                      expressed as a multiplier of the stripe  unit,  usu‐
                      ally the same as the number of stripe members in the
                      logical volume configuration, or  data  disks  in  a
                      RAID device.

                      When  a  filesystem  is  created on a logical volume
                      device, mkfs.xfs will automatically query the  logi‐
                      cal volume for appropriate sunit and swidth values.

Com 10 spindles (8 dados, 2 paridade), você especificaria sw=8(spindles de dados) ou swidth=2M(o tamanho da tira multiplicado pelos spindles de dados).

Observe que xfs_info e mkfs.xfsinterprete sunite swidthcomo sendo especificado em unidades de setores 512B; infelizmente, essa não é a unidade em que são relatados. xfs_infoe mkfs.xfsrelate-os em múltiplos do seu tamanho básico de bloco ( bsize) e não nos setores 512B.

TL; DR:

A maneira mais fácil de especificá-las é geralmente pelo tamanho da tira e pela contagem de eixos, portanto, su=tamanho da tira e sw=contagem de eixos.

Michael Hampton
fonte
Muito obrigado pelo esclarecimento! O uso diferente do termo tamanho da faixa (para o bloco em um disco ou para todos os discos de dados juntos) é bastante confuso ... Você também pode elaborar o uso do tamanho do bloco de faixas como argumento para pvcreate's' --dataalignment?
sebschub
1
O alinhamento dos dados deve ter a largura total da faixa, neste caso 2M, e o tamanho da extensão física usada vgcreatedeve ser o mesmo ou um múltiplo disso.
22716 Michael JacksonJul
1

O volume lógico não foi distribuído (-i 8 -I 256k), portanto, o sistema de arquivos xfs não vê nada além de um único disco contíguo

Pergunta antiga, mas salve outros usuários do mesmo erro.

mwk
fonte