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.
źródło
Odpowiedzi:
To zależy. Załóżmy, że jesteś w Xen domU i masz RA = 256. Twój / dev / xvda1 to rzeczywisty LV na dom0 widoczny pod / dev / dm1. Masz więc RA (domU (/ dev / xvda1)) = 256 i RA (dom0 (/ dev / dm1)) = 512. Będzie to miało taki efekt, że jądro dom0 uzyska dostęp do / dev / dm1 z innym RA niż jądro domU. Proste.
Kolejne sittutation nastąpi, jeśli założymy, że / dev / md0 (/ dev / sda1, / dev / sda2) sittuation.
Ustawienie / dev / md0 RA nie wpłynie na urządzenia blokowe / dev / sdX.
Ogólnie moim zdaniem jądro uzyskuje dostęp do urządzenia blokowego w sposób, który jest faktycznie ustawiony. Dostęp do jednego woluminu logicznego można uzyskać za pośrednictwem RAID (którego jest częścią) lub urządzenia devicemapper, a każdy z innym RA, który będzie przestrzegany.
Tak więc odpowiedź brzmi - ustawienie RA na IMHO nie jest przekazywane w dół łańcucha urządzeń blokowych, ale niezależnie od ustawienia RA urządzenia najwyższego poziomu, zostanie wykorzystane do uzyskania dostępu do urządzeń składowych
Jeśli masz na myśli głęboką propagację przez „atut wszystkiego” - zgodnie z moim poprzednim komentarzem myślę, że możesz mieć różne RA dla różnych urządzeń w systemie.
Tak, ale to jest szczególny przypadek. Załóżmy, że mamy / dev / dm0, czyli LVM's / dev / vg0 / blockdevice. Jeśli zrobisz:
/ dev / dm0 również się zmieni, ponieważ / dev / dm0 i / dev / vg0 / blockdevice są dokładnie tym samym urządzeniem blokowym, jeśli chodzi o dostęp do jądra.
Załóżmy jednak, że / dev / vg0 / blockdevice jest taki sam jak / dev / dm0 i / dev / xvda1 w Xen domU, który z niego korzysta. Ustawienie RA dla / dev / xvda1 zadziała, ale dom0 zobaczy, że nadal ma swoją własną RA.
Zazwyczaj odkrywam RA, eksperymentując z różnymi wartościami i testując go z hdparm.
Tak samo jak powyżej.
Jasne - to bardzo duży temat. Polecam Rozpocznij tutaj http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php
źródło
Poznaj odpowiedź trudniejszą do wyjaśnienia, więc zrobię to na przykład. Powiedzmy, że masz 3 urządzenia blokowe i ustawiłeś RA na 4 (4 * 512 bajtów) przy założeniu standardowego sektora. Jeśli powiesz, że korzystasz ze schematu RAID-5 przy użyciu 3 dysków, każdy odczyt, który nawet dotknie paska na unikalnym dysku, spotęguje RA przez czynnik, na który początkowo ustawiłeś urządzenie blokowe RA. Więc jeśli odczyt obejmuje dokładnie wszystkie 3 dyski, wówczas efektywna pamięć RA wyniesie 12 * 512 bajtów. Można to spotęgować poprzez ustalenie RA na różnych poziomach, np. MD lub LVM. Zasadniczo, jeśli moja aplikacja korzysta z RA, ustawiam ją na najwyższą możliwą warstwę, więc nie niepotrzebnie łączę RA. Następnie uruchamiam system plików w sektorze 2049 i odsyłam każdy sektor zaczynając od liczby podzielnej przez 8. Mogę być daleko od tego, o co prosisz, ale to moje 2 ¢.
źródło
To dla wyjaśnienia. Przeprowadziłem kilka testów z konfiguracją RAID i LVM, aby udowodnić, że masz rację:
https://fatalfailure.wordpress.com/2017/05/13/where-to-set-readahead-lvm-raid-devices-device-mapper-block-devices
Liczy się ten, którego używa system operacyjny
źródło