Subsections


4 Alternatywne architektury podsystemów komunikacji sieciowej

Celem tego rozdziału jest przekazanie najważniejszych informacji na temat alternatywnych sposobów konstruowania podsystemów sieciowych. Klasyczne podejście, którego przykładami są przedstawione implementacje kodu sieciowego Linuksa i FreeBSD, często jest przyczyną niezadowalającej wydajności kodu. Najbardziej znaną próbą poprawienia wydajności standardowego kodu sieciowego jest implementacja Vana Jacobsona, zastępująca podsystem sieciowy używany w systemie 4.3BSD. W niniejszym rozdziale zaprezentowano wszystkie informacje na temat tej implementacji, jakie udało się znaleźć w Internecie. Omówiono też pokrótce inne podejście, polegające na umieszczeniu obok istniejącego podsystemu sieciowego dodatkowej szybkiej biblioteki komunikacyjnej, nakładającej specjalne wymagania na aplikacje użytkowe.

1 Implementacja Vana Jacobsona

Typowym sposobem implementacji oprogramowania sieciowego jest jego podział na logicznie odrębne warstwy zgodnie z tym, co zostało opisane w rozdziale 2. W pracy [Jacobson 92b] można znaleźć argumenty przeciwko takiej konstrukcji. Choć podział na warstwy stanowi bardzo wygodną technikę projektowania protokołów, to może mieć negatywny wpływ na wydajność napisanego zgodnie z tym projektem oprogramowania.

Praktycznym potwierdzeniem tych spostrzeżeń jest implementacja stosu protokołów TCP/IP, którą wykonał Van Jacobson ze współpracownikami dla systemu 4.3BSD23 (zob. [Jacobson 92b], [Jacobson 93a]). Pomiary wykazały, że działa ona od jednego do dwóch rzędów wielkości szybciej, niż stara implementacja24.

Przy tworzeniu nowej implementacji autorzy kierowali się następującymi spostrzeżeniami.

Implementacja zrealizowana na bazie tych spostrzeżeń odznacza się następującymi cechami.

Pomiary, wykonane z użyciem zewnętrznego analizatora logicznego na maszynie typu Sparcstation-2 z procesorem typu RISC, wykazały, co następuje.


Tabela 4.1: Czas przetwarzania pakietu ([Jacobson 92b])
\begin{tabular}{\vert l\vert l\vert l\vert}
\hline
{\bf operacja} & {\bf instruk...
... --- & 164
\\
skopiowanie 4KB do aplikacji & 1000 & 446
\\ \hline
\end{tabular}



Tabela 4.2: Koszt liczenia sumy kontrolnej -- czasy podano w ns/bajt ([Jacobson 92b])
\begin{tabular}{\vert l\vert l\vert l\vert l\vert}
\hline
{\bf komputer} & {\bf ...
... (15\%)
\\
HP9000{/}720 & 54 (20) & 54 (20) & 0\% (0\%)
\\ \hline
\end{tabular}


2 Optymalizacje kodu w Linuksie i FreeBSD

Na podstawie analizy dokonanej w rozdziale 3 ustalono, które z wymienionych powyżej optymalizacji weszły w skład kodu sieciowego Linuksa i FreeBSD. W tabeli 4.3 zestawiono te obserwacje. Jak widać w obu implementacjach nie stosuje się optymalizacji, które wymagałyby zmian w architekturze podsystemu sieciowego. Architektura FreeBSD stwarza nieco większe problemy niż architektura Linuksa, gdyż nie da się weryfikować sum kontrolnych TCP podczas kopiowania danych do przestrzeni użytkownika w funkcji ogólnego przeznaczenia soreceive(). Z drugiej strony w implementacji Linuksa nie używa się szablonów nagłówków, choć nie ma ku temu znaczących przeszkód wynikłych z podziału na warstwy. Jedynym odstępstwem od struktury warstwowej byłoby w tym przypadku umieszczenie danych protokołu transportowego (szablon nagłówka TCP) i sieciowego (szablon nagłówka IP) we wspólnej strukturze danych. Takie odstępstwo nie stanowiłoby jednak wyłomu w dotychczasowych praktykach tworzenia kodu sieciowego Linuksa.


Tabela 4.3: Optymalizacje w systemach Linux i FreeBSD
\begin{tabular}{\vert l\vert c\vert c\vert}
\hline
& {\bf Linux} & {\bf FreeBSD...
...ów & -- & +
\\ \hline
Pamięć podręczna (np.~ARP) & + & +
\\ \hline
\end{tabular}


3 Specjalizowane biblioteki komunikacyjne

Podejmowane współcześnie próby przyspieszenia komunikacji sieciowej nierzadko polegają na tworzeniu specjalnych bibliotek komunikacyjnych projektowanych tak, aby zapewnić maksymalnie wydajne działanie. Wygoda korzystania z takich bibliotek zazwyczaj schodzi na drugi plan. Takie podejście jest szczególnie często stosowane przy budowie systemów klastrowych.

W pracy [Lichota 02] wymieniono trzy najważniejsze czynniki sprzyjające wysokiej wydajności komunikacji:

  1. określenie takiej semantyki biblioteki, która będzie ukierunkowana na maksymalizację wydajności. To aplikacje powinny zostać przystosowane do wymagań biblioteki (np. przez zastąpienie synchronicznego modelu komunikacji z biblioteką modelem asynchronicznym), a nie na odwrót,
  2. uniknięcie pośredniego kopiowania danych. Kopiowanie powinno być przeprowadzane tylko z buforów aplikacji do karty sieciowej i w odwrotnym kierunku,
  3. umieszczenie aplikacji jak najbliżej sprzętu.

Drugi z tych postulatów może wymagać przystosowania kart sieciowych tak, aby były one w stanie operować na adresach z wirtualnej przestrzeni adresowej aplikacji użytkownika. Takie założenie przyjęto w specyfikacji VIA (ang. Virtual Interface Architecture -- Architektura Wirtualnego Interfejsu), opracowanej w 1997 roku przez firmy Compaq, Intel i Microsoft. VIA jest obecnie najszerzej stosowanym standardem szybkiej komunikacji w systemach klastrowych. Specyfikacja określa sposoby komunikacji aplikacji użytkownika z kartą sieciową, które nie wymagają przechodzenia w tryb jądra podczas wysyłania i odbierania danych. Dodatkowo ustalono, w jaki interfejs powinna być wyposażona typowa implementacja VIA, dostarczająca bibliotekę komunikacyjną. Interfejs taki musi być zgodny ze standardem VIPL (ang. Virtual Interface Provider Library, Biblioteka Dostarczająca Wirtualny Interfejs). Przykładem implementacji VIA o otwartych źródłach zgodnej ze specyfikacją VIPL jest M-VIA (http://www.nersc.gov/research/FTG/via). Jest to rozwiązanie przeznaczone dla systemu Linux z jądrem z serii 2.2 lub 2.4. Niskopoziomowy kod M-VIA działa na poziomie jądra niezależnie od standardowego podsystemu sieciowego. Aplikacje korzystające z dostarczonej biblioteki VIPL przechodzą w tryb jądra tylko w celu wykonania operacji administracyjnych. Podczas przesyłania danych biblioteka VIPL komunikuje się bezpośrednio z kartą sieciową.

Ponieważ korzystanie z biblioteki VIPL bywa niewygodne, stworzono wiele bibliotek komunikacyjnych wyższego poziomu. Przykładem może być przedstawiona w pracy [Lichota 02] biblioteka ZCCL (ang. Zero-Copy Communication Library, Biblioteka Komunikacyjna Bez Kopiowania). Jest to asynchroniczna biblioteka komunikacyjna bez pośredniego kopiowania, przeznaczona do współpracy z biblioteką niższego poziomu, np. VIPL. Jej zastosowaniem są systemy zdalnego dostępu do danych, w których komunikacja jest oparta na modelu żądanie-odpowiedź, np. zdalne systemy plików. Pozwala przedstawić działanie aplikacji jako automatu skończonego o jasno określonych przejściach między stanami. Aplikacje korzystające z tej biblioteki mogą działać zarówno na poziomie użytkownika, jak i na poziomie jądra, używając w obu przypadkach tego samego interfejsu.

Więcej informacji na temat wydajnych bibliotek komunikacyjnych można znaleźć w pracach [Lichota 02], [] i [Kilian 00].



Footnotes

... 4.3BSD23
Z przyczyn prawnych nie weszła ona w skład dystrybucji 4.4BSD ani żadnej innej.
... implementacja24
Wielkość osiągniętego przyspieszenia zależy przede wszystkim od stosunku mocy przetwarzania komputera do przepustowości medium transmisyjnego.
... docelowym25
W niektórych przypadkach, np. pakietów z żądaniami NFS, można od razu wysłać odpowiedź i zwolnić odebrany pakiet.