Configurações de Readahead para LVM, Mapeador de dispositivos, Raid de software e dispositivos de bloco - o que ganha?

26

Eu tenho tentado encontrar uma resposta direta sobre este, e provou ser ilusório. Esta pergunta e sua resposta estão próximas, mas realmente não me dão as especificidades que eu gostaria. Vamos começar com o que acho que sei.

Se você tiver um dispositivo de bloco padrão e executar sudo blockdev --report, obterá algo como isto:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0    500107862016   /dev/sda
rw   256   512  4096       2048    399999238144   /dev/sda1
rw   256   512  1024  781252606            1024   /dev/sda2

Agora, você decide alterar esse padrão de 256 para 128 usando --setraem qualquer uma das partições e isso acontece com todo o dispositivo de bloco, assim:

sudo blockdev --setra 128 /dev/sda1
sudo blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   128   512  4096          0    500107862016   /dev/sda
rw   128   512  4096       2048    399999238144   /dev/sda1
rw   128   512  1024  781252606            1024   /dev/sda2

Isso faz todo o sentido para mim - o dispositivo no nível do bloco é onde está a configuração, não a partição, então tudo muda. Além disso, a relação padrão entre a configuração de RA e o dispositivo faz sentido para mim, geralmente é:

RA * sector size (default = 512 bytes)

Portanto, as alterações feitas acima, com o tamanho padrão do setor, reduzirão o readahead de 128k para 64k. Tudo muito bem até agora.

No entanto, o que acontece quando adicionamos um RAID de software ou LVM e um mapeador de dispositivos? Imagine que o seu relatório tenha a seguinte aparência:

RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096          0     10737418240   /dev/xvda1
rw   256   512  4096          0    901875499008   /dev/xvdb
rw   256   512  4096          0    108447924224   /dev/xvdj
rw   256   512  4096          0    108447924224   /dev/xvdi
rw   256   512  4096          0    108447924224   /dev/xvdh
rw   256   512  4096          0    108447924224   /dev/xvdg
rw  4096   512  4096          0    433787502592   /dev/md0
rw  4096   512   512          0    429496729600   /dev/dm-0

Nesse caso, temos um dispositivo LVM dm-0 mapeado por dispositivo em cima do md0 criado por mdadm, que é de fato uma faixa RAID0 entre os quatro dispositivos xvdg-j.

Tanto o md0 quanto o dm-0 têm configurações de 4096 para RA, muito mais altas que os dispositivos de bloco. Então, algumas perguntas aqui:

  • Como a configuração de RA é transmitida pela cadeia de dispositivos de bloco virtual?
  • O dm-0 supera tudo porque esse é o dispositivo de bloco de nível superior que você está realmente acessando?
  • Teria lvchange -rimpacto no dispositivo dm-0 e não apareceria aqui?

Se for tão simples quanto, a configuração de RA do dispositivo de bloco virtual que você está usando é passada adiante, isso significa que uma leitura de dm-0 (ou md0) será convertida em 4 x 4096 leituras de RA? (um em cada dispositivo de bloco). Nesse caso, isso significaria que essas configurações explodem o tamanho do cabeçote de leitura no cenário acima.

Então, em termos de descobrir o que a configuração readahead está realmente fazendo:

O que você usa, equivalente ao tamanho do setor acima para determinar o valor real do readahead para um dispositivo virtual:

  • O tamanho da faixa do RAID (para md0)?
  • Algum outro tamanho de setor equivalente?
  • É configurável e como?
  • O FS desempenha um papel (estou interessado principalmente em ext4 e XFS)?
  • Ou, se for repassado, é simplesmente a configuração de RA do dispositivo de nível superior multiplicada pelo tamanho do setor dos dispositivos de bloco reais?

Finalmente, haveria uma relação preferida entre o tamanho da faixa e a configuração de RA (por exemplo)? Aqui eu estou pensando que, se a faixa é o menor elemento que será retirado do dispositivo RAID, você idealmente não gostaria que houvesse 2 acessos em disco para atender a essa unidade mínima de dados e desejaria criar o RA grande o suficiente para atender à solicitação com um único acesso.

Adam C
fonte
Qual distribuição Linux você está usando? Você está usando ataque de hardware ou software? Parece software. Se houver hardware, qual placa / chipset você está usando muito disso é definido e armazenado no firmware do dispositivo.
Jason Huntley
Além disso, as configurações de RA dependem muito do seu esquema de alocação do sistema de arquivos. Você está usando ext4?
precisa
Na verdade, eu mencionei que é software RAID e LVM na questão, então sim - software. Em termos de sistema de arquivos, eu estaria interessado na diferença entre XFS e ext4 aqui, respostas para qualquer um seria bom embora
Adam C
O XFS pode ser ajustado fortemente para obter melhor desempenho. Isso é abordado em alguns locais deste site: aqui e aqui ... Que distribuição do Linux você está usando? Isso representa um fator, porque também existem algumas ferramentas específicas de distribuição.
ewwhite
Este não é um questões de desempenho, é mais específico - Eu só quero saber sobre as configurações de RA e como eles se traduzem através / interagir com o LVM / Software camadas RAID
Adam C

Respostas:

11

Como a configuração de RA é transmitida pela cadeia de dispositivos de bloco virtual?

Depende. Vamos supor que você esteja dentro do Xen domU e tenha RA = 256. Seu / dev / xvda1 é LV real no dom0 visível em / dev / dm1. Então você tem RA (domU (/ dev / xvda1)) = 256 e RA (dom0 (/ dev / dm1)) = 512. Isso terá tal efeito que o kernel dom0 acessará / dev / dm1 com outro RA que não seja o kernel da domU. Simples assim.

Outra situação ocorrerá se assumirmos a situação / dev / md0 (/ dev / sda1, / dev / sda2).

blockdev --report | grep sda
rw   **512**   512  4096          0   1500301910016   /dev/sda
rw   **512**   512  4096       2048      1072693248   /dev/sda1
rw   **512**   512  4096    2097152   1499227750400   /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw   **256**   512  4096          0   1500301910016   /dev/sda
rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2

Definir / dev / md0 RA não afetará os dispositivos de bloco / dev / sdX.

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

Então, geralmente, na minha opinião, o kernel acessa o dispositivo de bloco da maneira que está realmente configurada. Um volume lógico pode ser acessado via RAID (do qual faz parte) ou dispositivo devicemapper e cada um com outro RA que será respeitado.

Portanto, a resposta é - a configuração de RA não é passada na cadeia de dispositivos de bloco, mas seja qual for a configuração de RA de dispositivo de nível superior, será usada para acessar os dispositivos constituintes

O dm-0 supera tudo porque esse é o dispositivo de bloco de nível superior que você está realmente acessando?

Se você quer dizer propagação profunda por "trunfo tudo" - conforme meu comentário anterior, acho que você pode ter RAs diferentes para dispositivos diferentes no sistema.

O lvchange -r teria um impacto no dispositivo dm-0 e não apareceria aqui?

Sim, mas este é um caso particular. Vamos assumir que temos / dev / dm0, que é o / dev / vg0 / blockdevice do LVM. Se você fizer:

lvchange -r 512 /dev/vg0/blockdevice

o / dev / dm0 também mudará porque / dev / dm0 e / dev / vg0 / blockdevice são exatamente o mesmo dispositivo de bloco quando se trata de acesso ao kernel.

Mas vamos assumir que / dev / vg0 / blockdevice é o mesmo que / dev / dm0 e / dev / xvda1 no Xen domU que o está utilizando. Definir o RA de / dev / xvda1 entrará em vigor, mas o dom0 verá ainda ter seu próprio RA.

O que você usa, equivalente ao tamanho do setor acima para determinar o valor real do readahead para um dispositivo virtual:

Normalmente descubro o RA experimentando valores diferentes e testando-o com o hdparm.

O tamanho da faixa do RAID (para md0)?

O mesmo que acima.

O FS desempenha um papel (estou interessado principalmente em ext4 e XFS)?

Claro - este é um tópico muito grande. Eu recomendo que você comece aqui http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
fonte
Isso está muito próximo do que estou procurando e do que eu suspeitava - você pode esclarecer uma coisa para mim: na situação / dev / md0 (/ dev / sda1, / dev / sda2) eu sei que você pode definir separar valores de RA, mas se você disser mount / data em / dev / md0 e ler um arquivo a partir dele - o 512 RA será usado para ler em / dev / sda1 e / dev / sda2 (ou seja, 512 usado para ambos) ou 256 é usado em cada um? Se o ex-pareceria sensato ter RAID0 RA conjunto para: SUM (RA de dispositivos no RAID0)
Adam C
1
Acabei de contar com a minha experiência - configurar RA = 512 em / dev / md0 com discos / dev / sdX abaixo, age exatamente da mesma maneira que tivemos acesso a / dev / sdX com RA = 512, apesar de, por exemplo, podermos ter RA = 256 configuração no dispositivo de bloco inferior. A configuração 256 será ignorada neste caso (observe que / dev / sda é inútil como um dispositivo de bloco se fizer parte de / dev / md0). Eu não sou um programador de kernel, mas isso parece lógico e parece ser confirmado pela minha prática. Tão reconfortante. 3 threads lendo de / dev / md0, RA = 512 iguais 3 threads lendo de / dev / sd {a, b, c} com RA = 512.
Wojciechz 23/08/2012
Ótimo, obrigado! Eu editei as coisas um pouco para deixar isso mais claro na resposta. Posso pedir mais uma coisa antes de aceitar? Você tem um exemplo (ou link para um) para usar o hdparm para testar o RA? Eu mesmo faria algo semelhante, então, se houver uma boa referência, isso me poupará tempo.
23612 Adam C
Não é complicado, mas depende do que você deseja verificar. Por favor, consulte o manual hdparm. Se você deseja verificar as leituras do disco (que é um derivado do readahead), você pode emitir um comando como hdparm -t / dev / md0 . O resultado mostrará algo como leituras de disco no buffer de tempo: 310 MB em 3,02 segundos = 102,79 MB / s . O último valor geralmente é fortemente afetado pela configuração de RA.
Wojciechz 23/08/2012
1
ah, então não uma medida direta - entendido, aceitando agora - obrigado pela ajuda :)
Adam C
4

Saiba a resposta mais difícil de explicar, então farei isso no exemplo. Digamos que você tenha 3 dispositivos de bloco e defina seu RA para dizer 4 (4 * 512 bytes), assumindo o setor padrão. Se você dissesse usar um esquema RAID-5 usando os três discos, qualquer leitura que tocasse uma faixa em um disco exclusivo aumentaria o RA pelo fator em que você configurou inicialmente o dispositivo de bloco RA. Portanto, se sua leitura abrange exatamente todos os três discos, seu RA efetivo é de 12 * 512 bytes. Isso pode ser composto pela determinação da RA nos vários níveis, por exemplo, MD ou LVM. Como regra geral, se meu aplicativo se beneficia do RA, eu o defino na camada mais alta possível, para não compor o RA desnecessariamente. Em seguida, inicio o sistema de arquivos no setor 2049 e compenso cada início de setor em um número divisível por 8. Talvez esteja muito diferente do que você está perguntando, mas esse é o meu 2 ¢.

Bill Clark
fonte
Então, você está dizendo que qualquer que seja a configuração de RA no dispositivo de nível superior, ela simplesmente será transmitida. Portanto, se você usasse LVM -> 2 x RAID -> 4 x disco físico cada e tivesse RA de 4, porque há 8 dispositivos físicos, você terá um RA efetivo de 32. Como você ajustaria o tamanho do pedaço / faixa do RAID para ser eficiente nesse cenário - presumo que você deseja que o RA cubra uma faixa inteira para que você não precise acessar duas vezes?
22612 Adam C
BTW, se eu estiver acertando, no cenário que descrevo, acho que gostaria que o pedaço / faixa do RAID0 estivesse definido como X, onde X = RA * 512 bytes. Portanto, se eu tiver um pedaço / faixa de 64k (o padrão mdadm), o RA mínimo que devo usar é 128, porque isso me dá a faixa inteira de uma só vez.
Adam C