r =
s =
ss =
Bezklasowe / FIFO: TeoriaImplementacjaWykorzystanie

FIFO / FCFS

Kolejka FIFO (First-In-First-Out, czasami określana jako FCFS - First-Come-First-Served) jest najprostrzym algorytmem kolejkowania, a właściwie brakiem algorytmu kolejkowania. Kolejke opuszcza zawsze najstarszy pakiet (tzn. najdłużej czekający). Implementacja jest niezwykle prosta i stosowana w urządzeniach o bardzo ograniczonej mocy obliczeniowej, ale najczęściej nie daje zbyt dobrych wyników. Jej zastosowaniem może być zliczanie zaległych pakietów (backlog), czekających na wysłanie. Na przykład Linux oferuje dwie takie proste kolejki: pfifobfifo -- pierwsza pozwalaką one zliczać ilość pakietów/bajtów w buforze. Różnia się tym, że tej pierwsej podajemy ograniczenie kolejki w pakietach, a tej drugiej w bajtach.

Nawet na łączu 100 Mbit/s, jeśli jest kolejka FIFO, to standardowe parametry MTU = 1500 bajtów, txqueuelenth = 1000 pakietów dają bufor o długości 1500 * 1000 * 8 = 14.4 MBit, więc opóźnienia mogą przekraczać 144 ms (w 144 ms przesłany zostanie cały bufor a na końcu pakiet interaktywnej aplikacji). W modemie ADSL z łączem 1 Mbit (gdzie standardowa kolejka ma 100 pakietów), opóźnienia mogą przekraczać już 1.2 s.

Implementacja

Dane tego algorytmu to właściwie jeden parametr $limit$ oznaczający maksymalną wielkość kolejki (w pakietach lub bajtach). Podczas dokładania pakietu na koniec kolejki, jeśli okaże się, że przekroczyliśmy limit, pakiet jest odrzucany.

Warto wspomnieć, że domyślna kolejka linuksowa pfifo_fast nie podlega problemowi pokazanemu na rysunku, gdyż wewnętrznie posiada ona trzy "podkolejki", więc mały pakiet interaktywny trafiłby do oddzielnej "podkolejki" niż duże pakiety FTP czy podobne. Dodatkowo, kolejka dla pakietów interaktywnych ma wyższy priorytet, i pakiety FTP nie byłyby wysyłane, póki jest coś do wysłania w kolejce interaktywnej. Dokładniej o niej tutaj.

Wykorzystanie

Wstawienie na wyjście sieciówki eth0 kolejki FIFO o długości 2000 pakietów:

tc qdisc add dev eth0 root pfifo limit 2000

Wstawienie na wyjście sieciówki eth kolejki FIFO o długośći txqueuelen razy MTU urządzenia (wartości te można sprawdzić poleceniem ifconfig):

tc qdisc add dev eth0 root handle 1: bfifo

Sprawdzenie statystyk kolejki:

tc -s qdisc ls dev eth0
Wynik tego polecenia może być na przykład taki:
qdisc pfifo 8006: root limit 1000p
 Sent 157586 bytes 1655 pkt (dropped 0, overlimits 0 requeues 0) 
 rate 0bit 0pps backlog 0b 0p requeues 0
To znaczy, że kolejka pfifo ma długość 1000 pakietów, wysłała juz 157586 bajtów w 1655 pakietach. Jak narazie żaden pakiet nie został odrzucony (dropped 0).

Creative Commons License Content by Michał Pokrywka is licensed under a Creative Commons BY-SA 3.0
Ostatnia znacząca zmiana: 2010-04-28