Próbowałem znaleźć prostą odpowiedź na to pytanie, która okazała się nieuchwytna. To pytanie i odpowiedź są bliskie, ale tak naprawdę nie dają mi szczegółów, które chciałbym. Zacznijmy od tego, co myślę, że wiem.
Jeśli masz standardowe urządzenie blokowe i uruchomisz sudo blockdev --report
, otrzymasz coś takiego:
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
Teraz decydujesz się zmienić domyślną wartość 256 na 128, używając --setra
dowolnej partycji, i dzieje się tak w przypadku całego urządzenia blokowego, tak jak to:
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
Ma to dla mnie idealny sens - urządzenie na poziomie bloku jest tam, gdzie jest ustawienie, a nie partycja, więc wszystko się zmienia. Także domyślna relacja między ustawieniem RA a urządzeniem ma dla mnie sens, ogólnie jest to:
RA * sector size (default = 512 bytes)
Stąd zmiany, które wprowadziłem powyżej, przy domyślnym rozmiarze sektora spadną ponownie z 128k do 64k. Jak dotąd dobrze i dobrze.
Co się jednak stanie, gdy dodamy oprogramowanie RAID lub LVM i urządzenie do mapowania urządzeń? Wyobraź sobie, że twój raport wygląda następująco:
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
W tym przypadku mamy urządzenie LVM mapowane na urządzenie dm-0 na wierzchu md0 utworzonego przez mdadm, który w rzeczywistości jest paskiem RAID0 na czterech urządzeniach xvdg-j.
Zarówno md0, jak i dm-0 mają ustawienia 4096 dla RA, znacznie wyższe niż urządzenia blokowe. Oto kilka pytań tutaj:
- W jaki sposób ustawienie RA jest przekazywane w dół łańcucha wirtualnych urządzeń blokowych?
- Czy dm-0 przebija wszystko, ponieważ jest to urządzenie blokowe najwyższego poziomu, do którego faktycznie uzyskujesz dostęp?
- Czy
lvchange -r
miałby wpływ na urządzenie DM-0 i nie pojawiłby się tutaj?
Jeśli jest to tak proste, że ustawienie RA z wirtualnego urządzenia blokowego, którego używasz, zostaje przekazane, czy to oznacza, że odczyt z dm-0 (lub md0) przełoży się na 4 x 4096 odczytów RA? (jeden na każdym urządzeniu blokowym). Jeśli tak, oznaczałoby to, że te ustawienia eksplodują rozmiar głowicy w powyższym scenariuszu.
Jeśli chodzi o ustalenie, co właściwie robi ustawienie readahead:
Czego używasz, odpowiadającego powyższemu rozmiarowi sektora, aby określić rzeczywistą wartość początkową dla urządzenia wirtualnego:
- Rozmiar paska RAID (dla md0)?
- Jakieś inne równoważne wielkości sektora?
- Czy można to skonfigurować i jak?
- Czy FS gra rolę (interesuje mnie przede wszystkim ext4 i XFS)?
- A może po prostu przekazane, czy po prostu ustawienie RA z urządzenia najwyższego poziomu pomnożone przez rozmiar sektora rzeczywistych urządzeń blokowych?
Wreszcie, czy istnieje jakakolwiek preferowana zależność między rozmiarem paska a ustawieniem RA (na przykład)? Tutaj myślę, że jeśli pasek jest najmniejszym elementem, który ma być zdjęty z urządzenia RAID, idealnie nie chciałbyś, aby istniały 2 dostępy dyskowe do obsługi tej minimalnej jednostki danych i chciałbyś zrobić RA wystarczająco duży, aby spełnić żądanie za pomocą jednego dostępu.