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.