Hdparm: ustawienie parametrów dysku IDE
Napisał: Patryk Krawaczyński
23/05/2004 w Administracja 1 komentarz. (artykuł nr 5, ilość słów: 1241)
P
odczas standardowej instalacji Linuksa, większość dystrybucji korzysta z domyślnych parametrów (tryb 16 bitów, wyłączone DMA) jądra podczas dostępu do kontrolera i dysków IDE. Te ustawienia są bardzo znikome, lecz ich celem jest ochrona danych zapisanych na dysku twardym. W tym przypadku bezpieczeństwo zostało zapewnione kosztem wydajności dysku. Nie znaczy to, że zmieniając te ustawienia zwiększamy ryzyko awarii dysku, lecz wskazane jest, aby przed dokonaniem jakichkolwiek czynności dobrze zapoznać się z możliwościami naszego dysku by nie przedobrzyć w jego ustawieniach. W celu uzyskania większej wydajności naszego dysku wykorzystamy program hdparm (8).
Jest on standardowo zawarty w dystrybucji Slackware, wystarczy nie przeoczyć tej pozycji podczas instalacji (zawsze możemy doinstalować go z naszej płyty instalacyjnej). Program ten nie tylko poda aktualną wydajność dysku, czy dysków, ale także pozwoli dowolnie je wyregulować. By wykonać dalsze czynności zalecane jest przejście w tryb jednego użytkownika (single – komenda: init 1). Na samym początku wyświetlimy aktualną wydajność naszego dysku i ją zapamiętujemy:
hdparm -tT /dev/hda
Parametr -T wykonuje test systemu pamięci podręcznej (tzn. pamięci procesora i bufora podręcznego). Parametr -t powoduje wyświetlanie statystyki danego dysku oraz odczyt danych nie znajdujących się w buforze podręcznym. Jeśli połączyć te dwa parametry razem powinniśmy otrzymać przybliżone dane na temat wydajności naszego systemu wejścia – wyjścia (I/O) dysku twardego. Kolejnym krokiem jest wyświetlenie informacji na temat aktualnego adresowania dysku przez Linuksa:
hdparm /dev/hda
Wynikiem tej komendy powinny być komunikaty wyświetlone poniżej:
/dev/hda: multcount = 0 (off) IO_support = 0 (delfault 16-bit) unmaskirq = 0 (off) using_dma = 0 (off) keepsettings = 0 (off) readonly = 0 (off) readahead = 8 (on) geometry = 4865/255/63, sectors = 78165360, start = 0
Są to domyślne ustawienia, które mają zapewnić bezpieczne, lecz wielu przypadkach nieoptymalne osiągi dysku. Na samym początku w oczy rzuca się fakt obecności 16 bitowego trybu za czasów procesorów 386. Reszta opcji to:
1) Multcount – od multiple sector count – jest to liczba wielu sektorów, a innymi słowy wartość ta określa, ile sektorów pobierana jest z dysku twardego w czasie jednego przerwania Input / Output (We-jścia / Wy-jścia). Wartość tą obsługują prawie wszystkie nowoczesne dyski IDE. Po włączeniu tej funkcji obciążenie dyskowego I/O przez system operacyjny zmniejsza się o od 30 do 50%. W wielu komputerach powoduje też zwiększenie się przepustowości danych – od 5 do 50%.
2) I/O support – jest to bardzo ważna rzecz, a raczej flaga, która określa sposób przekazywania danych z magistrali PCI do kontrolera. Prawie wszystkie nowoczesne mikroukłady kontrolerów obsługują tryb na poziomie 3, czyli 32-bitowy tryb synchroniczny. Niektóre układy nawet obsługują asynchroniczny tryb 32-bitowy. Włączenie tego ustawienia pozwoli na znaczne zwiększenie przepustowości naszego dysku.
3) Unmaskirq – włączenie tego ustawienia pozwoli Linuksowi wyłączyć maskowanie innych przerwań podczas przetwarzania przerwania dyskowego. Dzięki włączeniu tej opcji nasz system będzie w stanie obsługiwać inne zadania związane z przerwaniami (np. ruch sieciowy na stronach www), oczekując na zwrócenie danych żądanych z dysku. To znacznie powinno poprawić łączny czas reakcji systemu, ale warto wspomnieć, że nie wszystkie konfiguracje sprzętowe sobie z tą opcją poradzą.
4) Using_dma – tryb DMA jest ustawieniem, dzięki któremu transfer danych z dysku następuje bezpośrednio do pamięci operacyjnej. Cały proces wymaga znacznie mniejszego zaangażowania ze strony procesora, co dodatkowo zwiększa wydajność systemu (odpowiednie tryby przekładają się na prędkości np. UDMA-2 = 33, UDMA-4 = 66, UDMA-5 = 100, UDMA-6 = 133).
5) Readahead – określa, ile następnych sektorów będzie odczytywanych, gdy następuje odczyt danych z dysku. Wartość ta wynosi zazwyczaj tyle samo, co wcześniej ustawiona wartość multcount.
Po krótkim opisaniu dostępnych trybów zobaczmy co naprawdę nasz dysk nam oferuje:
hdparm -i /dev/hda
Wynikiem tej komendy powinno być wyświetlenie wszelkich informacji na temat naszego dysku twardego oraz technologii jakie jest on nam w stanie zaoferować:
/dev/hda: Model=WDC WD400JB-00ENA0, FwRev=05.03E05, SerialNo=WD-WCAD1A186601 Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq } RawCHS=16383/16/63, TrkSize=57600, SectSize=600, ECCbytes=40 BuffType=DualPortCache, BuffSize=8192kB, MaxMultSect=16, MultSect=16 CurCHS=4047/16/255, CurSects=16511760, LBA=yes, LBAsects=78165360 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 AdvancedPM=no WriteCache=enabled Drive conforms to: device does not report version: 1 2 3 4 5
Tak więc teraz dopiero jesteśmy w stanie coś więcej powiedzieć o naszym dysku oraz dostosować konfigurację do jego rzeczywistych osiągnięć. Na samym początku włączamy tryb 32-bitowy – do tego posłuży nam opcja -c1, gdzie 1 jest odpowiednim poziomem trybu (c0 – jest trybem 16-bitowym, a c3 32-bitowym z synchronizacją. Następnie włączymy DMA parametrem -d1. Ostatnie cztery opcje to multcount (MaxMultSect=16 w info wyżej) -m16, oraz UDMA odpowiedni tryb Ultra DMA, czyli w naszym przypadku to udma5 -X udma5, no i nie możemy zapomnieć o maskowaniu przerwań -u1 oraz ilości sektorów czytanych z wyprzedzeniem -a16. Po złożeniu otrzymujemy:
hdparm -X udma5 -d1 -u1 -m16 -a16 -c1 -k1 /dev/hda
Ale parametr -k1 nie był omawiany? Jest to parametr pamiętający ustawienia. To dlatego, że hdparm zapomina ustawienia po ponownym rozruchu. Teraz możemy ponownie wyświetlić i sprawdzić aktualne adresowanie dysku przez nasz system (hdparm /dev/hda):
/dev/hda: multcount = 16 (on) IO_support = 3 (32-bit w/sync) unmaskirq = 1 (on) using_dma = 1 (on) keepsettings = 1 (on) readonly = 0 (off) readahead = 16 (on) geometry = 4865/255/63, sectors = 78165360, start = 0
Jeśli praca dysku jest stabilna to powinniśmy zapamiętać te ustawienia oraz utworzyć przetestowany wiersz do skryptów startowych /etc/rc.d/ np. rc.local. By nie wyświetlały nam się komunikaty o ustawieniach naszego dysku w trakcie uruchamiania systemu i tym samym powodując przeskok informacji na temat usług sieciowych wystarczy, że zamieścimy przykładowy wpis do skryptu lokalnego:
hdparm -X udma5 -d1 -u1 -m16 -a16 -c1 -k1 /dev/hda > /dev/null
Podobnie postępujemy z innymi dyskami w naszym serwerze, jeśli takowe posiadamy? Jeśli nabyliśmy je w mnogiej ilości i są to te same modele o tych samych parametrach technicznych możemy sklonować ustawienia pierwszego dysku dla drugiego nadając po prostu urządzeniu, na którym ma być przeprowadzona konfiguracja inną, odpowiednio przypisaną literę np. hdb, hdc – w zależności od ilości posiadanych dysków (gdzie /dev/hda jest to urządzenie pracujące z priorytetem primary master; hdb – primary slave; hdc – secondary master oraz hdd – secondary slave). Jeśli posiadamy różne dyski to dla każdego z nich przeprowadzamy osobną konfigurację choć w wielu przypadkach jest ona taka sama lub bardzo zbliżona. Oczywiście na koniec wykonujemy jeszcze raz test szybkości dysku (hdparm -tT /dev/hda) i porównujemy otrzymane wyniki z poprzednimi…
Bonus:Aktualnie niemal wszystkie sprzedawane dyski twarde są wyposażone w funkcję automatycznego zarządzania poziomem hałasu – AAM (Automatic Acoustic Management), dzięki której użytkownik może ustawić, czy chce mieć napęd cichy czy raczej oferujący maksimum wydajności. Takich możliwości nie oferują jedynie dyski Seagate’a. Działanie AAM polega na konfiguracji sposobu pracy głowicy. Jeśli zostanie ustawiony tryb wysokiej wydajności (Performence)), głowica pracuje z maksymalną szybkością, a dysk oferuje krótki czas dostępu do danych, zwykle 12 – 13 ms. W trybie cichym (Quiet) głowica pracuje ciszej, ale wolniej – średni czas dostępu do danych sięga 20 ms. W Linuksie sposób konfiguracji AAM umożliwia nam wcześniej omówione narzędzie hdparm. Polecenie hdparm -M /dev/hda sprawdza ustawienie AAM wskazanego dysku twardego. Polecenie hdparm -M 128 /dev/hda ustawia “cichy” tryb pracy pierwszego dysku twardego, natomiast hdparm -M 254 /dev/hda – ustawia tryb największej wydajności. Możliwe jest też wykorzystanie pośrednich wartości z przedziału 128 – 254.
Więcej informacji: hdparm –help, man hdparm, pliki dokumentacji /usr/doc/hdparm/
W przypadku laptopów bardzo przydatnymi opcjami dla programu hdparm są:
Pierwsze polecenie powoduje przejście dysku w tryb wstrzymania (ang. stanby mode) pobierający mniej mocy w przypadku pracy na baterii. Drugie przełącza dysk w tryb uśpienia (ang. sleep mode) natychmiastowo wstrzymując jego pracę. Ostatnia określa po jakim czasie dysk ma przełączyć się w tryb wstrzymania, gdzie podaną wartość należy pomnożyć razy 5 by uzyskać czas w sekundach (12 * 5 = 60 sekund = 1 minuta).