TC(8)

NUME
sfq - coadă de așteptare stocastică echitabilă (Stochastic Fairness Queueing)

SINOPSIS
tc qdisc ... [ divisor hashtablesize ] [ limit pachete ] [ perturb secunde ] [ quantum octeți ] [ flows număr ] [ depth număr ] [ headdrop ] [ redflowlimit octeți ] [ min octeți ] [ max octeți ] [ avpkt octeți ] [ burst pachete ] [ probability P ] [ ecn ] [ harddrop ]

DESCRIERE
Stochastic Fairness Queueing este o disciplină de coadă fără clase disponibilă pentru controlul traficului cu comanda tc(8) . SFQ nu modelează traficul, ci doar programează transmiterea pachetelor, pe baza „fluxurilor”. Scopul este de a asigura echitatea, astfel încât fiecare flux să poată trimite date pe rând, împiedicând astfel ca un singur flux să acopere restul. Acest lucru poate avea, de fapt, un anumit efect în atenuarea unei tentative de refuz al serviciului. SFQ economisește resurse și, prin urmare, livrează întotdeauna un pachet dacă are unul disponibil.

ALGORITM
La introducerea în coadă, fiecare pachet este atribuit unui hash bucket, pe baza valorii hash a pachetului. Această valoare hash este obținută fie dintr-un clasificator de flux extern (utilizați tc filter pentru a le stabili) fie dintr-un clasificator intern implicit, dacă nu a fost configurat niciun clasificator extern. Când se utilizează clasificatorul intern, sfq utilizează

(i) Adresa sursă

(ii)
    Adresă de destinație

(iii)
    Portul sursă și portul destinație

Dacă acestea sunt disponibile. SFQ recunoaște ipv4 și ipv6, precum și UDP, TCP și ESP. Pachetele cu alte protocoale sunt criptate (hashed) pe baza reprezentării pe 32 de biți a destinației și sursei lor. Un flux corespunde în mare parte unei conexiuni TCP/IP. Fiecare dintre aceste găleți (buckets) ar trebui să reprezinte un flux unic. Deoarece mai multe fluxuri pot fi rezumate (hashed) în aceeași găleată, algoritmul intern de rezumare (hashing) sfqs poate fi perturbat la intervale configurabile, astfel încât inechitatea să dureze doar pentru o perioadă scurtă de timp. Perturbarea poate provoca însă o reordonare neintenționată a pachetelor. După linux-3.3, nu mai există problema reordonării pachetelor, dar sunt posibile pierderi de pachete dacă rehashing-ul atinge o limită (numărul de fluxuri sau pachete per flux). La eliminarea din coadă, fiecare hashbucket (găleată-rezumat) cu date este interogată în mod circular. Înainte de linux-3.3, lungimea maximă a SFQ în timpul compilării era de 128 de pachete, care puteau fi distribuite în cel mult 128 de găleți din cele 1024 disponibile. În cazul depășirii capacității, se efectua eliminarea cozii „tail-drop” din găleata cea mai plină, menținându-se astfel echitatea. După linux-3.3, lungimea maximă a SFQ este de 65535 pachete, iar limita divizorului este de 65536. În cazul depășirii capacității, se efectuează tail-drop pe cea mai plină găleată, cu excepția cazului în care s-a solicitat eliminarea începutului „headdrop”.

PARAMETRI

divisor
    Poate fi utilizat pentru a stabili o dimensiune diferită a tabelei hash, disponibilă începând cu nucleul 2.6.39. Divizorul specificat trebuie să fie o putere a lui doi și nu poate fi mai mare de 65536. Valoarea implicită: 1024.

limit
    Limita superioară a SFQ. Poate fi utilizată pentru a reduce lungimea implicită de 127 de pachete. După linux-3.3, poate fi mărită.

depth
    Limita de pachete pe flux (după linux-3.3). Valoarea implicită este 127 și poate fi redusă.

perturb
    Intervalul în secunde pentru perturbarea algoritmului cozii. Valoarea implicită este 0, ceea ce înseamnă că nu are loc nicio perturbare. Nu stabiliți o valoare prea mică, deoarece fiecare perturbare poate provoca reordonarea sau pierderea unor pachete. Valoarea recomandată este 60. Această valoare nu are niciun efect atunci când se utilizează clasificarea fluxului extern. Este mai bine să creșteți valoarea divizorului pentru a reduce riscul coliziunilor hash.

quantum
    Numărul de octeți pe care un flux îl poate scoate din coadă în timpul unei runde a procesului circular „round robin”. Valoarea implicită este MTU-ul interfeței, care este și valoarea recomandată și valoarea minimă.

flows
    După linux-3.3, este posibil să se modifice limita implicită a fluxurilor. Valoarea implicită este 127.

headdrop
    Comportamentul implicit al SFQ este de a efectua „tail-drop” al pachetelor dintr-un flux. Puteți solicita în schimb un „headdrop”, deoarece se știe că acesta oferă un răspuns mai bun pentru fluxurile TCP.

redflowlimit
    Configurează modulul RED opțional în partea superioară a fiecărui flux SFQ. Principiul detectării timpurii aleatorii (Random Early Detection) constă în marcarea sau eliminarea pachetelor într-un mod probabilistic. (consultați «man tc-red» pentru detalii despre RED)
    redflowlimit configurează limita maximă pentru dimensiunea reală (nu medie) a cozii pe flux SFQ în octeți.

min Dimensiunea medie a cozii la care marcarea devine posibilă. Valoarea implicită este max /3

max La această dimensiune medie a cozii, probabilitatea de marcare este maximă. Valoarea implicită este redflowlimit /4.

probability
    Probabilitatea maximă pentru marcare, specificată ca număr în virgulă mobilă între 0,0 și 1,0. Valoarea implicită este 0,02.

avpkt
    Specificată în octeți. Utilizată împreună cu burst pentru a determina constanta de timp pentru calcularea dimensiunii medii a cozii. Valoarea implicită este 1000.

burst
    Utilizată pentru a determina cât de repede este influențată dimensiunea medie a cozii de dimensiunea reală a cozii.
    Valoarea implicită este:
    (2 * min + max) / (3 * avpkt)

ecn RED poate fie „marca”, fie „renunța/elimina”. Notificarea explicită de congestie permite RED să notifice gazdele la distanță că rata lor depășește lățimea de bandă disponibilă. Gazdele care nu sunt compatibile cu ECN pot fi notificate numai prin renunțarea la un pachet. Dacă acest parametru este specificat, pachetele care indică faptul că gazdele lor respectă ECN vor fi doar marcate și nu renunțate, cu excepția cazului în care dimensiunea cozii atinge adâncimea depth de pachete.

harddrop
    Dacă dimensiunea medie a cozii de flux este mai mare de max octeți, acest parametru forțează o renunțare în loc de marcarea ecn.

EXEMPLU ȘI UTILIZARE
Pentru a atașa la dispozitivul ppp0:

# tc qdisc add dev ppp0 root sfq

Vă rugăm să rețineți că SFQ, la fel ca toate qdisc-urile care nu modelează (conservă munca), este util numai dacă deține coada. Acesta este cazul când viteza legăturii este egală cu lățimea de bandă disponibilă efectiv. Acest lucru este valabil pentru modemurile telefonice obișnuite, conexiunile ISDN și legăturile ethernet directe necomutate.

De cele mai multe ori, modemurile prin cablu și dispozitivele DSL nu se încadrează în această categorie. Același lucru este valabil și atunci când sunt conectate la un comutator și încearcă să trimită date către un segment congestionat, conectat și el la comutator.

În acest caz, coada efectivă nu se află în Linux și, prin urmare, nu este disponibilă pentru planificare.

Încorporați SFQ într-un qdisc cu clase pentru a vă asigura că deține coada. Este posibil să se utilizeze clasificatori externi cu sfq, de exemplu pentru filtrul hash de trafic (flux) bazat numai pe adresele IP sursă/destinație:

# tc filter add ... flow hash keys src,dst perturb 30 divisor 1024

Rețineți că divizorul dat trebuie să corespundă celui utilizat de sfq. Dacă ați modificat valoarea implicită sfq de 1024, utilizați aceeași valoare și pentru filtrul hash de flux.

Exemplu de sfq cu modul RED opțional:

# tc qdisc add dev eth0 parent 1:1 handle 10: sfq limit 3000 flows 512 divisor 16384
  redflowlimit 100000 min 8000 max 60000 probability 0.20 ecn headdrop

SURSA

o   Paul E. McKenney „Stochastic Fairness Queuing”, IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.

o   Paul E. McKenney „Stochastic Fairness Queuing”, „Interworking: Research and Experience”, v.2, 1991, p.113-131.

o   See also: M. Shreedhar și George Varghese „Efficient Fair Queuing using Deficit Round Robin”, Proc. SIGCOMM 95.

CONSULTAȚI ȘI
tc(8), tc-red(8)

AUTORI
Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Eric Dumazet <eric.dumazet@gmail.com>.

Această pagină de manual este întreținută de bert hubert <ahu@ds9a.nl>

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.