Readahead Settings para LVM, Device-Mapper, Raid de Software e Dispositivos de Bloco - o que ganha?

26

Eu tenho tentado encontrar uma resposta direta sobre isso, e isso tem sido elusivo. Este pergunta e sua resposta está próxima, mas realmente não me dá os detalhes que gostaria. Vamos começar com o que eu acho que sei.

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

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 --setra em qualquer uma das partições e isso acontece com todo o dispositivo de bloco, da seguinte forma:

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 de nível de bloco é onde a configuração é, não a partição, então tudo muda. Além disso, o relacionamento padrão entre a configuração RA e o dispositivo faz sentido para mim, geralmente é:

RA * sector size (default = 512 bytes)

Assim, as alterações que fiz acima, com o tamanho do setor padrão, diminuirão de leitura de 128k para 64k. Tudo bem até agora.

No entanto, o que acontece quando adicionamos um software RAID, ou LVM e device-mapper? Imagine que seu relatório seja assim:

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

Neste caso, temos um dispositivo LVM dm-0 mapeado por dispositivo na parte superior do md0 criado pelo mdadm, que é na verdade uma faixa RAID0 nos quatro dispositivos xvdg-j.

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

  • Como a configuração RA é transmitida pela cadeia de dispositivos de blocos virtuais?
  • O dm-0 supera tudo porque esse é o dispositivo de bloco de nível superior que você está realmente acessando?
  • O lvchange -r teria um impacto 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 é transmitida, isso significa que uma leitura de dm-0 (ou md0) será traduzida em leituras RA de 4 x 4096? (um em cada dispositivo de bloco). Se assim for, isso significaria que essas configurações explodem o tamanho do readahead no cenário acima.

Em seguida, em termos de descobrir o que a configuração de leitura está realmente fazendo:

O que você usa, equivalente ao tamanho do setor acima para determinar o valor real de leitura de 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 principalmente interessado em ext4 e XFS)?
  • Ou, se for transmitido, é simplesmente a configuração do RA do dispositivo de nível superior multiplicada pelo tamanho do setor dos dispositivos de bloco reais?

Finalmente, haveria alguma relação preferida entre o tamanho da faixa e a configuração do 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 dois acessos ao disco para atender essa unidade mínima de dados e gostaria de fazer o RA grande o suficiente para atender a solicitação com um único acesso.

    
por Adam C 16.08.2012 / 21:07

3 respostas

11

How does the RA setting get passed down the virtual block device chain?

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. Ele terá tal efeito que o kernel dom0 acessará / dev / dm1 com outro RA que o kernel do domU. Simples assim.

Outra sittutation ocorrerá se assumirmos / dev / md0 (/ dev / sda1, / dev / sda2) sittuation.

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

A configuração / 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 blockdevice da maneira que está realmente definida. Um volume lógico pode ser acessado via dispositivo RAID (do qual faz parte) ou devicemapper e cada um com outro RA que será respeitado.

Então a resposta é - a configuração RA não é transmitida pela cadeia de dispositivos de bloco, mas qualquer que seja a configuração de RA de dispositivo de nível superior, será usada para acessar os dispositivos constituintes

Does dm-0 trump all because that is the top level block device you are actually accessing?

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

Would lvchange -r have an impact on the dm-0 device and not show up here?

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

lvchange -r 512 /dev/vg0/blockdevice

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

Mas vamos supor 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 terá efeito, mas o dom0 verá ainda ter seu próprio RA.

What do you use, equivalent to the sector size above to determine the actual readahead value for a virtual device:

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

The stripe size of the RAID (for md0)?

O mesmo que acima.

Does the FS play a part (I am primarily interested in ext4 and XFS)?

Claro - este é um tópico muito grande. Recomendo que você comece aqui link

    
por 23.08.2012 / 16:26
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 3 discos, qualquer leitura que até mesmo tocasse uma faixa em um disco exclusivo aumentaria o RA pelo fator que você definiu inicialmente como AR do dispositivo de bloco. Portanto, se a sua leitura abrangesse exatamente todos os 3 discos, o RA efetivo seria 12 * 512 bytes. Isso pode ser composto pela configuração RA nos vários níveis, por exemplo, MD ou LVM. Como regra geral, se meu aplicativo se beneficia do RA, eu o coloco na camada mais alta possível, para não complicar a RA desnecessariamente. Eu então inicio o sistema de arquivos no setor 2049 e desloco cada início de setor em um número divisível por 8. Eu posso estar longe do que você está pedindo, mas este é meu 2 ¢.

    
por 22.08.2012 / 04:02
0

Isso é para a explicação. Fiz alguns testes com uma configuração RAID e LVM para provar que você está certo:

link

O que importa é o que o SO está usando

    
por 13.05.2017 / 02:11