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 --setra
em 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 -r
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 é 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.
fonte
Respostas:
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).
Definir / dev / md0 RA não afetará os dispositivos de bloco / dev / sdX.
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
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.
Sim, mas este é um caso particular. Vamos assumir que temos / dev / dm0, que é o / dev / vg0 / blockdevice do LVM. Se você fizer:
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.
Normalmente descubro o RA experimentando valores diferentes e testando-o com o hdparm.
O mesmo que acima.
Claro - este é um tópico muito grande. Eu recomendo que você comece aqui http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
fonte
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 ¢.
fonte
Isso é para a explicação. Fiz alguns testes com uma configuração RAID e LVM para provar que você está certo:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
O que importa é aquele que o sistema operacional está usando
fonte