Puncte:2

Cum să simulăm ceea ce se întâmplă în buffer-ul de pachete al unui comutator simplu?

drapel ro

Depanez un caz de pachete UDP pierdute într-un comutator gigabit store-and-forward și am vrut să vizualizez ce se întâmplă în interiorul comutatorului pentru a înțelege mai bine esenta problemei.

Scenariul este simplu - două fluxuri de date în rafală vin prin 2 porturi din interiorul comutatorului și ambele doresc să-l părăsească printr-un al treilea port (comun ambelor). Deci, comutatorul trebuie să rețină câteva date în buffer-ul de pachete pentru o perioadă.

Problema este: pe baza calculelor mele simple, tampoanele ar trebui să fie suficient de mari pentru a gestiona cazul pe care îl examinez. Un flux de date trimite rafale de 25 kB (împărțit la 1514 pachete B) la fiecare 1,56 ms, celălalt trimite rafale de 60 kB la fiecare 1 ms. Acum, chiar și un comutator Soho precum Netgear GS105E are o dimensiune tampon de 128 kB. Deci matematica simplă (25+60 < 128) spune că ar trebui să funcționeze chiar dacă fluxurile intră în același timp (având în vedere că nu există alt trafic substanțial).

Testele reale arată că o mulțime de pachete din ambele fluxuri se pierd pe unele comutatoare (pare a fi legat de dimensiunea tamponului, dar nu numai de aceasta). În simularea mea, nu pot face ca tamponul să se umple în exces când este setat la 128 kB.

Am înregistrat această animație pentru un buffer de dimensiunea de 24 kB unde există supraumplere. Cu toate acestea, puteți vedea cu ușurință că creșterea bufferului cu doar câțiva octeți ar rezolva problema și toate pachetele ar trece.

Am făcut câteva simplificări în această simulare. Toate pachetele au aceeași QoS (care este și în cazul real). Așa că am omis cozile QoS din simulare și tratez tot traficul ca fiind la fel de important. Apoi, am omis gestionarea memoriei tamponului. Îmi pot imagina că este o parte importantă a problemei, dar aș fi surprins dacă simplificarea mea cu alocări perfecte ar fi greșită cu peste 10% din cazul real. De asemenea, pretind că comutatorul știe lungimea cadrului atunci când primește primii octeți, astfel încât să rezerve toată memoria necesară la început. Deoarece nu am putut găsi nicio documentație despre dimensiunea cozilor de intrare/ieșire ale porturilor, presupun că toate sunt plasate în buffer-ul de pachete partajat și pot lua cât mai multă parte din buffer (deși cred că vinovatul poate fi undeva aici).Am setat întârzierea de procesare a fiecărui pachet la 512 ns (întârzierea de propagare a unui pachet de 64 B).

Nu sunt sigur dacă joacă un rol, dar fluxurile constau din pachete UDP fragmentate (adică explozia de 25 kB este un singur pachet UDP fragmentat la 17 fragmente IP). Al doilea flux creează explozia ca 2 sau 3 pachete UDP de 20 kB, fiecare fragmentat la 14 fragmente IP.

Comenzile Iperf 3.7 pentru a replica fluxuri similare cu cele reale sunt:

iperf3 -c sink -u -b 128M -t 600 -l 25256 --pacing-timer 1560
iperf3 -c sink -u -b 400M -t 600 -l 20k --pacing-timer 1000

Aveți vreo idee ce altceva am uitat să iau în considerare care ar putea face ca simularea să fie atât de departe de realitate? Multumesc pentru ajutor!

Codul sursă pentru animație este la https://gist.github.com/peci1/a0346538acc6c289b2c6d596b184ad21 .

simularea fluxului de date prin comutator

Iată tabelul meu de rezultate din experimentele reale. Fluxul de date unul este fix - 128 Mbps în pachete UDP de 25 kB fiecare 1,56 ms. Am schimbat parametrii celui de-al doilea flux încercând să găsesc limita la care pachetele primului flux vor începe să se piardă de comutator. Schimbam -l (lungime) parametru care specifică dimensiunea pachetului UDP și -b (lățime de bandă) parametru care specifică ce lățime de bandă ar trebui să genereze aceste pachete. --temporizator de ritm a fost întotdeauna setat la 1000 pentru al doilea flux. Puteți vedea că D-Link și Netgear GS105 nu pot face față deloc exploziilor de 60 kB. GS108 se descurcă mult mai bine decât GS105, în timp ce are aproape același cip de comutare (aceeași „familie”, doar un număr diferit de porturi și un buffer puțin mai mare).

Intrerupator Dimensiunea tamponului [kB] Trafic maxim 1,5 kB în rafală Trafic maxim 20 kB în rafală Trafic maxim 60 kB în rafală
Gigablox Rugged (VSC7512) 220 825 Mbps 825 Mbps 825 Mbps
Gigablox (RTL8367N-VB-CG) 250 730 Mbps 750 Mbps 790 Mbps
D-Link DIS-100G-5W (QCA8337N-AL3C) 128 110 Mbps 1 Mbps fiecare explozie pierde pachete
Zyxel XGS 1210-12 (RTL9302B) 1500 800 Mbps 830 Mbps 830 Mbps
Netgear GS310-TP (RTL8380M) 520 830 Mbps 830 Mbps 835 Mbps
Netgear GS308T (RTL8380M) 520 830 Mbps 835 Mbps 835 Mbps
Netgear GS108 v3 (BCM53118) 192 630 Mbps 660 Mbps 710 Mbps
Netgear GS105E (BCM53114) 128 120 Mbps 1 Mbps fiecare explozie pierde pachete
Renkforce RF-4270245 ? 740 Mbps 760 Mbps 800 Mbps
Mikrotik RB260GS (AR8327) 128 835 Mbps 835 Mbps 835 Mbps
Juniper EX2300 4GB? 800 Mbps 830 Mbps 830 Mbps

(Această întrebare a fost migrată din https://networkengineering.stackexchange.com/questions/78529/how-to-simulate-what-happens-inside-the-packet-buffer-of-a-simple-switch unde a fost marcat ca off-topic).

paladin avatar
drapel id
Mărimea MTU pentru pachetele Ethernet este de 1500 de octeți și nu de 1514 de octeți. Uită-te la --> https://en.wikipedia.org/wiki/Maximum_transmission_unit#MTUs_for_common_media
paladin avatar
drapel id
PS dacă chiar trimiteți pachete cu o dimensiune MTU de 1514 octeți prin Ethernet, acele pachete vor fi scuipat în 2 pachete (1500 octeți + 14 octeți), reducând efectiv la jumătate buffer-ul comutatorului dvs.
Martin Pecka avatar
drapel ro
1514 include suprafața. Dimensiunea pachetului IP este de 1500 de octeți.
paladin avatar
drapel id
Tocmai am citit că `iperf` nu funcționează 100% precis. Funcționalitatea depinde de hardware-ul folosit. Dacă doriți rezultate mai precise, utilizați o valoare mai mică „--pacing-timer”. Pe scurt, `iperf` nu poate garanta atingerea ratei de biți dorite.
Martin Pecka avatar
drapel ro
@paladin Mulțumesc pentru informații. Am verificat proprietățile ratei de biți și ale fluxului de pachete din partea de recepție și arată așa cum era de așteptat.
Zac67 avatar
drapel ru
Pot crea diverse modele, dar *nu puteți replica cu adevărat ceea ce se întâmplă în interiorul comutatorului fără informații detaliate* despre implementarea acestuia. Diferiți dezvoltatori și vânzători pot folosi abordări foarte diferite ale acestei probleme. Bufferele pot fi alocate static porturilor etc. Dacă nu ești foarte norocos, nu vei avea niciodată acele informații. În mod corespunzător, întrebarea dvs. duce doar la presupuneri care sunt în afara subiectului aici. Dacă comutatorul nu funcționează, folosiți unul mai bun. Dacă aveți cerințe *foarte* specifice, contactați mai întâi furnizorul sau evaluați într-un laborator.
Martin Pecka avatar
drapel ro
@Zac67 Vă mulțumim pentru înțelegere. De asta m-am temut (și am sperat că vor exista, de exemplu, câteva „abordări standard” dintre care vânzătorii pot alege...).„Dacă comutatorul nu funcționează, folosește unul mai bun” - exact asta mi-aș dori, dar în mod ideal aș dori să am o modalitate de a evalua comportamentul înainte de a cumpăra comutatorul sau cel puțin să-i ghicesc comportamentul. .
Zac67 avatar
drapel ru
@MartinPecka Din păcate, nu veți găsi asta creând modele teoretice, ci doar întrebând furnizorul despre cazul dvs. de utilizare sau prin testare rigidă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.