Jak przyspieszyć system plików dla Freesco

I doprowadzić "używalności" serwer SAMBA

GŁÓWNA STREFA ZRZUTU SZNURECZKI ARCHIWUM

ZMIANY !!!

Wszystkie moje kompilacje jądra zostały załatane pod kątem ICMP leak !

W stosunku do poprzedniej kompilacji dodałem (poprawiłem) obsługę zegarów czasu rzeczywistego płyt głównych. Dokompilowana została obsługa BRIGDE, strony kodowe CODEPAGE_437, CODEPAGE_852, ISO8859_1, ISO8859_2. Szczegóły kompilacji w załączonym w archiwum pliku .config. W dziale "strefa zrzutu" jest kilka różnych opcji kompilacji jądra

WARTO ?

Jak najbardziej, przede wszystkim że na słabszych maszynach, gdzie praca z serwerem plików SAMBA praktycznie odcinała nas od świata, czyniąc ogromne obciążenie dla całego systemu. Lekarstwem na owe dolegliwości jest użycie wynalazku zwanego BUS MASTER  DMA, czyli w wolnym tłumaczeniu "bezpośredni dostęp do pamięci z przejęciem kontroli nad szyną". Przy DMA operacje dyskowe praktycznie nie zajmują czasu procesora. No ale twórcy Freesco, wychodząc z założenia że będzie to router dyskietkowy, nie wkompilowali w kernel, czyli jądro, obsługi chipsetów płyt głównych które takie możliwości oferują. A bez sterowników, mostek południowy, odpowiedzialny za kontrolę nad dyskami ,nie zechce używać BUS MASTERING DMA, pracując w konfiguracji z czasów i386. Czyli trzeba by skompilować nowy kernel z odpowiednimi opcjami. Ale zanim przejdziemy dalej , trochę teorii:

TEORIA JĄDROWA

Jądro, kernel, wszyscy tego wokół używają, co to w ogóle jest ? Hmm, jeżeli używasz komputera, najprawdopodobniej używasz też kernela :-). Nawet wszechobecny Windows ma takie cudo. Kernel to jądro systemu operacyjnego, czyli coś jakby rdzeń. Jest ono odpowiedzialne za komunikację pomiędzy twoim sprzętem (to ta skrzynka w rogu...), a oprogramowaniem sterującym owym sprzętem. Przydziela pamięć procesom (programom), przydziela czas procesora, i jest generalnym pośrednikiem pomiędzy procesami. Czyli taki zarządca, który stoi ponad wszelkim software'm i kieruje hardware'm. Jest też na tyle zunifikowane aby łatwo można pisać było programy, sterowniki i takie tam :-). Jądro  systemach Linux jest na tyle konfigurowalne, że każdy może sobie skompilować je ze źródeł (kodu wysokiego poziomu języka programowania, np. C) wg. własnych potrzeb. Każdy ? Niestety użytkownicy Freesco nie skompilują sobie jądra, ani też żadnego programu. Dlaczego ? Gdyż Freesco jest prostym routerem dyskietkowym i nie zostało (na razie) wyposażone w kompilator. Jeżeli ktoś bardzo chciałby zrobić to we własnym zakresie, musi to uczynić instalując dystrybucję Zipslack w wersji 3.9. To właśnie z niej pochodzi Freesco. Przy kompilacji programów należy jeszcze pamiętać o podmianie kernel'a na wersję 2.0.38 lub 2.0.39, jako że oryginalnie jest 2.0.37.  Samego Zipslacka można zassać tutaj, a źródła jądra 2.0.38 dla Zipslacka tutaj. Ewentualnie już skompilowany (Zipslack 2.0.38) kernel tutaj. Opis kompilacji jądra, w języku polskim na stronach projektu www.jtz.org.pl/Html/Kernel-HOWTO.pl.html.

START !

Uczyniłem to. Skompilowałem nowy kernel dla Freesco, w wersji 2.0.39,  z obsługą chipsetów (mostek południowy): intel82371xx TRINTON (popularne nazwy northbridge 430FX 430HX, 430VX, 440FX 430TX, 440LX, 440BX, 440EX, i 440ZX).. Jako SOUTHBRIDGE zwany "PCI ISA/IDE Accelerator" - w skrócie PIIX, jest pomostem pomiędzy magistralą PCI oraz ISA. Ponadto posiada dwa szybkie kanały EIDE, zdolne obsłużyć cztery urządzenia (dyski twarde, CD-ROM, itd.), kontroler DMA oraz kontrolery przerwań. Rodzinę TRINTON (i koneksje z mostkami północnymi) prezentuje poniższa tabela:

Mostek południowy 82371 FB (PIIX) 82371 SB (PIIX3) 82371 AB (PIIX4)
Mostek północny 430FX 430HX, 430VX, 440FX 430TX, 440LX, 440BX, 440EX, 440ZX
Obsługiwany interfejs EIDE protokół PIO4 protokół PIO4 protokół ULTRADMA 2 czyli ATA33

Z doświadczeń Szymona 'Komara' K. (dzięki za odważne testy) wynika też że można zapodać ów kernel do płyt głównych z mostkiem południowym
VIA VT82C586B i włączyć BM-DMA, które jednak pracuje w trybie "split FIFO", co w praktyce przy posiadaniu jednego dysku twardego nie ma znaczenia. 

Jeśli chodzi o filozofię działania i odpowiedzi na pytanie "po co mi DMA jak mam tylko 430FX", zainteresowanych kieruję do dokumentu JTZ www.jtz.org.pl/Html/mini/Ultra-DMA.pl.html gdzie jest to wszystko cierpliwie i dokładnie opisane. Zatem jeżeli połapałeś w tym zagmatwaniu,  że masz chipset który będzie wykorzystywał zalety tego jądra to możesz NA WŁASNĄ ODPOWIEDZIALNOŚĆ spróbować podmienić kernel na ten przeze mnie kompilowany. Ponadto jądro to jest Samo jądro różni się od zwykłego wersją (orginalnie jest 2.0.38), jest spaczowane pod kątem port forwardingu (nie testowałem), zmieniony i rozszerzony jest zakres portów maskarady, 16384 portów powyżej portu 48000 (org. 4096 portów powyżej 60000 ?) i rozszerzona jest tablica maskarady (z 256 do 8192), ma to pomóc w graniu np. w Counter Strike w internecie (nie testowałem osobiście). Źródła do kompilacji brałem z tego miejsca.

KONKRETY !

Krok pierwszy to zrobienie kopii bezpieczeństwa kernela, który jest obecnie w użyciu, aby w razie niepowodzenia przywrócić dawną funkcjonalność systemu. Następnie KONIECZNIE trzeba się upewnić że są w Twoim systemie w pliku router.bat nie ma wpisów no387 i nohlt, gdyż jądro skompilowałem pod procesor PENTIUM bez emulacji koprocesora. Często popełnianym błędem jest edycja z poziomu linux'a pliku router.bat znajdującego się w katalogu /mnt/router. Jeżeli usuniemy owe wpisy (no387 i nohlt) z tegoż pliku, nic nam to nie da. Najlepiej tych zmian dokonywać z poziomu DOS, gdyż wtedy, mamy pewność że DOS poprawnie przeczyta router.bat. Jednakowoż jeżeli ktoś koniecznie chce edytować plik router.bat z poziomu linux'a, musi odczytać DOS'ową zawartość dysku za pomocą polecenia:
umssync /mnt
Teraz powinny się pojawić wszystkie pliki DOS katalogu głównego dysku, w katalogu /mnt. I tam ewentualnie usuwamy wpisy no387 i nohlt. Należy uważać jako że edycja plików DOS z poziomu linux'a i plików linux'a z poziomu DOS/Windows, niesie za sobą zagrożenie utraty funkcjonalności plików wykonywalnych. Powodem tego jest inne kodowanie znaku końca linii. Wypadało by się jeszcze upewnić że masz chipset obsługiwany przez moją kompilację jądra, i możesz już ściągać (jeżeli jeszcze tego nie uczyniłeś) plik kernel'a, który (odpowiedni) znajdziesz w strefie zrzutu. Po ściągnięciu należy podmienić kernel (jądro), podłożyć moją kompilację. I teraz już tylko głębokie westchnięcie i... reboot. Jeżeli serwer stoi obok, lub pod stołem, czy w łatwo dostępnym miejscu to nie ma problemu. Jeżeli jednak serwer/router jest głęboko schowany w piwnicy, na strychu lub u sąsiada to możemy mieć problem. Gdyż W PRZYPADKU BŁĘDNEJ KONFIGURACJI, chodzi głównie o wpisy no387 i "nietypowe chipsety" SERWER PO REBOOCIE MOŻE NIE WSTAĆ NA NOWYM KERNELU !!!. Oczywiście osoby które wiedzą co robią, nie mają się raczej czego obawiać, jednak tacy admini są ostatnio w mniejszości :).

Freesco WSTAŁO Z NOWYM JĄDREM !

To świetnie ! Teraz zajrzymy do log'ów i jeżeli zobaczymy np.

kernel: ide: Intel 82371 (unknown) 0x1230 DMA Bus Mastering IDE
kernel: Controller on PCI bus 0 function 57
kernel: ide0: BM-DMA at 0x3000-0x3007
kernel: hda: ST34313A, 4126MB w/256kB Cache, CHS=526/255/63, (U)DMA

Oznacza to że nasze jądro rozpoznało mostek południowy naszej płyty głównej. A o to przecież chodzi. Wpisy "DMA Bus Mastering IDE" i (U)DMA pozwalają śmiało przypuszczać że będziemy w stanie wyciągnąć z dysku tyle na ile nam hardware pozwoli. Do tego będzie potrzebne jeszcze jedno narzędzie, programik hdparm przygotowany przeze mnie w paczce, w wersji 3.9. Pakiet do zainstalowania jest
installpkg http://www.freesco.internetdsl.pl/plik/hdparm
PRZESTRZEGAM ! że niewprawne użycie hdparm może się zakończyć utratą danych na dysku !. ZAPOZNAJ ! się z uwagami poczynionymi w końcowej części manual'a (adres poniżej) hdparm !. Bez straszenia, teraz mając możliwości spróbujemy trochę stiuningować nasze kochane Freesco. Zaczniemy od odczytania bieżącej konfiguracji:
hdparm /dev/hda
Powinno nad to dać rezultat w postaci:

/dev/hda:
multcount = 0 (off)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 526/255/63, sectors = 8452080, start = 0

Jest to konfiguracja bez włączania jakichkolwiek opcji. Co ciekawe przy niektórych kombinacjach dysk/chipset, już po zmianie kernel'a są włączane domyślnie niektóre opcje. Ma to związek z flagami keep_settings_over_reset i keep_features_over_reset, których jednak nie będę tu wyłuszczał. Tak więc odczyt konfiguracji nie musi dokładnie tak wyglądać, ale możemy założyć że tak jest. Nie będę się rozpisywał co poszczególne wpisy dokładnie znaczą, znajdziecie to na stronach Projektu Tłumaczenia Manuali, a konkretnie dla hdparm http://ptm.linux.pl/man_HTML/man8/hdparm.8.html. Natomiast nas interesuje wpis :
hdparm -c3 /dev/hda
Co spowoduje uaktywnienie trybu
I/O support = 3 (32-bit w/sync)
Czyli cytuję "32-bitowej transmisji danych ze specjalną sekwencją sync wymaganą przez wiele chipsetów. Wartość 3 działa z prawie wszystkimi 32-bitowymi chipsetami IDE". Nasz Intel 82371xx oczywiście doskonale obsługuje I/O32bit. To ma generalnie (nie biorąc pod uwagę UATA) największy wpływ na ciągły transfer z dysku. Kolejne rzeczy:
hdparm -m16 /dev/hda
Parametr ten ustawia odczyt 16 sektorów w czasie jednego przerwania (cyklu odczytu). Wpływa to pozytywnie na transfer dużych plików, przy korzystaniu z częstego odczytu wielu małych plików można poeksperymentować z wartościami 2,4,8. W niektórych dyskach można też jeszcze zapodać wartość 32. Jednak cytuję "niektóre napędy (najbardziej zauważalnie seria WD Caviar), wydają się działać wolniej w tym trybie", i dalej "Niektóre napędy twierdzą, że wspierają ten tryb, lecz tracą dane przy niektórych ustawieniach. W rzadkich wypadkach, takie błędy mogą spowodować poważne uszkodzenie systemu plików.". Więc trzeba to dokładnie sprawdzić na swoim systemie. Chcąc się dowiedzieć dokładnie jaką wartość najlepiej podać wpisujemy:
hdparm -I /dev/hda
I w bałaganie na ekranie szukamy wpisów MaxMultSect=16 MultSect=16 . Pierwszy to maksymalna wartość możliwa do ustawienia przez parametr -m a druga to bieżąca wartość tegoż parametru. Oczywiście wartości mogą być inne :). Pod inną nazwą funkcja ta to HDD Block Mode. Następna rzecz:
hdparm -u1 /dev/hda
Przy opisie tej opcji posłuże się w całości cytatem z maual'a hdparm który wyczerpująco opisuję tą opcję, cytat "Ustaw­ ienie 1 zezwala sterownikowi na niemaskowanie innych przerwań podczas przetwarzania przerwania dyskowego, co poprawia w dużej mierze odpowiady­ walność Linuksa i eliminuje błędy serial port overrun. Używaj tej właściwości z ostrożnością: niektóre kombinacje napędu/kontrolera nie radzą sobie dobrze z tą włąściwością, co może spowodować poważne uszkodzenie systemu plików. Praktycznie, interfejsy CMD-640B i RZ1000 (E)IDE mogą być niestabilne (z powodu usterek sprzętowych) gdy opcja ta jest używana z wersjami jądra wcześniejszymi niż 2.0.13" koniec cytatu. A teraz przechodzimy do najważniejszej, w świetle tematu, opcji:
hdparm -d1 /dev/hda
Która powoduje włączenie trybu BUS MASTER DMA, bezpośredniego dostępu do pamięci (Direct Memory Access). Tryb ten oferujący osiem osobnych kanałów danych pomiędzy różnymi urządzeniami, a pamięcią fizyczną, w naszym przypadku kontrolerem (E)IDE, , nie angażuje w swoje sprawy procesora i w ten sposób operacje dyskowe nie obciążają systemu. A BUS MASTERING to nadrzędne sterowanie szyną danych (to z definicji). Także włączenie tej opcji może przynieść same korzyści :) Nie należy jednak wrzucać do jednego worka pojęć DMA i UltraDMA. To drugie pojęcie stosowane jest do określenia trybu wymiany danych pomiędzy HDD a kontrolerem IDE, a nie odnosi się do całego systemu tak jak pojęcie DMA. Określenie UDMA stosujemy zamiennie z określeniami ATA33,  UDMA33, UATA66 np. Jeżeli zapoznaliście się z dokumentem UltraDMA HOWTO, to wiadomo o co chodzi. Oczywiście jeżeli nasz chipset i dysk obsługują standart UDMA (UltraATA) to dlaczego nie mielibyśmy tego wykorzystać. W tym celu najsampierw wpiszmy już dobrze znaną komendę :
hdparm -I /dev/hda
Która przedstawi nam na ekranie dobrze znany chaos literek i cyferek. Potrzebujemy informacji z dwóch ostatnich linijek:
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 *mdma2 udma0 udma1 udma2 udma3 udma4

W tym konkretnym przypadku tryb pracy dysku to multiwordma2 (gwiazdka przy mdma2), i jest najszybszy tryb jaki jestem w stanie osiągnąć na moim chipsecie i82371FB. Dla nie wiedzących co mogą osiągnąć proponuję zajrzeć do tabelki powyżej :). W moim przypadku BIOS płyty sam ustawił najwyższy możliwy tryb pracy interfejsu, jednak nie zawsze się tak dzieje. Do ustawiania tych opcji służy parametr -X. Co on czyni:

OPCJE PARAMETRU -X
PIO mode Parametr -X Max transfer
0 -X08 3,3MB/s
1 -X09 5,2MB/s
2 -X10 8,3MB/s
3 -X11 11,1MB/s
4 -X12 16,7MB/s
MultiWordDMA Parametr -X Max transfer
0 -X32 4,2MB/s
1 -X33 13,3MB/s
2 -X34 16,6MB/s
UltraDMA Parametr -X Max transfer
2 (ATA33) -X66 33MB/s
4 (ATA66) -X68 66MB/s
5(ATA100) -X69 100MB/sec

Jeżeli więc wydedukowałeś że para chipset/dysk nie pracuje maksymalnie wydajnie w stosunku do możliwości, możesz spróbować ustawić szybszy tryb pracy:
hdparm -X66 /dev/hda
Powyższy przykład włącza tryb UDMA2 (ATA33) dla komunikacji dysk-chipset. Należy pamiętać o tym że jeśli ustawimy szybszy tryb UDMA, a nasz chipset i kontroler tego nie obsługują, HDD zostanie zresetowny do parametrów domyślnych (czytaj do czasów i386). To jest optymistyczna wersja, kiedyś próbując wymusić tryb PIO na i440BX zawiesiłem cały system. I choć po resecie miałem wszystko ustawione domyślnie to jednak warto wiedzieć co się robi i na czym się stoi. Także  NALEŻY UŻYWAĆ OPCJI -X Z WIELKĄ ROZWAGĄ !!! Niestety pomimo tego wszystkiego jądra z serii 2.0.xx nie najlepiej obsługują UDMA i do teoretycznych maksymalnych wartości transferu się nie zbliżymy :(

TESTOWANIE

Do testowania prędkości odczytu z dysku służy komenda:
hdparm -t /dev/hda
Testy aby były wiarygodne, powinny być wykonywane na czystym systemie (bez żadnych usług). Jak wiemy Freesco najczęściej służy jako serwer/router, zatem ciężko jest "wyłączyć" wszystkie rzeczy uruchomione. Tak więc specjalnie nie trzeba się sugerować otzrymanymi jednorazowo wynikami. Trzeba testować, testować i testować. A potem wyciągnąć średnią z wyników :) Oczywiście należy też sprawdzić jak się zachowuje internet podczas ściągania dużych plików z serwera samby. U mnie przed zabiegami tjuningu, przy ściąganiu czegokolwiek z serwera, internet stawał :(. Teraz w takiej sytuacji widać trochę wolniejszy czas reakcji routera, ale witryny można bez problemu przeglądać. Zajętość procesora spadła z 80% do 15-20% przy intensywnym korzystaniu z zasobów dyskowych Z moich testów wynika także że partycja ext2 na moim dysku jest o jakieś 20% szybsza od partycji FAT. Ale to są tylko moje obserwacje.

STAŁY ZWIĄZEK

Po resecie jednak część tak mozolnie ustawianych parametrów może zniknąć. Dokładnie opcje -m16 i -c3 trzeba z każdym startem ustawiać od nowa. Ponadto zasada jest taka, im wcześniej "pokręcimy" parametry dyskowe tym lepiej dla naszego systemu. Moja propozycja to dopisać następującą komendę do pliku rc_user w katalogu /mnt/router/rc/, w sekcji start (czyli po tekście "Add commands here you want to execute when booting")
/mnt/router/packages/hdparm-3.9/hdparm -c3 -d1 -m16 -u1 /dev/hda
Co spowoduje włączenie wszystkich opisanych trybów pracy interfejsu dyskowego i samego dysku przy starcie systemu.

PROBLEMY !

Przytaczam za ULTRA-DMA mini faq :
,,Czarna Lista'' UDMA.Napędy wymienione poniżej znajdują się na liście nie działających. Nie wolno ich używać w trybie UDMA ponieważ może to spowodować utratę danych. Aby tego uniknąć sterownik powinien automatycznie wyłączyć obsługę DMA dla tych napędów.

  • Western Digital WDC AC11000H, AC22100H, AC32500H, AC33100H, AC31600H - wszystkie wersje
  • Western Digital WDC AC32100H revision 24.09P07
  • Western Digital WDC AC23200L revision 21.10N21
Nie wolno przetaktowywać szyny PCI. 37,5 MHz, to maksymalna częstotliwość. Niektóre (prawdopodobnie obsługiwane) napędy UDMA nie zadziałają nawet przy częstotliwości 37,5 MHz, ale 33 MHz powinno działać. W każdym bądź razie NIGDY! nie wolno ustawiać szyny PCI na 41,5 MHz. ZALECANYM bezpiecznym ustawieniem jest 33 MHz. Płyta główna powinna mieć jak najbardziej akualny BIOS. NALEŻY PAMIĘTAĆ ŻE BM-DMA STAWIA PRZED NASZYM SYSTEMEM O WIELE WIĘKSZE WYMAGANIA NIŻ PRACA W ZWYKŁYCH "NORMALNYCH" TRYBACH. Zatem wszelkie usterki sprzętowe mogą się właśnie objawić podczas prób z DMA i wysoko wydajnymi ustawieniami dyskowo-systemowymi.

SŁOWO NA KONIEC

WSZYSTKICH ZMIAN W STOSUNKU DO ORYGINALNEJ KONFIGURACJI DOKONUJECIE NA WŁASNĄ ODPOWIEDZIALNOŚĆ !!! W RAZIE NIEPOWODZENIE UMYWAM RĘCE !!!

Z uwagi na problemy z kompatybilnością (znak końca linii), edycja plików DOS z poziomu linux'a i plików linux'a z poziomu DOS/Windows, niesie za sobą zagrożenie utraty funkcjonalności plików wykonywalnych !!!

PODZIĘKOWANIA

Wszystkim uczestnikom forum dyskusyjnego, newsów oraz personalnie v|rus, eMTi, T-TJM, JamesBOT, [pinkus]

PLIKOLOGIA I LITERATURA

kernel dla intel'a hdparm.sh hdparm.tgz

Polskojęzyczne: www.jtz.org.pl/Html/mini/Ultra-DMA.pl-2.html, http://ptm.linux.pl/man_HTML/man8/hdparm.8.html 
Obcojęzyczne: http://support.intel.com/support/graphics/linux/udma.htm http://linux.oreillynet.com/pub/a/linux/2000/06/29/hdparm.html?page=1 

 

© 2002 - 2003 Robert R - Kopiowanie w całości lub części bez pozwolenia autora zabronione