next up previous contents
Następny: Moduł tl_db Nadrzędny: Wykonawca Poprzedni: Kolejkowanie ruchu w systemie Linux   Spis rzeczy


Moduł sch_ep

Moduł sch_ep rozszerza możliwości jądra systemu Linux o kolejny algorytm obsługi kolejki: ep (od ang. External Priority). Sam nie zajmuje się przechowywaniem pakietów, potrafi natomiast przygotowywać pakiety do obsługi przez istniejące algorytmy. Jego sposób działania przedstawia diagram 3.4.

Każdy pakiet, jaki system próbuje wstawić do kolejki (poprzez funkcję enqueue), przekazywany jest - po zmianie (w sposób zdefiniowany w trakcie konfiguracji algorytmu) jednego z wymienionych pól - do klasy wewnętrznej obsługiwanej przez dowolny inny algorytm. Kiedy system zgłasza żądanie wyboru pakietu do wysłania (dequeue), wykonawca przekazuje to żądanie do klasy wewnętrznej i dopisuje wynik do bazy danych o zrealizowanym ruchu.

Siłą tak napisanego wykonawcy jest jego ogólność: podczas tworzenia algorytmu administrator wskazuje, które pola pakietu czy struktury sk_buff wykonawca powinien zmieniać i podaje dla każdego z nich zbiór wartości odpowiadających wyznaczanym przez decydenta priorytetom. Za samo szeregowanie pakietów na podstawie tych wartości odpowiedzialny jest już algorytm klasy wewnętrznej.

Rysunek: Przepływ pakietu przez kolejki systemowe
\includegraphics[width=\textwidth]{./pictures/Mgr_rys2_last_gimp.ps}

Przykład zastosowania

Niech decydent wyznacza dla każdego adresu IP jeden z 8 priorytetów (od 0 do 7), na podstawie których należy podzielić ruch na trzy pasma w sposób analogiczny do przykładu z rozdziału 3.3.2. Jednym ze sposobów realizacji tego zadania jest przypisanie kolejce wewnętrznej algorytmu prio z filtrem tcindex, wybierającym jedną z trzech klas na podstawie wartości pola sk_buff->tc_index i uruchomienie wykonawcy w trybie zmiany pola tc_index pakietu.


\begin{Code}
tc qdisc add dev eth0 handle 1:0 root ep priorities 8 \
default_pr...
...uffer 1600 limit 3000
tc qdisc add dev eth0 parent 2:3 handle 30: sfq
\end{Code}

Pierwsze polecenie wybiera wykonawcę (algorytm ep) do obsługi całego ruchu wychodzącego poprzez interfejs eth0. Opcja tc_valuemap pozwala na podanie ciągu wartości pola tc_index odpowiadających możliwym wartościom priorytetów (dokładniejszy opis składni tego polecenia znajduje się w punkcie 3.3.5).

Pozostałe polecenia tworzą wewnątrz wykonawcy strukturę przedstawioną na rysunku 3.5.

Rysunek: Układ klas dla przykładowego filtra
\includegraphics[width=12.5cm]{./pictures/Mgr_rys5_last_gimp.ps}

Tak skonfigurowany filtr tcindex wybiera dla każdego pakietu jedną z klas 10:0, 20:0 i 30:0 na podstawie wartości jego pola tc_index, które z kolei jest ustawiane przez sch_ep zgodnie z tabelą 3.1.


Tablica: Wartości priorytetu dla poszczególnych klas filtra
Priorytet tc_index klasa
0 3 30:0
1 3 30:0
2 3 30:0
3 2 20:0
4 2 20:0
5 1 10:0
6 1 10:0
7 1 10:0


Algorytm prio działa zgodnie z opisem w punkcie 2.2.1 - podczas wyboru pakietu do wysłania pierwszeństwo zawsze będą miały te z priorytetami 5, 6 i 7, a jeśli takich nie będzie, to 3 i 4.

Symulacja

Sposób działania modułu sch_ep najwyraźniej widać podczas symulacji z wykorzystaniem programu tcsim wchodzącego w skład pakietu tcng. Przeprowadza on bardzo dokładną emulację zachowania sieciowej części systemu Linux, ale nie udostępnia systemu plików procfs, więc zamiast (opisanego w rozdziale 3.3.4) modułu tl_db wykorzystano obliczanie priorytetu na podstawie ostatniego bajtu adresu IP (wykonując modulo $MAX\_PRIORITY-MIN\_PRIORITY +1$).

Zmiany wymagał też plik konfiguracyjny:


\begin{Code}
...

Oprócz definicji opisanej hierarchii klas plik ten zawiera też polecenia wysłania 7 pakietów, po jednym z adresów odpowiadających różnym priorytetom (od 1 do 7).

Wynikiem działania symulatora dla podanego pliku konfiguracyjnego jest plik, którego istotne fragmenty (ograniczone do szczegółowych informacji o operacjach enqueue oraz ogólnych o dequeue) zawiera ramka:


\begin{BRCode}
E : 0x80c7e00 40 : eth0: 45000028 00000000 40060000 0a09ca01 0a ....
...D : 0x80c8140 40 : eth0: 45000028 00000000 40060000 0a09ca02 0a ...
\end{BRCode}

Pierwsza kolumna to litera oznaczająca typ operacji: ,,E'', ,,e'' (od Enqueue) lub ,,D'' (Dequeue).

Wiersze od 1 do 4 opisują proces dodania (enqueue) pierwszego pakietu (z adresu 10.9.201.1); z wiersza 2 wynika, że pakiet ten trafił to klasy 30:0. Kolejne czwórki linii (6-9, 10-13, 14-17, 18-21, 22-25 i 26-29) świadczą o tym, że pakiety zostają skierowane do klas zgodnie z tabelką 3.2.


Tablica 3.2: Wyniki testu wykonawcy
Adres klasa
10.9.202.1 30:0
10.9.202.2 30:0
10.9.202.3 20:0
10.9.202.4 20:0
10.9.202.5 10:0
10.9.202.6 10:0
10.9.202.7 10:0



next up previous contents
Następny: Moduł tl_db Nadrzędny: Wykonawca Poprzedni: Kolejkowanie ruchu w systemie Linux   Spis rzeczy
Marcin Kaszyński, Krzysztof Lorek