Ho cercato di trovare una risposta diretta su questo, e si è rivelato sfuggente. Questa domanda e la sua risposta sono vicine, ma in realtà non mi danno le specifiche che vorrei. Cominciamo con quello che penso di sapere.
Se hai un dispositivo a blocchi standard e corri sudo blockdev --report
otterrai qualcosa del genere:
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
Ora, decidi di cambiare i 256 a 128 predefiniti usando --setra
su una qualsiasi delle partizioni e succede all'intero dispositivo a blocchi, in questo modo:
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
Questo ha perfettamente senso per me: il dispositivo a livello di blocco è dove si trova l'impostazione, non la partizione, quindi tutto cambia. Anche la relazione predefinita tra l'impostazione RA e il dispositivo ha senso per me, in genere è:
RA * sector size (default = 512 bytes)
Quindi, le modifiche che ho apportato sopra, con la dimensione del settore predefinito, faranno scendere la lettura da 128k a 64k. Finora tutto bene.
Tuttavia, cosa succede quando si aggiunge un RAID software o LVM e Device Mapper? Immagina invece che il tuo rapporto assomigli a questo:
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
In questo caso abbiamo un dispositivo LVM dm-0 mappato sul dispositivo in cima al md0 creato da mdadm, che in realtà è una striscia RAID0 attraverso i quattro dispositivi xvdg-j.
Sia md0 che dm-0 hanno impostazioni di 4096 per RA, molto più alte dei dispositivi a blocchi. Quindi, alcune domande qui:
- In che modo l'impostazione RA viene trasmessa lungo la catena di dispositivi a blocco virtuale?
- Dm-0 vince su tutto perché quello è il dispositivo di blocco di livello superiore a cui stai effettivamente accedendo?
- Avrebbe
lvchange -r
un impatto sul dispositivo dm-0 e non verrà visualizzato qui?
Se è semplice come, l'impostazione RA dal dispositivo a blocchi virtuale in uso viene trasmessa, significa che una lettura da dm-0 (o md0) si tradurrà in 4 letture RA 4096? (uno su ciascun dispositivo a blocchi). In tal caso, ciò significherebbe che queste impostazioni esplodono le dimensioni del readahead nello scenario sopra.
Quindi, in termini di capire cosa sta effettivamente facendo l'impostazione readahead:
Cosa usi, equivalente alla dimensione del settore sopra per determinare il valore di lettura reale per un dispositivo virtuale:
- La dimensione di striping del RAID (per md0)?
- Qualche equivalente in altre dimensioni del settore?
- È configurabile e come?
- L'FS ha un ruolo (sono principalmente interessato a ext4 e XFS)?
- Oppure, se viene appena trasmesso, è semplicemente l'impostazione RA dal dispositivo di livello superiore moltiplicata per la dimensione del settore dei dispositivi a blocchi reali?
Infine, ci sarebbe una relazione preferita tra la dimensione della striscia e l'impostazione RA (per esempio)? Qui sto pensando che se la striscia è l'elemento più piccolo che verrà rimosso dal dispositivo RAID, idealmente non vorresti che ci fossero 2 accessi al disco per servire quell'unità minima di dati e vorresti creare l'AR abbastanza grande da soddisfare la richiesta con un unico accesso.