2017 m. rugpjūčio 30 d.

BSD ir Linux OS našumo testavimas: užkardos atžvilgiu

Rašant savo baigiamąjį bakalauro darbą tarp kolegijos IT išteklių skirtų studentų reikmėms atradau sąžiningai neblogos kompiuterių tinklo geležies (žr. 1 lentelę) todėl pasibaigus baigiamąjį darbą nusprendžiau kiek ilgiau su ja pažaisti ir ištirti tai kas senokai jau nedavė ramybės: FreeBSD, OpenBSD ir Linux operacinių sistemų branduolių našumas persiunčiant ir filtruojant kompiuterių tinklo paketus. Tiksliau kuri iš šių plačiai naudojamų OS turi našesnį tinklo steką ir užkardos posistemę?

Tiesa dėl laiko stokos šis operacinių sistemų tinklo pralaidos našumo tyrimas gan paviršutiniškas, tačiau ateityje planuoju išsamesnę tiriamų OS tinklo steku analizę bei gilesnę ir įvairesnę paketų maršrutizavimo ir filtravimo testavimo metodika, paremta RFC 2544 rekomendacijomis ir ne tik.

1 lentelė. Testavimo aplinkos aparatinė įranga
2 vnt.
HP ProLiant DL165 G7
AMD Opteron™ Processor Model 6128 (2.0 GHz, 12MB Level 3 Cache, 8 cores, 80W)
AMD Chipset SR5670
2 x HP NC362i Integrated Dual Port Gigabit Server Adapter
4GB 1Rx4 PC3-10600R-09-10-C1-P1

Pažymėtina, jog testavimo aplinką sudarantys serveriai rinkoje pasirodė apie 2011 metus ir priklauso ekonomiškų modelių klasei. Jų skaičiavimų ir duomenų apdorojimo sparta nėra itin didelė. Tai reikia turėti mintyje, jog nesusidaryti klaidingos nuomonės apie nūdienos x86 architektūros platformos galimybes Ethernet kompiuterių tinklo mazge. Vis dėlto testuose testuojama ne geležis, o tinklo operacinių sistemų našumas.

Metodika


Tiriamos BSD ir Linux operacinės sistemos su dedikuota aparatine įranga įterpiamos tarp dviejų kompiuterių – serverio ir kliento. Testų metu iperf programinės įrangos pagalba tarp kliento ir serverio sukuriamas vienalaikis dvikryptis duomenų srautas – tiek klientas tiek serveris generuoja ir priima duomenis – nes ir realybėje duomenys perduodami į abi puses. Visas duomenų srautas kerta testuojamą objektą ir leidžia išmatuoti jo įtaką duomenų perdavimo našumui, palyginti gautus rezultatus su kitomis testuojamomis OS. Kompiuteriai per Gigabit Ethernet tinklo sąsajas tiesiogiai apjungti vytos poros kabeliais, taip sumažinant pašalinių veiksnių trikdžius testų rezultatams.

Testavimo modelio schema

Šis modelis iš pirmo žvilgsnio prašo trijų kompiuterių, bet iš teisų galima atlikti ir su dviem: virtualizuojant vieną kompiuterio sistemą arba tiesiog vykdyti kelias iperf instancijas (kliento ir serverio) vienoje OS. Kiek pasvarstęs minusus ir pliusus nusprendžiau virš vieno fizinio serverio naudoti Proxmox VE virtualizacijos sluoksnį ir susikurti dvi ištekliais izoliuotas ir atskiras virtualias mašinas – serverio ir kliento imitavimui – su dedikuotomis tinklo sąsajomis per IOMMU virtualizacijos palaikymą. Šiam sprendimui daugiausia įtakos turėjo Proxmox VE siūlomi patogūs įrankiai nuotolinei prieigai prie virtualiųjų mašinų: tyrimo eigai derinti ir vykdyti. HP serverių siūloma Lights-Out 100 funkcija pateikiama kaip JAVA appletas, kuris ne tik nebepalaikomas nūdienos naršyklėse dėl saugos, bet ir su senomis linkęs mėtyti klaidos pranešimus nei veikti kaip priklauso.

Viena vertus, virtualizacijos sluoksnis su dviem virtualiomis mašinomis neturi kritinės reikšmės testų rezultatams, kadangi iperf serverio ir kliento programos neapkrauna sistemos maksimaliai – priklausomai nuo testo, bendra virtualizuotos kompiuterio sistemos apkrova svyravo nuo 30 iki 50 proc. Antra vertus, daugelį kartų kartoti testai sumažina rezultatų paklaidą.

Visi testai atlikti su keliais Ethernet tinklo duomenų perdavimo vienetais – kanaliniame lygmenyje vadinamais kadrais {frames} – didžiausiu ir mažiausiu, bei vidutinio dydžio kadrais: 64, 512 ir 1518 baitais. Kaip jau minėta, dvikryptis duomenų srautas generuojamas su iperf tinklo testavimo programine įranga. Pažymėtina, jog visi testai atlikti tik su UDP paketų srautu, kadangi iperf įrankis tik su UDP duomenų srautu leidžia sumažinti generuojamų kadrų dydį iki 64 baitų.

Straipsnyje naudojamos dvi kompiuterių tinklo duomenų perdavimo vienetų sąvokos – kadras {frame} ir paketas {packet} – iš pirmo žvilgsnio naudojamos pakaitomis, ir tam tikrais atvejais gali būti tapatinamos jei siekiama supaprastinti koncepcija, tačiau techniškai šių sąvokų apibrėžimas ir taikymo sritys skirtingos.

Paketais norima pabrėžti, jog kalba eina apie duomenų perdavimo vienetus tinklo lygmenyje, tuo tarpu kadro sąvoka priklauso kanaliniam lygmeniui (žr. OSI modelį). Paketus galima prilyginti laiškams, o kadrus vokui.

Vienas standartinis Ethernet tinklo kadras leidžia perduoti nefragmentuotą paketą iki 1500 baitų, toks paketas apgaubtas kadro antraštėmis kanaliniame lygmenyje užima iki 1518 baitų – maksimalus perdavimo vienetas {maximum transmission unit} (MTU).

Taigi, kadrų ir paketų skaičius sutampa jei IP paketo dydis nedidesnis už 1500 baitus; arba kadrų skaičius didesnis už paketų, jei pastarųjų dydis didesnis už 1500 baitus. Šiame tyrime siekta neviršyti Ethernet standarto MTU, todėl kadrų ir paketų skaičius testuose sutampa ir esminės klaidos nebus laikant kadro ir paketo sąvokas tapačiomis.

Paketai šiame tyrime akcentuojami, nes testuojamas operacinės sistemos našumas tinklo lygmenyje (IP/UDP), o kadro sąvoka norint pabrėžti tinklu perduodamų vienetų dydį ir jų skaičių.

Retas tinklo mazgas tik maršrutizuoja paketus, beveik visada jis atlieka bent minimalų duomenų srauto filtravimą ar visavertį užkardos vaidmenį. Todėl darbe bandoma ištirti ne tik kaip našiai OS persiunčia paketus su turima x86 kompiuterių architektūros aparatine įranga, bet ir kaip paketų apdorojimo spartą paveikia jų filtravimas. Taigi, šiame darbe tiriamos OS analizuojamos trimis skirtingais darbo režimais, kai:
  • veikia tik maršrutizatoriaus režimu {forwarding} (tik persiunčia paketus, filtravimas išjungtas)
  • dirba įsimenamuoju tinklo užkardos režimu {stateful firewall} + 25 vartotojo apibrėžtos taisyklės;
  • veikia neįsimenamuoju užkardos režimu {stateless firewall} + 25 vartotojo apibrėžtos taisyklės.

Tinklo užkardos testuose siekiama imituoti įprastą vartotojo sukonfigūruotą užkardos sistemą su 25 paketų filtravimo taisyklėmis, iš kurių tik viena ir paskutinė 25-oji taisyklė suteikia leidimą testo duomenų srautui kirsti testuojamą mazgą iki paskirties taško. Taip tiriama sistema priverčiama nuosekliai tikrinti visas 25 vartotojo apibrėžtas taisykles. Užkarda veikianti įsimenamuoju režimu geba įsiminti jau užmegztos tinklo sesijos paketų požymius, tad visą paketų filtravimo taisyklių sąrašą tikrina tik pirmąjį kartą (kai tinklo mazgą kerta paketas užmezgantis ryšį). Tuo tarpu užkarda veikianti neįsimenamuoju režimu besąlygiškai tikrina kiekvieną ją kertantį tinklo paketą per visas 25 taisykles (iki sąlygos praleisti). Toks taisyklių tikrinimas gali gerokai įtakoti tinklo mazgo našumą, jei šis nėra pritaikytas tinklo saugos užduotims vykdyti.

Norint geriau suprasti testuojamų OS tinklo našumo savybes skirtingos architektūros aparatinėje įrangoje, testai buvo atliekami net tik su daugiaprocesorine sistema, bet ir imituojant vienaprocesorinę kompiuterio sistemą. Rezultatai diagramose sužymėti abiem atvejais: naudojant daugelį procesoriaus branduolių – MP (multi-processor), ir naudojant tik vieną branduolį – SP (single-processor). Šie duomenys gali praversti renkantis testuojama OS vienaprocesoriniams {embedded} tinklo įrenginiams, taip pat, įvertinti tiriamų OS branduolių darbo efektyvumą su daugiaprocesorinėmis SMP kompiuterio sistemomis.

Vienam testuojamam kadro dydžiui atliekama 10 testo bandymų po 120 sekundžių. Siekiant pašalinti neproporcingus rezultatus, galimai iškreiptus dėl virtualizacijos sluoksnio ar kitų trikdžių, 3 iš 10 atmetami (su didžiausiais perdavimo nuostoliais), o iš likusių 7 testo bandymo rezultatų skaičiuojamas pralaidos, operatyviosios atminties sunaudojimo ir duomenų perdavimo nuostolių vidurkis. Vidurkis pralaidai ir atminties apkrovai užskaitomas kaip teisingas rezultatas reprezentuoti testuojamam kadro dydžiui, jei perduotų kadrų nuostolių vidurkis nėra didesnis už 0,15%, kita vertus bent pusė rezultatų šie nuostoliai nėra didesni už 0,1%.

Testai atlikti pusiau automatizuojant rezultatų paieška su bash skriptais, prieš tai rankiniu būdų surandant reikiamas pralaidos reikšmes kiekvienam testuojamam kadro dydžiui taikant vadinamąjį pusėjimo/dvigubinimo {halving/doubling} metodą – mažinant ir didinant pralaidos parametro reikšmę du kartus – kol prie tam tikros pralaidos duomenų peravimo nuostoliai nėra didesni už 0,15 proc.

Operacinių sistemų paruošimas testavimui


BSD ir Linux operacinės sistemos turi nemažai panašumų: gali bei naudoja dalį tos pačios programinės įrangos, abi priskiriamos Unix tipo OS ir plėtojamos nemokamo ir atviro kodo principais. Tačiau, skiriasi jų plėtojimo filosofija ir tikslai. Šiam tyrimui pasirinktos populiariausios ir pagrindinės BSD ir Linux sistemos.



Kaip matyti iš Unix tipo operacinių sistemų ryšių paveikslėlio, OpenBSD ir FreeBSD artimesnės tarpusavyje savo prigimtimi nei GNU/Linux OS atžvilgiu, be to BSD sistemos yra tiesioginis UNIX operacinės sistemos palikuonis; kita vertus beveik visos nūdien populiarios OS turi (bent filosofines) šaknis į UNIX OS (išimtis tik Microsoft Windows).

Nors dauguma šiuolaikinių operacinių sistemų sugeba automatiškai prisitaikyti darbui tinkle ir pakankamai sparčiai dirba Fast Ethernet ir Gigabit Ethernet kompiuterių tinkluose be rankinio konfigūravimo. Antra vertus, papildomai paruošti darbui tinkle reiktų serveriams skirtas Gigabit Ethernet tinklo kortas, ir būtina jei naudojamos itin aukštos pralaidos, pvz., 10 Gigabit Ethernet tinklo sąsajos. Šiame tyrime testuojamų OS tinklo stekai papildomai konfigūruoti siekiant pritaikyti jas maršrutizatoriaus darbui tinkle, kiek įmanoma suvienodinti tinklo steko parametrus, o kartu ir paspartinti jų našumą tinkle.

Žemiau pateiktas operacinių sistemų tinklo steko konfigūravimas nėra rekomendacija ar pilna derinimo instrukcija kaip reiktų paruošti maršrutizatorių porodukcinei infrastruktūrai, bet viso labo reikšmingi sistemos parametrai atliktam testavimui (sąmoningai praleistas TCP konfigūravimas, kurio parametrai UDP paketų srauto testų metu neturi reikšmės).

FreeBSD 10.3 konfigūracija


FreeBSD – populiariausia BSD operacinė sistema, plėtojama kaip bendro pobūdžio. Filosofinis tikslas būti techniškai šiuolaikiška ir itin našia operacine sistema. FreeBSD pasižymi nepriekaištinga dokumentacija ir turi geriausia aparatinės įrangos palaikymą tarp kitų BSD tipo sistemų. Skirtingai nei Linux, FreeBSD plėtojama ir platinama kaip pilnai išbaigta OS (ne tik jos branduolys), todėl yra nuoseklesnė. Dėl išskirtinio stabilumo, saugos ir spartos santykio FreeBSD dažniausiai naudojama kaip serverių platforma, nors dalis jos vartotojų naudoja ir kaip stalinio ar nešiojamojo kompiuterio OS.

Nepaslaptins, jog Netflix savo tinklo infrastruktūrą patiki FreeBSD sistemai. Žinant, jog 2015 metais Šiaurės Amerikoje Netflix duomenų srautas sudarė apie 35% viso Interneto duomenų srauto, galima teigti, jog FreeBSD maršrutizuoja bent 35% Interneto duomenų srauto Šiaurės Amerikoje :)

Nors FreeBSD turi savą užkardos sistemą (ipfw), dažnas tinklo administratorius pirmenybę teikia iš OpenBSD pasiskolintai užkardos posistemei – pf. Dėl to užkardos testuose FreeBSD naudojo pf modulį. Toliau pateikti visi testuotos FreeBSD 10.3 operacinės sistemos papildomai konfigūruoti tinklo steko parametrai.

/etc/rc.conf
pf_enable="YES"
gateway_enable="YES" 
ifconfig_igb1="inet 10.0.1.1/24 -tso –lro"
ifconfig_igb2="inet 10.0.2.1/24 -tso -lro"

/boot/loader.conf
hw.igb.enable_msix=1
hw.igb.enable_aim=1
net.link.ifqmaxlen= 50 -> 512
hw.igb.num_queues= 0 -> 2 
hw.igb.rxd= 1024 -> 4096
hw.igb.txd= 1024 -> 4096
hw.igb.max_interrupt_rate= 8000 -> 32000
hw.intr_storm_threshold= 1000 -> 300000

/etc/sysctl.conf
net.inet.ip.forwarding= 0 -> 1
net.inet.ip.fastforwarding= 0 -> 1
net.inet.ip.redirect= 1 -> 0
dev.igb.1.fc= 3 -> 0
dev.igb.2.fc= 3 -> 0
dev.igb.1.rx_processing_limit= 100 -> -1 # < žymus našumo padidėjimas!
dev.igb.2.rx_processing_limit= 100 -> -1 # < žymus našumo padidėjimas!
kern.ipc.maxsockbuf= 2097152 -> 4194304
net.bpf.bufsize= 4096 -> 2097152
net.bpf.maxbufsize= 524288 -> 4194304 
net.inet.raw.recvspace= 9216 -> 131072
net.inet.raw.maxdgram= 9216 -> 131072
net.inet.udp.recvspace= 42080 -> 131072
net.inet.udp.maxdgram= 9216 -> 131072

OpenBSD 6.1 konfigūracija


OpenBSD laikoma viena iš saugiausių ir patikimiausių operacinių sistemų ne tik tarp BSD, bet visuotinai, todėl dažnai naudojama kritinei infrastruktūrai palaikyti, pavyzdžiui, bankuose ar kitose kibernetinei saugai itin jautriose organizacijose. Šias saugos OpenBSD savybes nulemia OS plėtojimo filosofija, kurią galima išskirti į tris plėtojimo tikslus: programinė įranga turi būti kaip galima atviresnė; vengti prasto, mažiau saugaus ar perteklinio programinio kodo; minimalizuoti naudojamas programinės įrangos tarnybas OpenBSD sistemoje pagal nutylėjimą. Taip sumažinant vadinamąjį atakos plotą visoje sistemoje.

Plačiau apie BSD sistemas, jų skirtumus: Vikipedijoje

Testuose naudota OpenBSD 6.1 sistemos versija taip pat papildomai paruošta maršrutizatoriaus vaidmeniui tinkle, tik pf užkardos sistema čia įgimta ir naujesnė už tą kuri integruota į FreeBSD 10.3 sistemą. Toliau pateikti visi OpenBSD sistemoje konfigūruoti parametrai.

/etc/sysctl.conf
kern.bufcachepercent= 20 -> 50
net.inet.ip.ifq.maxlen= 256 -> 512
net.inet.ip.forwarding= 0 -> 1
net.inet.ip.redirect= 1 -> 0
net.inet.ip.maxqueue= 300 -> 4096
net.bpf.bufsize= 32768 -> 2097152
net.bpf.maxbufsize= 2097152 -> 4194304
net.inet.udp.recvspace= 41600 -> 131072
net.inet.udp.sendspace= 9216 -> 131072

Skirtingai nei Linux ir FreeBSD sistemose, OpenBSD naudojo em tinklo sąsajos tvarkykles, kurios nepalaiko TSO ir LRO funkcijų, todėl jų ir išjungti nereikėjo. Apskritai, OpenBSD siūlo vos keletą konfigūruojamų parametrų be programinio branduolio derinimo ir kompiliacijos procesų.

Ubuntu Server 17.04 konfigūracija


GNU/Linux populiariausia ir universaliausia Unix tipo operacinė sistema, naudojama nuo išmaniųjų laikrodžių, telefonų iki superkompiuterių, todėl gali pasigirti geriausiu aparatinės įrangos palaikymu tarp kitų Unix tipo sistemų. Testuose Linux sistemai atstovauti pasirinkta populiari Ubuntu Server distribucija, minimalistine programines įrangos paketų atžvilgiu.

Testuojama Ubuntu Server 17.04 versija taip pat buvo papildomai paruošta maršrutizatoriaus funkcijai atlikti. Toliau pateikti visi standartinio Ubuntu Server tinklo steko, bei kiti konfigūruoti parametrų pakeitimai.

/etc/rc.local
for i in enp4s0f1 enp3s0f0;
do 
ethtool –G $i tx 4096 rx 4096; (default 256)
ethtool –K $i tso off lro off gso off gro off; (default on, off, on, on)
ethtool –-pause $i autoneg off rx off tx off; (defult on,on)
done;

/etc/network/interfaces
post-up /sbin/ifconfig enp4s0f1 txqueuelen 4096; (default 1000)
post-up /sbin/ifconfig enp3s0f0 txqueuelen 4096; (default 1000)

/etc/sysctl.conf
net.ipv4.ip_forward= 0 -> 1
net.ipv4.conf.all.accept_redirects = 1 -> 0
net.ipv4.conf.all.send_redirects = 1 -> 0
net.ipv4.conf.all.accept_source_route = 0

net.core.rmem_max = 212992 -> 4194304
net.core.wmem_max = 212992 -> 4194304
net.core.rmem_default = 212992 -> 2097152
net.core.wmem_default = 212992 -> 2097152
net.ipv4.udp_rmem_min = 4096 -> 131072
net.ipv4.udp_wmem_min = 4096 -> 131072

Konfigūruojant Ubuntu Server operacinę sistemą dalis tinklo steko parametrų ne tik nedavė didesnio našumo persiunčiant tinklo paketus, bet ir neigiamai įtakojo rezultatus. Todėl Linux atveju atsisakyta dalies branduolio derinimo nustatymų (išbrauktieji). Iš tiesų, keli šaltiniai Internetuose rekomenduoja papildomai nekonfigūruoti sistemos branduolio tinklo darbo atminties buferių, jei tinklo pralaida neviršija 1Gbit, o delsa mažesnė nei 50 ms.

Tinklo pralaidos testų analizė


Tinklo pralaida {throughput} esminis tinklo našumo kiekybinis rodiklis, marketingo tikslais dažnai pateikiamas bitais per sekunde (bps), tartum leidžiantis iš pirmo žvilgsnio įvertinti tinklo įrenginio spartą. Tačiau, tinklo pralaida matuojama ne tik bitais per sekundę, bet ir kadrais/paketais per sekundę (kps/pps). Būtent pastarasis pralaidos matavimo vienetas padeda objektyviau įvertinti įrenginio spartą tinkle.

Be to, labai svarbu nurodyti su kuriuo tinklo kadro ilgiu įrenginio pralaida išmatuota, kadangi dažnas Ethernet tinklo įrenginys pasieks afišuojamą 1 Gbps duomenų perdavimo spartą siunčiant didelius paketus, bet retas pasieks bent ketvirtadalį nurodytos pralaidos su mažais tinklo paketais.

Todėl šiame tiriamajame straipsnyje pralaidos testų rezultatai bus pateikti trims skirtingiems kadro ilgiams juos matuojant kadrais per sekundę (kps) bei bitais per sekundę (bps). Pirmiausiai akcentuojant pralaidą kadrais per sekundę apačioje pateiktos stulpelinės diagramos: vertikalioje ašyje žymimas suminis vienalaikis abiejų krypčių kadrų skaičius per sekundę tūkstančiais; horizontalioje ašyje sužymėti skirtingų ilgių tinklo kadrai.

 Suminė vienalaikė dvikryptė tinklo pralaida matuojant kadrais per sekundę (tūkstančiais)

Kaip matyti iš testų rezultatų diagramų, jei bandytume testuojamas OS palyginti tarpusavyje su didžiausiais tinklo paketais, turėtume pripažinti visų jų lygybę, nors tai ne aparatinės įrangos spartos, o Gigabit Ethernet standarto lubos. Ilgiausių kadrų testai kone beverčiai šioje analizėje ir tarnauja tik kaip įrodymas, jog tinklo prietaiso spartos nereiktų vertinti su didžiausių paketų pralaida. Tai klaida būdinga tik kompiuterių tinklų neišmanėliams ir kadangi mes nesam neišmanėliai, toliau analizuojamos diagramos akcentuojant trumpiausių kadrų našumas, bei vidutinio ilgio kadrų jei šių testų rezultatai turi skirtingos informacijos.

OpenBSD


Vieša paslaptis, jog OpenBSD plėtotojų gretos daug retesnės už kitų dviejų testuojamų sistemų. Be jokių testų nemaža dalis išpranašautų OpenBSD daugiaprocesorinės sistemos branduoliui daug kuklesnius rezultatus lyginant su kitomis dviem testuojamomis OS. Tačiau turbūt niekas nesitikėtų, jog tos pačios operacinės sistemos MP branduolys gaus į kaulus nuo SP branduolio. Keista, bet visuose testuose OpenBSD operacinės sistemos SP branduolys demonstravo aiškų tinklo paketų apdorojimo spartos pranašumą prieš analogiška MP branduolį.

Remiantis top sisteminio įrankio duomenimis OpenBSD gebėjo paskirstyti tinklo paketų apdorojimą keliems procesoriaus branduoliams tik deja neigiamai efektyviai tą darė, tinklo pralaidos atžvilgiu. Kas dėl to kaltas sunku tiksliai pasakyti be gilesnės analizės. Galbūt naudota aparatinė įranga, o galbūt OpenBSD plėtojimo prioritetas sistemos saugumui prieš našumo gerinimą daugiaprocesorinėse SMP sistemose.

Pažymėtina, jog OpenBSD vienintelė iš testuojamų OS turėjo įdiegtą gryną vienaprocesorinės (SP) sistemos branduolį, kurį galima paleisti krovos metu su komanda: boot /bsd.sp. Tačiau tai nėra šių testų anomalios priežastis, MP branduolyje išjungiant procesoriaus branduolius (ukc> disable 55) ir imituojant SP branduolio veikimą, gauti panašūs rezultatai.

Apdorojant mažiausius kompiuterių tinklo paketus iš diagramų matyti akivaizdus Ubuntu Linux ir FreeBSD našumo pranašumas prieš OpenBSD operacinę sistemą. Visuose testuose ji buvo lėtesnė už kitas dvi testuotas sistemas naudojant tiek SP tiek MP branduolį. Išimtis tik keli vidutinio dydžio paketų testai tarp SP branduolių, kai OpenBSD paketų persiuntimo sparta gerokai pranoko Ubuntu Linux sistemą, bei demonstravo apylygį našumo rezultatą paketų filtravime įsimenamosios užkardos teste.

Viena iš galimų vangaus našumo priežasčių yra prastas aparatinės įrangos palaikymas OpenBSD operacinėje sistemoje, kadangi ji vienintelė testuose naudotoms tinklo plokštėms, su Intel 82576 valdiklio lustu, naudojo mažiau pažangias ir senesnes em tvarkykles vietoj naujesnių igb tinklo sąsajos tvarkyklių. Galima tarti, jog tai OpenBSD lėto plėtojimo kaltė, kadangi FreeBSD sistema dar nuo 2008 metų be em palaiko ir igb tinklo sąsajos tvarkykles.

Vis dėlto našumo skirtumas tarp kitų testuotų OS nėra toks didelis, jog būtų teisinga nuvertinti OpenBSD kaip maršrutizatorių ar užkardos sistemą. Kaip jau buvo minėta OpenBSD yra viena saugiausių tinklo OS, todėl nedidelis spartos nuostolis pateisintinas saugos atžvilgiu palaikant kritinę kompiuterijos infrastruktūrą.

FreeBSD


Nuo seno vyrauja įsitikinimas, jog FreeBSD operacinė sistema turi stabilesnį ir spartesnį tinklo steką nei Linux. Tai argumentuojama FreeBSD tinklo steko paprastumu ir efektyvumu, tuo tarpu Linux pasižymi funkcionalumu. Tačiau Linux progresas niekada nesustojo, atvirkščiai, tai OS turinti geriausią palaikymą iš aparatinės įrangos gamintojų bei didžiausią plėtotojų bendruomenę tarp kitų Unix tipo operacinių sistemų. Natūralu, jog Linux tinklo steko efektyvumas su laiku didėja ir savo sparta tinkle tikrai nesiskundžia.

Kaip matyti iš diagramų FreeBSD dar sugeba pasispardyti – užtikrintai lenkia Ubuntu Linux sistemą mažiausių paketų persiuntimo {forwarding} testuose, kai nenaudojama pf užkardos posistemė. Visgi retas tinklo mazgas tik persiunčia paketus, beveik visada naudojamas ir paketų filtravimas.

Testuose su įjungta užkardos posisteme situacija palankesnė Ubuntu Linux operacinei sistemai. Nors daugelyje užkardos testuose FreeBSD + pf gerokai atsilieka savo sparta nuo Linux + netfilter paketų filtravimo posistemes, SP branduolių varžytinėse FreeBSD sparčiau filtruoja vidutinio dydžio IP tinklo paketus.

Viena vertus, dėl itin spartaus paketų persiuntimo, bet lėto jų filtravimo galima kaltinti ne tik FreeBSD operacinę sistemą, bet ir iš OpenBSD pasiskolinta pf užkardos posistemę. Antra vertus, testuojamos FreeBSD 10.3 ir OpenBSD 6.1 sistemos naudoja skirtingas pf versijas.

FreeBSD 10.3, išleista 2016-tais metais, turi integruotą pf posistemę iš 2009-ųjų metų OpenBSD 4.5 versijos. Per septynerius metus ne tik naujosios pf versijos pasikeitė savo sintakse ir pasipildė naujomis funkcijomis, bet ir perkeltoji pf versija kardinaliai modifikuota darbui su FreeBSD tinklo steku, kuris iš esmės skiriasi nuo OpenBSD.

Versijų skirtumas atsirado OpenBSD užkardos sistemą modifikavus ir pritaikius našesniam darbui su FreeBSD daugiaprocesorinės sistemos branduoliu. Tačiau modifikacijos nėra perkeliamos atgal į OpenBSD sistemą ir FreeBSD priversta plaukti prieš pf plėtojimo srovę. Pasirodžius naujai pf versijai OpenBSD operacinėje sistemoje ir norint ją integruoti į FreeBSD reikia ją reikšmingai modifikuoti, o tai atima daug plėtotojų pastangų.

Todėl panašu, jog procesas vytis naujas pf versijas FreeBSD plėtotojų bendruomenėje apstojo 2012 m. Viliamasi, jog ateityje bus dažniau naudojama savoji paketų filtravimo posistemė – ipfw, dėl didesnio našumo ir paprastesnio visos FreeBSD operacinės sistemos plėtojimo.

Deja dėl laiko stokos nespėjau patikrinti kaip sparčiai savoji FreeBSD užkardos posistemė (ipfw) filtruoja tinklo paketus, o pf pasirinkta dėl didesnio jos populiarumo prieš savąją. Tikiuosi dievas man atleis. Aišku viena, pf paketų filtravimo posistemės implantacija FreeBSD operacinėje sistemoje veikia kur kas našiau nei gimtojoje OpenBSD.

Iš testų rezultatų matyti, jog daugelio branduolių procesorius leidžia pasiekti geresnį našumą su FreeBSD operacine sistema. Tačiau pralaidumo padidėjimas toli gražu nėra tiesiogiai proporcingas procesoriaus branduolių skaičiui. Daugiaprocesorinė FreeBSD sistema leidžia apdoroti vidutiniškai 12% didesnę duomenų srauto apkrovą su mažiausiais tinklo paketais, o tai nėra ženklus padidėjimas.

Pažymėtina, jog FreeBSD tik imitavo SP branduolį į operacinės sistemos paleidimo failą (/boot/loader.conf) įrašius „kern.smp.disabled=1“ direktyvą, kuri nurodo OS branduoliui imituoti vienaprocesorinės sistemos darbą. Mažai tikėtina, jog grynas FreeBSD operacinės sistemos SP branduolys parodytų ženkliai skirtingus rezultatus.

Konfigūruojant FreeBSD tinklo steką pastebėta, jog daugelio eilių naudojimas per tinklo sąsają – siekiant tinklo plokštės paketus paskirstyti daugeliui procesoriaus branduolių lygiagrečiam jų apdorojimui, tikintis padidinti tinklo plokštės pralaidą – su testuota aparatine įranga ne visada davė norimą rezultatą. Todėl konfigūruojant FreeBSD operacinę sistemą tinklo plokštės galimų eilių skaičius buvo sumažintas nuo 8 iki 2 (hw.igb.num_queues=2).

Remiantis „systat –v 1“ duomenimis, kai FreeBSD sistemoje naudojama daugiau nei viena eilė (procesoriaus branduolys) per tinklo sąsają, pvz., dvi eilės (du branduoliai) tinklo plokštei aptarnauti, bendras pertraukčių {interrupts} skaičius kompiuterio sistemoje taip pat padidėja du kartus. Deja tinklo pralaidumas tam tikrais atvejais (ieškant didžiausios pralaidos kurios nuostoliai nedidesni už 0,15 proc.) nepadidėja, o nukrenta kai sistema perkraunama pertraukčių užklausomis, dalinant paketų apdorojimą į skirtingas eiles priklausančias skirtingiems procesoriaus branduoliams.

Galima spėti, jog tam tikrais atvejais vidinis procesoriaus duomenų srautas perkrauna jo fizines architektūros galimybes, pasireiškia duomenų perdavimo kamštis stabdantis spartų paketų apdorojimą. Viena vertus, kuo daugiau laiko sugaištama komunikuojant ir koordinuojant darbus, tuo mažiau laiko lieka naudingam darbui atlikti. Kita vertus, jei taikant keletą eilių pralaida padidėja, teoriškai padidėja ir paketų apdorojimo delsa.

Iš tiesų, remiantis „systat –v 1“ ir „top –SHIPZs1“ stebėjimais, FreeBSD 10.3 algoritmas balansuojantis pertrauktis {interrupts} tarp daugelio procesoriaus branduolių nėra idealus. Neretai tinklo srauto paketai apdorojami dviejų eilių pagalba, nors pakaktų ir vienos eilės per tinklo plokštę, ir atvirkščiai, naudojama tik viena eilė kai akivaizdžiai reiktų dviejų našiam tinklo darbui užtikrinti.

Pastebimas ir balansavimo algoritmo neryžtingumas, kai vieno pralaidos testo metu kelis kart keičiasi taikomų eilių skaičius monotoniškam duomenų srautui apdoroti. Arba atliekant vieną testą FreeBSD gali puikiai susitvarkyti su tam tikros pralaidos duomenų srautu, bet pakartojus testą pasitaiko kitoks pertraukčių paskirstymas dėl ko paketų srauto apdorojimas sulėtėja.

Ubuntu Linux


OpenBSD pasilikus saugoti užnugario reali tinklo našumo kova vyksta tik tarp Ubuntu ir FreeBSD operacinių sistemų. Kurioje, bent jau žvelgiant iš testų rezultatų diagramose, Ubuntu Linux su netfilter užkardos posisteme atrodo solidžiau, ji abiejų tipo užkardų testuose su mažiausiais tinklo paketais ženkliai lenkia FreeBSD sistemą.

Taip pat geriau progresuoja Ubuntu našumas daugelio branduolių kompiuterio sistemoje – lyginant su vienaprocesorinę sistema tinklo pralaida su mažiausiais tinklo paketais padidėja vidutiniškai apie 32% naudojant daugiaprocesorinės Linux sistemos branduolį. Pastebėtina, jog testuose Ubuntu tik imituoja vienprocesorinę sistemą, per GRUB paleidimo tvarkyklę Linux branduoliui perdavus parametrą „nosmp“.

Iš teisų, vienaprocesorinių sistemų užkardos testuose Linux tik per plauką lenkia FreeBSD operacinę sistemą, tačiau daugiaprocesorinių sistemų užkardos testuose Linux tinklo steko palaikoma pralaida vidutiniškai 29% didesnė už FreeBSD, ir net 93% didesnė už OpenBSD operacinės sistemos.

Nors Ubuntu Linux daugiaprocesorinės sistemos testų rezultatai atrodo geriausiai tarp kitų testuotų operacinių sistemų, būtina pabrėžti, jog programinės įrangos dalis (Irqbalance) Ubuntu OS atsakinga už pertraukčių {interrupts} balansavimą tarp daugelio procesoriaus branduolių nesugebėjo paskirstyti tinklo sąsajų generuojamas pertrauktis keliems branduoliams. O jei dar tiksliau, visas pertrauktis (ne tik iš tinklo plokščių) bandė atlikti su vienu nuliniu procesoriaus branduoliu.

Sprendžiant iš Internetų ši problema nėra reta ir priklauso nuo naudojamos aparatinės įrangos. Tačiau, sprendžiant iš naudojamo AMD Opteron 6128 procesoriaus specifikacijos, techniškai su šiuo procesoriumi pertraukčių balansavimas įmanoma, nes jo branduoliai dalinasi bendra spartinančiąja atmintine {Level 3 cache}. Taigi, kiek pasikrapščius su Irqbalance tarnyba {daemon} galiausiai nusprendžiau visiškai ją išjungti ir rankiniu būdu sukonfigūruoti specialius rps_cpus ir cpu_affinity failus, atsakingus už pertraukčių paskirstymą Linux sistemoje.

Iš tiesų, net šis derinimo procesas nebuvo paprastas kaip gali pasirodyti iš pirmo žvilgsnio. Sukonfigūravus vieną variantą jis nebūtinai tiks po OS perkrovimo, tad tenka vėl ieškoti kelių branduolio ir tinklo sąsajos porų našiam pertraukčių apdorojimui. Galų gale net testavimo metu retkarčiais procesoriaus branduoliai tarsi apsikeisdavo vietomis ir tapdavo nebe efektyviausiu deriniu tinklo plokštėms aptarnauti, todėl teko kelis kartus stabdyti testavimą ir ieškoti kurie du procesoriaus branduoliai efektyviausiai lygiagrečiai darbuojasi su skirtingomis tinklo plokštėmis. Sunku pasakyti kas dėl to kaltas, bet aišku viena, su skriptais šių darbų nepavyks automatizuoti.

Apačioje pateikta bash skripto iškarpa padedanti rankiniu būdu sukonfigūruoti rps_cpus ir cpu_affinity failų parametrus:
for i in {0..7}; do echo 000002 > /sys/class/net/ enp3s0f0 /queues/rx-$i/rps_cpus; done
for i in {0..7}; do echo 000004 > /sys/class/net/ enp4s0f1 /queues/rx-$i/rps_cpus; done
for i in {54..62}; do echo 000002 > /proc/irq/$i(enp3s0f0 IRQ)/smp_affinity; done
for i in {44..52}; do echo 000004 > /proc/irq/$i(enp4s0f1 IRQ)/smp_affinity; done

Pastebėtina, jog Ubuntu kaip ir FreeBSD su testuota aparatine įranga naudoja igb tinklo plokštės tvarkykles, tik kiek skirtingas jų versijos: 5.4.0 ir 2.5.3 atitinkamai. Remiantis Intel.com duomenimis abi tvarkyklės palaiko tas pačias tinklo plokštes. Tikėtina Linux skirtos igb tvarkykles numeracija daug aukštesne dėl dažnesnio plėtotojų indelio ir atnaujinimo. Kita vertus, Linux tvarkyklės dėl man nežinomų priežasčių neleido sumažinti tinklo sąsajas aptarnaujančių eilių skaičių nuo 8 iki 2, bandant tinklo steko konfigūraciją sutapatinti su FreeBSD sistema.

Rezultatų apibendrinimas


Pabaigai tie patys visų testų rezultatai tik kitame pavidale, kai tinklo pralaida išreikšta megabitais per sekundę (Mbps). Nors testų rezultatus atvaizduojant bitais per sekundę niekas iš esmės nepasikeičia, šis matavimo vienetas suteikia papildomos informacijos vertinant tinklo prietaiso spartą. Visgi ne visi geba mintinai kadrų skaičių per sekundę versti į megabitus per sekundę. Tuo labiau, jog tai vienas dažniausių tinklo pralaidos matavimo vienetų, kartais suprantamas ir paprastų mirtingųjų tarpe.

 Suminė vienalaikė dvikryptė tinklo pralaida matuojant megabitais per sekundę

Nūdien, visuotinai paplitus daugiaprocesorinėms kompiuterio sistemoms, kuomet net išmanieji laikrodžiai turi bent po kelis branduolius centriniame procesoriuje, dauguma operacinių sistemų plėtotojų nebesivargina platinti kopijų be SMP palaikymo (gryną vienaprocesorinės sistemos branduolį). Deja operacinės sistemos vis dar susiduria su sunkumais efektyviai išnaudoti daugelį centrinio procesoriaus branduolių, net jei fizinė procesoriaus architektūra tam neprieštarauja.

Apibendrinant testuotų OS gebėjimą efektyviai progresuoti SMP kompiuterio sistemoje tinklo pralaidos atžvilgiu matoma kuriozinė situacija: OpenBSD MP branduolys veikė neigiamai efektyviai lyginant su SP; Ubuntu Linux nors ir fiksuotas vidutiniškai 32% pralaidos padidėjimas su MP branduoliu, tik rankiniu būdu pavyko priversti tinklo sąsajų pertrauktis {interrupts} priskirti skirtingiems branduoliams; tuo tarpu FreeBSD nors ir gebėjo daugiaprocesorinėje sistemoje savarankiškai paskirstyti tinklo pertrauktis skirtingiems centrinio procesoriaus branduoliams, bendras vidutinis pralaidos padidėjimas testuose tik 12 procentų.


Galų gale taip ir liko neaišku, kaip Ubuntu Linux performintu jei Irqbalance nesipyktu su testuota aparatine įranga. Klausimas į kurį dar reikės atsakyti ateityje, o šį kart tiesiog pakelti skrybėlę ir nusilenkti FreeBSD operacinei sistemai, kuri vienintelė iš testuotų sistemų sugebėjo teigimai efektyviai automatizuoti pertraukčių balansavimą.

Nereiktų nuvertinti ir operacinės sistemos kuri prioretizuoja saugumą. OpenBSD gali pasiūlyti išskirtinai saugią maršrutizatoriaus, užkardos ar kitą tinklo mazgo sistemą, ir bent jau vienaprocesorinėse kompiuterių sistemose – konkurencingą tinklo pralaidą. Saugai jautrioms organizacijoms nedidelis spartos nuostolis mainais į kompiuterių tinklo apsaugą, tai maža kaina už apsaugota organizacijos konkurencingumą, reputaciją ar išlikimą rinkoje apskritai.

Daugiau apie nūdienos kibernetinės saugos problematiką, galite perskaityti man ankstesniame straipsnyje: Kibernetinės erdvės pažeidžiamumas

FreeBSD būtų neginčytinas šių pralaidos testų nugalėtojas jei vertintume OS tinklo steko našumą tik persiunčiant tinklo paketus be jų filtravimo. Vis dėlto, retas kompiuterių tinklo mazgas tik priima ir siunčia tinklo paketus, paprastai prisireikia ir užkardos funkcijų.

Užkardos režimų testuose su mažiausiais tinklo paketais – svariausias argumentas vertinant tinklo prietaiso spartą – iš diagramų matyti Linux + netfilter paketų filtravimo posistemės pranašumas prieš FreeBSD su pasiskolinta pf užkardos posisteme. Skirtumas ypač ryškus Ubuntu Linux sistemai bandant išnaudoti daugelio branduolių SMP kompiuterio architektūrą.

Vis dėl to, būtų neteisinga laikyti šių kompiuterių tinklo pralaidos testų nugalėtoja operacinę sistemą, kuri turėdama daug didesnę plėtotojų ir vartotojų bazę nesugeba deramai palaikyti populiarios bendro pobūdžio x86 aparatinės įrangos (automatizuotą pertraukčių balansavimą). Tuo tarpu mažesnį užnugarį turinti FreeBSD operacinė sistema su ta pačia aparatine įranga susitvarkė pakankamai neblogai.

Kita vertus, vienas iš svarbiausių kompiuterio tinklo kokybinių rodiklių, padedančių įvertinti tinklo ar atskiro jo mazgo spartą, yra paketų delsa – laiko tarpas kurį paketas pralaidžia tinkle. Šiuo atveju buvo fiksuojama delsa tik per vieną kertamą tinklo mazgą, kuri parodo kiek laiko prireikia testuojamai operacinei sistemai apdoroti tinklo paketą. Nespėjau iki galo pilnai patvirtinti delsos rezultatus visuose OS, bet iš to ką mačiau FreeBSD sukeltoji delsa pastebimai mažesnė už Ubuntu Linux sistemos.

Matuodamas tinklo pralaidą kiekvieno testo gale fiksavau ir operatyviosios atminties (sukeitimų skaidinys {swap} buvo išjungtas) sunaudojimą operacinėje sistemoje ir suspėjau surinkti pakankami duomenų, jog drįsčiau jais pasidalinti. Per daug nesismulkinant į atskirus testuotų operacinių sistemų režimus, tarp kurių skirtumas nėra žymus, pateikiu vidutinį jų laisvosios prieigos atminties užimtumą per OS.


Žvelgiant į operacines sistemas iš kitos perspektyvos, jų alkį operatyviajai atminčiai, šį kart Ubuntu atrodo prasčiausiai, tiesą sakant tikras kompiuterio sistemos resursų ėdrūnas. FreeBSD ir OpenBSD po bazinės instaliacijos (be papildomų dietos pastangų) toms pačioms užduotims reikalauja du, tris kartus mažiau laisvosios prieigos atminties. Ir tai nėra Ubuntu Desktop versija, bet resursus taupanti Ubuntu Server distribucija.

Linux nutukimo problemą lemia sukaupti turtai – tvarkyklių ir modulių gausa. Apskritai, nebevaldomas noras Linux sistemą iškelti į stalinių kompiuterių rinką, tokios programinės įrangos kaip Systemd adaptacija ir priklausomybės nuo jos didėjimas Linux ekosistemoje rodo, jog populiariausios Linux distribucijos tolsta nuo Unix filosofijos. Tuo tarpu BSD operacinės sistemos išlieka ištikimos paprastumui – vis dar tiki ir plėtojamos pradine Unix filosofija – lengvai pakeičiama modulinė programinė įranga ir minimalizmas.

Iš tiesų, ypač minimalistinę Linux distribuciją savo reikmėms galima susirinkti ir pačiam, tačiau kas garantuos tavo kūriniui stabilumą, kaip dėl palaikymo kurį galima gauti iš Ubuntu ar Redhat? Kaip sakoma from here you're on your own. Rizikingas žingsnis statyti smėlio pilis produkcinei infrastruktūrai. Todėl šiame tyrime testuojamos tik vientisos ir pilnai išbaigtos operacinės sistemos.

Viską susumavus... FreeBSD rocks



Susumavus visas išvadas galima teigti, jog FreeBSD vis dar išlaiko našiausio tinklo steko titulą tarp kitų nemokamų ir atvirojo kodo operacinių sistemų. Vis dėlto, nesiryžtu per daug atkakliai tvirtinti, jog tai absoliuti ir neginčytina tiesa. Galbūt konfigūruojant sistemas testams buvo ir mano klaidų lėmusių prastesnius rezultatus. Atvirai pripažįstu testavimo metodika turi trūkumų, pvz.: imituojant realybei artimą kompiuterių tinklo situaciją duomenų srautas turėtų sklisti iš daugelio į daugelį skirtingų IP adresų, ar bent jau skirtingus IP adresų prievadus; iperf parankus įrankis tinklo testavimui, tačiau jis negali parodyti kaip tinklo mazgas susitvarko su 1000 ar daugiau vienalaikių tinklo sesijų. Maža to, testuose neleista pasireikšti savajai FreeBSD užkardos sistemai (ipfw), kuri sprendžiant iš Internetų lenkia pasiskolintą pf posisteme savo sparta, galbūt ir nurungti Linux + netfilter.

Idėjų kaip patobulinti testavimo metodiką netrūksta, trūksta tik laiko ir aukštos pralaidos aparatinės įrangos (bent 10G Ethernet) objektyvesniam testavimui. Žinoma, nereiktų nuvertinti ir tai kas buvo atlikta, tiesos mano testavimuose tikrai yra. Jei turit pastabų ar pasiūlymų, galit drąsiai pasireikšti komentarų sekcijoje. Konstruktyvi kritika visada laukiama ir į ją bus atsižvelgta ruošiantis kitiems eksperimentams.

Going BSD style


Neseniai teko perkelti savą Interneto svetainę (martynas.skaringa.dev), bei keletą kitų tinklo tarnybų į naują serverį. Po ilgų skaitymų ir asmeninių testavimų nusprendžiau atsisakyti iki šiol naudotos CentOS operacinės sistemos ir patikėti šį darbą FreeBSD. Sprendimas buvo tik natūralus norint patalpinti savas Interneto paslaugų tarnybas į itin ekonomišką 1 vCPU, 512MB RAM ir 20GB disko talpos VPS serverį, vos už 2,5 $/mėn.


Tokie kuklus serverio ištekliai būtų tikras iššūkis sunkiasvorei CentOS ar Ubuntu operacinei sistemai, tačiau su FreeBSD visa mano serverio sistema tesvėrė kiek daugiau nei 300MB RAM (nenaudojant {swap} skaidinio), vidutinė centrinio procesoriaus apkrova tik 2 proc, o disko talpa su visa programine įranga ir išeities kodu tik 3,2GB. Pasirinkus OpenBSD operacinė sistemą išteklių panaudojimo efektyvumas dar išaugtų, vis dėlto, FreeBSD šiuo atveju man pasirodė tinkamesnis pasirinkimas dėl didesnio lankstumo.

Fanatizmas prie gero nepriveda, bet panašu vis labiau linkstu į tikrosios Unix platformos gretas ir ateityje sąmoningai nepraleisiu progos dislokuoti BSD sistemą ten kur ji adekvati iškeltoms užduotims atlikti, o gal ir tinkamesnė už vis labiau išpūstą pingviną. Vienas iš pagalbininkų šiai misijai vykdyti neabejotinai bus pfSense – itin populiari atvirojo kodo tinklo užkardos sistema – plėtojama FreeBSD + pf operacinės sistemos pagrindu.
Daugiau informacijos apie nemokama ir atvirojo kodo pfSense užkardos sistemą galite surasti mano kitame straipsnyje: pfSense kompiuterių tinklo mazge

Komentarų nėra:

Rašyti komentarą