Întâmpin probleme în a asigura un flux de rețea necesar pe un server conectat la un analizor de spectru Signal Hound printr-o interfață de rețea de 10 GbE.Practic, pot obține un randament bun atunci când rulează numai procesul de captare radio, dar când rulez alte procese, debitul începe să scadă. Folosesc un adaptor Ethernet Aquantia PCIe cu un adaptor QNAP SFP+ 10GbE Thunderbolt 3.
Când rulez un program python simplu pentru a interoga din API-ul analizorului de spectru în modul streaming, totul funcționează excelent la lățimea de bandă maximă (~800 MB/s). Cand fac
$ stress --cpu 8 --io 8 --vm 8 --hdd 8
alăturat, coboară la aproximativ 600 MB/s și încep să scad o mulțime de date.
Lucruri pe care le-am incercat:
- Actualizarea driverelor
- Încurcă cu parametrii de coalescere și multe opțiuni de ethtool (MTU, etc)
- Dezactivarea hyperthreadingului și izolarea procesului la un singur nucleu (8 din 8) prin fixarea afinității CPU
- Acest lucru a implicat, de asemenea, izolarea întreruperilor de rețea la propriul lor nucleu (7 din 8)
- De asemenea, schimb regulatorul de bază pentru a fi „performanță”, astfel încât să fie întotdeauna la frecvența maximă
- De asemenea, am încercat să dezactivez majoritatea celorlalte întreruperi pentru nucleele 7 și 8 pentru a preveni încetinirea lor, verificat de un tablou de bord netdata
- Practic am încercat totul în Aici
În esență, știu că poate rula în timp real, deoarece funcționează bine atunci când este limitat la 2 nuclee. Dar dintr-un anumit motiv, chiar dacă celelalte nuclee nu interferează cu ciclurile CPU sau cu IRQ-urile rețelei, atunci când nucleele 1-6 sunt la încărcare mare, încetinesc foarte mult procesul principal.
Dacă ajută, constat că --vm 4
opțiune pentru stres
provoacă cea mai mare încetinire, așa că bănuiesc că are ceva de-a face cu alocarea memoriei și poate cu interfața DRAM la placa de rețea.
Practic, îmi smulg părul încercând să iau fiecare pachet de la radio pe o mașină Ubuntu 20.04 (ce ar trebui să fie foarte puternică). Are cineva experiență cu astfel de aplicații?
EDIT: Am copiat câteva dintre curbele de performanță aici:
Iată efectul pe care îl văd
Deci, aici este utilizarea.Core 6 este la 100% cu softirq atât în timpul perioadei de stres ridicat, cât și în perioada de „doar captură”. Am încercat să împart datele rețelei pe două nuclee (5 și 6), dar unul dintre ele rămâne întotdeauna încărcat, în timp ce celălalt pare clar, chiar dacă au cantități similare de întreruperi.
Din păcate, numărul real de softirq scade pe CPU 6 în perioada în care se execută testul de stres.
Iată efectul pe care îl văd pe CPU6 softnet.
De asemenea, întreruperile par să rămână relativ aceleași, deși devin puțin mai puțin consistente în perioada de stres ridicat.
Iată viteza directă a rețelei și pare puțin inconsecventă și în ambele perioade.
Am căutat destul de atent anomaliile (deși există o mulțime de diagrame în netstat) și se pare că nu există nicio memorie interproces în timpul perioadei de stres ridicat. Acest lucru ar putea duce la probleme?
Dacă cineva are nevoie de mai multe parcele, anunță-mă. Nu pot deduce problema din acestea, dar sper că sunt suficiente informații pentru a veni cu potențiale soluții.
Multumesc din nou!