Pędź dysku mój, pędź

Czy kogoś trzeba przekonywać, że posiadanie szybkiego i sprawnego dysku bardzo umila korzystanie z komputera i systemu operacyjnego ? Pewnie nie, bo o tym każdy wie. Czy to Windows, czy to Linux, w dobrym tonie leży prawidłowe ustawienia parametrów posiadanego napędu – a to włączone DMA, czytanie z wyprzedzeniem, cache dla zapisu, właściwy tryb UDMA itp. Czy jednak poza wyciskaniem siódmych potów z samej elektroniki można coś więcej zrobić dla sprawności dostępu do danych na dysku?

A co powiecie na wyciśnięcie odrobiny potu z samego systemu plików ? Mówię o popędzaniu starego dobrego ext3 i każdego innego systemu korzystającego z journaling’u.

Koncepcja jest następująca. Zmienimy nieco parametry montowania dysków/partycji, wykorzystując swoją całą wiedzę nt. parametrów polecenia mount. Podobnie, zmienimy parametry kronikowania księgowania dla wybranych partycji/dysków za pomocą polecenia tune2fs.

Co tracimy kosztem zwiększonej prędkości i wydajności zapisywania/odczytywania/dostępu do danych ?
– parametr noatime w /etc/fstab – nie będzie można wyszukiwać plików wg. daty/czasu dostępu do pliku (dostępu, nie zapisu/modyfikacji)
– parametr nodiratime w /etc/fstab – jak wyżej, tylko dla katalogów
kronikowanie księgowanie w trybie writeback – w przypadku awarii zachowana zostanie spójność systemu plików, lecz w plikach zapisywanych w momencie awarii na końcu mogą się pojawić losowe dane
– opcja dir_index dla systemu plików – same plusy

Na początek zajmijmy się plikiem /etc/fstab. Zróbmy jego kopię (użytkownicy Debiana pogradliwie prychając opuszczają polecenie sudo) – wszystko robimy rzecz jasna w konsoli :

sudo cp /etc/fstab /etc/fstab_bak

Teraz otwórzmy go do edycji swoim ulubiony edytorem czy to tekstowym czy graficznym :

sudo gedit /etc/fstab

Robimy poprawki – dla każdego dysku/partycji którą montujemy dodajemy parametry :

noatime,nodiratime,data=writeback

… czyli wpis dla np. /dev/hda5 nabiera takiej formy :

/dev/hda5 /home ext3 defaults,noatime,nodiratime,data=writeback 0 2

… lub :
# /dev/hda5 :
UUID=4abffdd1-b652-4091-b6a8-81c97f8f8f76 / home ext3 defaults,noatime,nodiratime,data=writeback 0 2

Robimy poprawki tylko dla dysków twardych (żadne tam cdrom’y i urządzenia wymienialne), oraz zastanawiamy się, czy na pewno chcemy takie parametry ustawić dla partycji / (root).

Jeżeli ustaliliśmy parametr data=writeback dla partycji /, musimy wykonać poprawkę w /boot/grub/menu.lst.

sudo gedit /boot/grub/menu.lst

W linii z opcjami dla kernela, dopisujemy rootflags=data=writeback :

kernel /boot/vmlinuz-2.6.22-1-686 root=/dev/hda1 rootflags=data=writeback ro

(nie przeklejać tej linijki, tylko wstawić parametr w swoim menu.lst w podobny sposób jak powyżej!)

Ważne ! Teraz uaktualnimy kronikę każdej partycji dla której wybraliśmy tryb writeback :

sudo tune2fs -o journal_data_writeback /dev/hda5

Powtarzamy polecenie, zmieniając tylko /dev/hda5 na numery partycji z /etc/fstab.

Dla wszystkich partycji z kroniką można jeszcze włączyć (jeżeli nie jest włączona) opcję dir_index – usprawni to wyświetlanie/przeszukiwanie katalogów z dużą liczbą plików (nie dotyczy to oczywiście generowania miniaturek w tych katalogach) :

sudo tune2fs -O dir_index /dev/hda5

I kolejne udogodnienie, jeżeli kogoś denerwuje częstotliwość sprawdzania dysku podczas startu systemu – ustawimy, aby sprawdzany był nie co 30-ści montowań, lecz co 100 :

sudo tune2fs -c 100

UWAGA – przy wpisywaniu poleceń w konsoli, proszę zwracać uwagę, czy wykonanie danego polecenia nie pokaże jakiegoś błędu – nie wklejać na ślepo wszystkich komend! W przypadku błędu trzeba ustalić o co komputerowi chodzi i poprawić się.

Po wprowadzonych zmianach resetujemy system – konieczne, ze względu na zmianę trybu kronikowania księgowania.

Czy wprowadzone zmiany są rewolucyjne ? Bardziej odczują to osoby z wolniejszymi dyskami. O ile w ogóle – generalnie ciężko przełożyć wzrost wydajności na konkretne cyferki – ma po prostu być nieco sprawniej i szybciej. Testy hdparm’em tego nie pokażą, zainteresowani mogą próbować wykonywać benchmarki za pomocą bonie++.