Ustawienia Readahead dla LVM, Device-Mapper, Software Raid i Block Devices - co wygrywa?

26

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 --setradowolnej 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 -rmiał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.

Adam C.
źródło
Jakiej dystrybucji Linux używasz? Czy używasz raidu sprzętowego lub programowego? Wygląda jak oprogramowanie. Jeśli sprzęt, jakiej karty / mikroukładu używasz, jest to ustawione i zapisane w oprogramowaniu urządzenia.
Jason Huntley,
Ponadto ustawienia RA w dużym stopniu zależą od schematu alokacji systemu plików. Czy używasz ext4?
Jason Huntley
Wspominam, że w pytaniu chodzi o oprogramowanie RAID i LVM, więc tak - oprogramowanie. Jeśli chodzi o system plików, byłbym zainteresowany różnicą między XFS a ext4 tutaj, jednak odpowiedzi na oba byłyby dobre
Adam C
XFS można mocno dostroić, aby uzyskać lepszą wydajność. Jest to omówione w kilku miejscach na tej stronie: tu i tutaj ... Jakiej dystrybucji Linuksa używasz? To odgrywa ważną rolę, ponieważ dostępne są również narzędzia specyficzne dla dystrybucji.
ewwhite
To nie są pytania dotyczące wydajności, a bardziej szczegółowe - chcę tylko wiedzieć o ustawieniach RA i jak one tłumaczą / współdziałają z warstwami RAV LVM / Software
Adam C

Odpowiedzi:

11

W jaki sposób ustawienie RA jest przekazywane w dół łańcucha wirtualnych urządzeń blokowych?

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.

blockdev --report | grep sda
rw   **512**   512  4096          0   1500301910016   /dev/sda
rw   **512**   512  4096       2048      1072693248   /dev/sda1
rw   **512**   512  4096    2097152   1499227750400   /dev/sda2
blockdev --setra 256 /dev/sda1
blockdev --report | grep sda
rw   **256**   512  4096          0   1500301910016   /dev/sda
rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2

Ustawienie / dev / md0 RA nie wpłynie na urządzenia blokowe / dev / sdX.

rw   **256**   512  4096       2048      1072693248   /dev/sda1
rw   **256**   512  4096    2097152   1499227750400   /dev/sda2
rw   **512**   512  4096          0      1072627712   /dev/md0

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

Czy dm-0 przebija wszystko, ponieważ jest to urządzenie blokowe najwyższego poziomu, do którego faktycznie uzyskujesz dostęp?

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.

Czy lvchange -r miałby wpływ na urządzenie dm-0 i nie pojawiłby się tutaj?

Tak, ale to jest szczególny przypadek. Załóżmy, że mamy / dev / dm0, czyli LVM's / dev / vg0 / blockdevice. Jeśli zrobisz:

lvchange -r 512 /dev/vg0/blockdevice

/ 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.

Czego używasz, odpowiadającego powyższemu rozmiarowi sektora, aby określić rzeczywistą wartość początkową dla urządzenia wirtualnego:

Zazwyczaj odkrywam RA, eksperymentując z różnymi wartościami i testując go z hdparm.

Rozmiar paska RAID (dla md0)?

Tak samo jak powyżej.

Czy FS gra rolę (interesuje mnie przede wszystkim ext4 i XFS)?

Jasne - to bardzo duży temat. Polecam Rozpocznij tutaj http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php

wojciechz
źródło
Jest to bardzo zbliżone do tego, czego szukam i tego, co podejrzewałem - czy możesz mi wyjaśnić jedną rzecz: w sytuacji / dev / md0 (/ dev / sda1, / dev / sda2) wiem, że możesz ustawić oddzielne wartości RA, ale jeśli powiesz mount / data na / dev / md0 i przeczytasz z niego plik - czy 512 RA przyzwyczai się do odczytu z / dev / sda1 i / dev / sda2 (tj. 512 użyty dla obu) lub czy na każdym z nich jest 256? Jeśli to pierwsze, wydaje się rozsądne, aby RAID0 RA ustawiono na: SUM (RA urządzeń w RAID0)
Adam C
1
Mówiąc z mojego doświadczenia - ustawienie RA = 512 na / dev / md0 z / dev / sdX under under, działa dokładnie tak samo, jak mieliśmy dostęp do / dev / sdX z RA = 512, mimo że na przykład możemy mieć RA = 256 ustawienie na dolnym urządzeniu blokowym. Ustawienie 256 zostanie w tym przypadku zignorowane (zwróć uwagę, że / dev / sda jest bezużyteczne jako urządzenie blokowe, jeśli jest częścią / dev / md0). Nie jestem programistą jądra, ale wydaje się to logiczne i wydaje się to potwierdzone przez moją praktykę. Tak uspokajające. 3 wątki odczytywane z / dev / md0, RA = 512 równe 3 wątki odczytywane z / dev / sd {a, b, c} z RA = 512.
wojciechz
Wielkie dzięki! Zmodyfikowałem nieco rzeczy, aby wyjaśnić to w odpowiedzi. Czy mogę zadać jeszcze jedną rzecz, zanim ją zaakceptuję? Czy masz przykład (lub link do jednego) dotyczący używania hdparm do testowania RA? Zamierzałem zrobić coś podobnego, więc jeśli będzie dobre referencje, zaoszczędzi mi to czasu.
Adam C
Nie jest to skomplikowane, ale zależy od tego, co chcesz sprawdzić. Proszę odnieść się do instrukcji hdparm. Jeśli chcesz sprawdzić odczyt dysku (który jest pochodną readahead), możesz wydać polecenie takie jak hdparm -t / dev / md0 . Wynik pokaże coś w rodzaju odczytów z bufora czasowego: 310 MB w 3,02 sekundy = 102,79 MB / s . Na ostatnią wartość zazwyczaj ma duży wpływ ustawienie RA.
wojciechz
1
ah, więc nie bezpośredni pomiar - zrozumiany, akceptujący teraz - dziękuję za pomoc :)
Adam C
4

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 ¢.

Bill Clark
źródło
Mówisz więc, że niezależnie od ustawienia RA na urządzeniu najwyższego poziomu, po prostu zostanie ono przekazane. Dlatego jeśli użyłeś LVM -> 2 x RAID -> 4 x dysk fizyczny każdy i miałeś RA 4, to dlatego, że istnieje 8 fizycznych urządzeń, uzyskasz efektywną RA 32. Jak byś poprawił rozmiar porcji / pasków RAID jest wydajny w tym scenariuszu - Zakładam, że chcesz, aby RA obejmował cały pasek, więc nie musisz uzyskiwać dostępu dwa razy?
Adam C
BTW, jeśli mam rację, w scenariuszu, który opisuję, myślę, że chciałbym, aby fragment / pasek RAID0 był ustawiony na X, gdzie X = RA * 512 bajtów. Dlatego jeśli mam fragment / pasek 64k (domyślnie mdadm), to minimalne RA, którego powinienem użyć to 128, ponieważ to daje mi cały pasek w jednym ujęciu.
Adam C