Do strony głównej modułu Pamięć

Próba usprawnienia algorytmu wyboru urządzenia wymiany

  1. Wstęp
  2. Co można zrobić lepiej?
  3. Komplikacje
  4. Jak to zrealizować?
  5. Spodziewane rezultaty
  6. Testowanie usprawnienia

  1. Wstęp

    W systemie operacyjnym Linux algorytm wyboru urządzenia wymiany, do odesłania ramki działa następująco: system sprawdza kolejno wszystkie urządzenia o najwyższym priorytecie, gdy nie znajdzie wolnego miejsca przechodzi do niższej wartości priorytetu itd. Pewnym usprawnieniem jest fakt, że w obrębie danego priorytetu urządzenia poszukuje się korzystając z cyklicznej listy, zaczynając od miejsca, w którym znaleziono poprzednią wolną ramkę. W ten sposób system stara się wykorzystywać urządzenia wymiany równomiernie.

    Niestety podany algorytm nie bierze pod uwagę możliwych różnic w prędkości działania poszczególnych urządzeń w ramach jednego priorytetu, jak również różnych obciążeń tych urządzeń spowodowanych koniecznością wykonywania innych działań, np. sprowadzaniem ramek do pamięci.

    Powrót do spisu treści


  2. Co można zrobić lepiej?

    Pomysł na usprawnienie algorytmu opiera się na następujących spostrzeżeniach:

    Powrót do spisu treści


  3. Komplikacje

    W celu realizacji mojego pomysłu na usprawnienie działania mechanizmu wymiany konieczne byłoby dokładne monitorowanie czasu zajętości poszczególnych urządzeń. Podejście takie wydaje się jednak bardzo skomplikowane z punktu widzenia implementacji. Mając na celu ograniczenie się do modyfikacji niewielkiego kawałka kodu systemu proponuję przyjąć następujące założenia:

    Powrót do spisu treści


  4. Jak to zrealizować?

    Wszystkich niezbędnych poprawek będziemy dokonywać w plikach swapfile.c oraz page_io.c z katalogu mm. Interesują nas procedury get_swap_page oraz rw_swap_page. Pierwsza z nich odpowiada za znalezienie wolnej ramki na jednym z urządzeń wymiany, druga - za zapis lub odczyt ramki.

    Pierwszym krokiem do realizacji usprawnienia powinna być implementacja systemu monitorowania prędkości działania poszczególnych urządzeń wymiany. Dokonujemy tego w procedurze rw_swap_page. Konieczny staje się pomiar czasu jej wykonania. Wielkość tę należy uśrednić korzystając z poprzednich wyników i zapamiętać do późniejszego wykorzystania. Tutaj ważna uwaga - statystykę prowadzić należy dla każdego urządzenia wymiany oddzielnie. Drugim parametrem procedury rw_swap_page jest kod położenia ramki. Jego dolne 8 bitów oznacza nr urządzenia. Mając taką informację można prowadzić statystykę dla każdego z nich z osobna.

    Kolejnym krokiem będzie modyfikacja procedury odpowiedzialnej za wybór urządzenia wymiany do odesłania ramki, czyli procedury get_swap_page. System przechowuje informacje o dostępnych urządzeniach w tablicy swap_info. Pierwsze urządzenie znajduje się w niej pod indeksem swap_list.head, a każde kolejne ma indeks swap_info[nr aktualnego urzadzenia].next.

    Moja propozycja polega na przejrzeniu takiej listy urządzeń i wybraniu jednego z nich drogą losowania, przypisując każdemu z nich prawdopodobieństwo odwrotnie proporcjonalne do czasu potrzebnego na realizację zlecenia wymiany. Prawdopodobnie można przeprowadzić wybór lepiej niż losowo, jednak podany tutaj sposób charakteryzuje się bardzo prostą implementacją.

    Aby zapewnić poprawne działanie systemu trzeba jeszcze zadbać o spełnienie kilku warunków. Przede wszystkim po wybraniu urządzenia należy sprawdzić jego zdolność do przyjęcia zlecenia. Dokonujemy tego sprawdzając, czy zachodzi warunek (swap_info[nr_urzadzenia].flags&SWP_WRITEOK)==SWP_WRITEOK. Jeśli wszystko jest w porządku trzeba postarać się o przydział ramki na danym urządzeniu. Dokonuje tego procedura scan_swap_map, która jako parametr przyjmuje wskaźnik do odpowiedniej struktury swap_info, dając w wyniku nr ramki lub 0 w przypadku błędu. Jeśli wszystko poszło zgodnie z planem nasza procedura powinna zwrócić kod położenia ramki składający się z numeru urządzenia (dolne 8 bitów) oraz numeru ramki (górne 24 bity). W przypadku błędu całą procedurę należy powtórzyć wybierając kolejne urządzenie wymiany.

    Powrót do spisu treści


  5. Spodziewane rezultaty

    Inspiracją do przeprowadzenia eksperymentu był dla mnie odczuwalny wzrost wydajności systemu Windows NT podczas obróbki dużych plików graficznych po dołożeniu do systemu drugiego dysku twardego jako urządzenia wymiany. Równocześnie zauważyłem, że w Linuxie mechanizmy rozkładające obciążenie pomiędzy poszczególne urządzenia wymiany wydają się być bardzo proste. Możliwe, że ich siła tkwi właśnie w owej prostocie, a moje teoretyczne rozważania nie znajdą potwierdzenia w praktyce i już samo dołożenie drugiego dysku twardego przyniesie znaczny wzrost wydajności. Możliwe również, że pewne programy intensywnie wykorzystujące dysk twardy (nie jako pamięć wirtualną, ale w innych celach) oraz duże ilości pamięci operacyjnej skorzystają z większego obciążenia drugiego dysku systemowego i pozostawienia pierwszemu większej ilości czasu dla obsługi żądań programu.

    Powrót do spisu treści


  6. Testowanie usprawnienia

    Aby sprawdzić, czy proponowane przeze mnie usprawnienie rzeczywiście nim jest chyba najlepiej wykonać kilka rzeczywistych eksperymentów, symulujących sytuacje, z którymi system może spotkać się w praktyce.

    Pewną trudnością w testowaniu rozwiązania może być konieczność użycia przynajmniej dwóch urządzeń wymiany. Idealną sytuacją jest możliwość posłużenia się dwoma dyskami twardymi, jednak może to okazać się z technicznych względów niewykonalne. W takim przypadku można jako drugie urządzenia wymiany użyć lokalnej sieci, jednak znaczna różnica w prędkości działania dysku i sieci może spowodować, że wyniki nie będą takie, jakich oczekujemy, aczkolwiek warto spróbować.

    Można też spróbować następującej konfiguracji - jako urządzeń wymiany można użyć dwóch katalogów sieciowych, na dwóch różnych komputerach, rezygnując z dysku twardego jako takiego. Ważne, żeby sieciowe urządzenia wymiany pracowały niezależnie, więc wąskim gardłem podczas ich użycia nie może być karta sieciowa testowego komputera. W tym celu należy dwa komputery symulujące urządzenia wymiany bardzo obciążyć, starając się to zrobić możliwie równomiernie. Taki układ pozwoli na symulację konfiguracji z dwoma dyskami twardymi i powinien zachowywać się w podobny sposób.

    Mając tak skonfigurowany system możemy przystąpić do właściwych testów. Proponuję następujące scenariusze:

    Wszystkie testy należy przeprowadzić porównując działanie systemu przed i po modyfikacji. Ważnym czynnikiem są podane programom jako parametry rozmiar pamięci oraz pliku, których mają używać. Jeśli np. zadeklarujemy zbyt mało pamięci mechanizm wymiany pozostanie nieaktywny i nie zobaczymy różnicy w pracy systemu. Programom testowym należy podać również liczbę iteracji, co pozwala na sensowne testowanie w przypadku systemów o znacząco różnej szybkości, np. z dwoma dyskami lokalnymi lub tylko z siecią.

    Powrót do spisu treści


    Autor: