Rajmund Radziewicz
W Linuksie możemy bardzo precyzyjnie odczytywać i ustawiać parametry twardego dysku czy pozostałych napędów IDE naszego komputera. Daje to ogromną kontrolę nad wieloma operacjami systemowymi i często pozwala zwiększyć wydajność takich operacji, w szczególności związanych z zapisem bądź odczytem danych. Do kontrolowania tego typu ustawień służy program hdparm.Pozwala m.in na:
- testowanie, diagnozowanie i ustawianie szybkości odczytu/zapisu urządzeń
- włączanie/wyłączanie DMA
- sterowanie zachowaniem buforów podręcznych (cache)
- ustawianie urządzeń w trybach: tylko-do-odczytu/tylko-do-zapisu
- Włączanie/wyłączanie automatycznej funkcji oszczędzania energii w niektórych napędach
- Wyłączanie/włączanie wbudowanej w napęd opcji zarządzania uszkodzeniami. Przy tej opcji firmware urządzenia próbuje automatycznie zarządzać uszkodzonymi sektorami, przenosząc je w zapasowe miejsce
Oczywiście dobór wszelkich ustawień pownien być dobrze przemyślany. Nieostrożne posługiwanie się hdparmem i stosowanie “zbyt wygórowanych opcji” na “niezbyt wygórowanym sprzęcie”, może doprowadzić nawet do utraty danych. Warto więc przed “eksperymentami” zrobić kopię zapasową i dowiedzieć się (np. z dokumentacji) na co możemy sobie pozwolić, zwiększając wydajność dysków.
Domyśle ustawienia jądra przy dostępie do kontrolerów i dysków IDE w Linuksie są dosyć “ostrożne” i najczęściej do normalnej pracy w zupełności wystarczają. W momencie kiedy potrzebujemy jednak zwiekszyć wydajność, przykładowo dlatego, że stosujemy aplikacje przetwarzające duże ilości danych — wówczas hdparm może okazać się przydatny. Przed ustawieniami hdparma, warto dowiedzieć się więcej o możliwościach naszego dysku. Polecenie:
/sbin/hdparm -I /dev/hda
… poda nam dokładne informacje o napędzie, obsługiwaną pamieć, szybkość, liczbę cylindrów, konfigurację itp. Warto sprawdzić również w dokumentacji — czy poza samym dyskiem nasza płyta główna również obsługuje DMA, czy kontroler naszego dysku jest 32-bitowy ..itd.
Aby sprawdzić domyślne ustawienia z jakimi aktualnie pracuje nasz dysk, wystarczy polecenie:
/sbin/hdparm /dev/hda
W rezultacie możemy otrzymać coś w stylu:
/dev/hda:
multcount = 16 (on)
IO_support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 2432/255/63, sectors = 39070080, start = 0
Z tych ważniejszych parametrów, istotne są:
IO_support — sposób przekazywania danych do kontrolera. W naszym przypadku jest to tryb 16-bitowy. Bardzo “ostrożny”, ale większość dzisiejszych układów obsługuje już 32 bity.
using_dma — ta flaga określa nam, czy dysk używa tzw: bezpośredniego dostępu do pamięci (DMA).
unmaskirq — ustawienie to pozwala sterownikowi na “niemaskowanie” innych przerwań podczas przetwarzania przerwania dyskowego, co może znacznie poprawić czas reakcji systemu. Należy pamiętać, że nie wszystki urządzenia potrafią obsłużyć taką opcję!
Sprawdźmy aktualną wydajność naszego dysku:
/sbin/hdparm -Tt /dev/hda
Program hdparm z flagą -T pokazuje nam test szybkości odczytu pamięci podręcznej, -t test szybkości odczytu danych, nie znajdujących się w pamięci podręcznej. Wynik powyższego polecenia może wyglądać następująco:
/dev/hda:
Timing buffer-cache reads: 492 MB in 2.01 seconds = 244.78 MB/sec
Timing buffered disk reads: 42 MB in 3.07 seconds = 13.68 MB/sec
Można zwiększyć te parametry, jeżeli pozwala na to nasze urządzenie. Tak więc po kolei:
-d1 włącza obsługę DMA
-c1 32-bitową obsługę we/wy
-u1 ustawienie opisanego wyżej “niemaskowania” przerwań
-m16 (w niektórych dyskach również -m32) ustawia tzw: wielosektorowe we/wy. Często powoduje znaczn zwiększenie przepływu danych
Należy pamiętać, że powyższe opcje często mogą nie przynieść oczekiwanego rezultatu, jeśli przykładowo do kontrolera podpięte są jakieś urzadzenia nie obsługujące UDMA. Podsumowując, jeśli chcemy włączyć 32-bitowy dostęp do dysku, obsługę DMA i wielosektorowe we/wy, wpisjemy:
/sbin/hdparm -m16 -c1 -d1 -u1 /dev/hda
Jeśli chcemy, żeby ustawienia te były aktywne po restarcie komputera, należy dopisać powyższą komendę do skryptu startowego.
W Debianie lub dystrybucjach na nim bazujących, można polecenie hdparm z odpowiednimi opcjami dopisać do /etc/init.d/rcS. Plik ten jest wykonywany jeszcze przed sprawdzaniem systemu plików. W RedHacie i pochodnych od niego (Fedora, Whitebox, Aurox) możemy dopisać wywołanie hdparma do /etc/rc.d/rc.local, przykładowo:
if [ /usr/sbin/hdparm ]; then
echo ‘ustawiam opcje hdparm dla /dev/hda’
hdparm -qm16 -qc3 -qd1 -qu1 /dev/hda
fi
Dodatkowe ‘-q’ powoduje, że opcje wykonywane są “cicho” (bez wyświetlania komunikatów przez system).