Linux tīkla lietojumprogrammu veiktspēja. Ievads

TÄ«mekļa lietojumprogrammas tagad tiek izmantotas visur, un starp visiem transporta protokoliem HTTP ieņem lauvas tiesu. Pētot tÄ«mekļa lietojumprogrammu izstrādes nianses, lielākā daļa cilvēku ļoti maz uzmanÄ«bas pievērÅ” operētājsistēmai, kurā Ŕīs lietojumprogrammas faktiski darbojas. Izstrādes (Dev) un operāciju (Ops) nodalÄ«Å”ana situāciju tikai pasliktināja. Taču lÄ«dz ar DevOps kultÅ«ras pieaugumu izstrādātāji kļūst atbildÄ«gi par savu lietojumprogrammu darbināŔanu mākonÄ«, tāpēc viņiem ir ļoti noderÄ«gi rÅ«pÄ«gi iepazÄ«ties ar operētājsistēmas aizmuguri. Tas ir Ä«paÅ”i noderÄ«gi, ja mēģināt izvietot sistēmu tÅ«kstoÅ”iem vai desmitiem tÅ«kstoÅ”u vienlaicÄ«gu savienojumu.

TÄ«mekļa pakalpojumu ierobežojumi ir ļoti lÄ«dzÄ«gi citu lietojumprogrammu ierobežojumiem. NeatkarÄ«gi no tā, vai tie ir slodzes balansētāji vai datu bāzes serveri, visām Ŕīm lietojumprogrammām ir lÄ«dzÄ«gas problēmas augstas veiktspējas vidē. Izpratne par Å”iem pamatierobežojumiem un to pārvarÄ“Å”anu kopumā palÄ«dzēs novērtēt tÄ«mekļa lietojumprogrammu veiktspēju un mērogojamÄ«bu.

Es rakstu Å”o rakstu sēriju, atbildot uz jauno izstrādātāju jautājumiem, kuri vēlas kļūt par labi informētiem sistēmu arhitektiem. Nav iespējams skaidri izprast Linux lietojumprogrammu optimizācijas paņēmienus, neiedziļinoties pamatos, kā tās darbojas operētājsistēmas lÄ«menÄ«. Lai gan ir daudz lietojumprogrammu veidu, Å”ajā sērijā es vēlos izpētÄ«t tÄ«mekļa lietojumprogrammas, nevis darbvirsmas lietojumprogrammas, piemēram, pārlÅ«kprogrammu vai teksta redaktoru. Å is materiāls ir paredzēts izstrādātājiem un arhitektiem, kuri vēlas saprast, kā darbojas Linux vai Unix programmas un kā tās strukturēt, lai nodroÅ”inātu augstu veiktspēju.

Linux ir serveru telpa operētājsistēmu, un visbiežāk jÅ«su lietojumprogrammas darbojas Å”ajā OS. Lai gan es saku "Linux", lielākoties jÅ«s varat droÅ”i pieņemt, ka es domāju visas Unix lÄ«dzÄ«gās operētājsistēmas kopumā. Tomēr es neesmu pārbaudÄ«jis pievienoto kodu citās sistēmās. Tātad, ja jÅ«s interesē FreeBSD vai OpenBSD, jÅ«su rezultāti var atŔķirties. Kad es izmēģinu kaut ko Ä«paÅ”u Linux, es to norādu.

Lai gan varat izmantot Ŕīs zināŔanas, lai izveidotu lietotni no jauna un tā bÅ«s lieliski optimizēta, labāk to nedarÄ«t. Ja savas organizācijas biznesa lietojumprogrammai rakstāt jaunu tÄ«mekļa serveri C vai C++ valodā, Ŕī var bÅ«t jÅ«su pēdējā darba diena. Tomēr Å”o lietojumprogrammu struktÅ«ras pārzināŔana palÄ«dzēs izvēlēties esoŔās programmas. JÅ«s varēsiet salÄ«dzināt uz procesu balstÄ«tas sistēmas ar pavedienu sistēmām, kā arÄ« uz notikumiem balstÄ«tām sistēmām. JÅ«s sapratÄ«sit un novērtēsit, kāpēc Nginx darbojas labāk nekā Apache httpd, kāpēc Tornado balstÄ«ta Python lietojumprogramma var apkalpot vairāk lietotāju, salÄ«dzinot ar Django balstÄ«tu Python lietojumprogrammu.

ZeroHTTPd: mācību rīks

ZeroHTTPd ir tÄ«mekļa serveris, kuru es rakstÄ«ju no jauna C valodā kā mācÄ«bu lÄ«dzekli. Tam nav ārēju atkarÄ«bu, tostarp piekļuves Redis. Mēs paÅ”i veicam Redis procedÅ«ras. PlaŔāku informāciju skatiet tālāk.

Lai gan mēs varētu apspriest teoriju ilgi, nekas nav labāks par koda rakstÄ«Å”anu, palaiÅ”anu un visu serveru arhitektÅ«ras savstarpēju salÄ«dzināŔanu. Å Ä« ir visredzamākā metode. Tāpēc mēs uzrakstÄ«sim vienkārÅ”u ZeroHTTPd tÄ«mekļa serveri, izmantojot katru modeli: procesu, pavedienu un notikumu. ApskatÄ«sim katru no Å”iem serveriem un redzēsim, kā tie darbojas, salÄ«dzinot viens ar otru. ZeroHTTPd ir ieviests vienā C failā. Notikumu serverÄ« ietilpst Uthash, lieliska hash tabulas ievieÅ”ana, kas ir pieejama vienā galvenes failā. Citos gadÄ«jumos atkarÄ«bu nav, lai nesarežģītu projektu.

Kodā ir daudz komentāru, kas palÄ«dz saprast. Tā kā ZeroHTTPd ir vienkārÅ”s tÄ«mekļa serveris dažās koda rindās, tas ir arÄ« minimāls tÄ«mekļa izstrādes ietvars. Tam ir ierobežota funkcionalitāte, taču tā spēj apkalpot statiskus failus un ļoti vienkārÅ”as "dinamiskas" lapas. Man jāsaka, ka ZeroHTTPd ir piemērots, lai iemācÄ«tos izveidot augstas veiktspējas Linux lietojumprogrammas. Kopumā lielākā daļa tÄ«mekļa pakalpojumu gaida pieprasÄ«jumus, pārbauda tos un apstrādā tos. Tas ir tieÅ”i tas, ko ZeroHTTPd darÄ«s. Å is ir rÄ«ks mācÄ«bām, nevis ražoÅ”anai. Tas nav lieliski piemērots kļūdu apstrādē un diez vai var lepoties ar labāko droŔības praksi (ak, jā, es izmantoju strcpy).

Linux tīkla lietojumprogrammu veiktspēja. Ievads
ZeroHTTPd mājas lapa. Tas var izvadīt dažādus failu tipus, tostarp attēlus

Viesu grāmatas pieteikums

MÅ«sdienu tÄ«mekļa lietojumprogrammas parasti neaprobežojas tikai ar statiskiem failiem. Viņiem ir sarežģīta mijiedarbÄ«ba ar dažādām datu bāzēm, keÅ”atmiņām utt. Tāpēc mēs izveidosim vienkārÅ”u tÄ«mekļa lietojumprogrammu ar nosaukumu "Viesu grāmata", kurā apmeklētāji atstāj ierakstus ar saviem vārdiem. Viesu grāmatā glabājas agrāk atstātie ieraksti. Lapas apakŔā ir arÄ« apmeklētāju skaitÄ«tājs.

Linux tīkla lietojumprogrammu veiktspēja. Ievads
Tīmekļa aplikācija "Viesu grāmata" ZeroHTTPd

Apmeklētāju skaitÄ«tājs un viesu grāmatas ieraksti tiek glabāti Redis. Saziņai ar Redis tiek ieviestas savas procedÅ«ras, tās nav atkarÄ«gas no ārējās bibliotēkas. Es neesmu liels homebrew koda izvērÅ”anas cienÄ«tājs, ja ir publiski pieejami un labi pārbaudÄ«ti risinājumi. Bet ZeroHTTPd mērÄ·is ir izpētÄ«t Linux veiktspēju un piekļuvi ārējiem pakalpojumiem, savukārt HTTP pieprasÄ«jumu apkalpoÅ”anai ir nopietna ietekme uz veiktspēju. Mums ir pilnÄ«bā jākontrolē sakari ar Redis katrā mÅ«su servera arhitektÅ«rā. Dažās arhitektÅ«rās mēs izmantojam zvanu bloÄ·Ä“Å”anu, citās - uz notikumiem balstÄ«tas procedÅ«ras. Izmantojot ārējo Redis klienta bibliotēku, Ŕī kontrole netiks nodroÅ”ināta. Turklāt mÅ«su mazais Redis klients veic tikai dažas funkcijas (atslēgas iegÅ«Å”ana, iestatÄ«Å”ana un palielināŔana; masÄ«va iegÅ«Å”ana un pievienoÅ”ana). Turklāt Redis protokols ir ārkārtÄ«gi elegants un vienkārÅ”s. Jums pat tas nav Ä«paÅ”i jāmāca. Pats fakts, ka protokols visu darbu veic aptuveni simts koda rindiņās, parāda, cik tas ir pārdomāts.

Nākamajā attēlā parādīts, ko lietojumprogramma dara, kad klients (pārlūkprogramma) pieprasa /guestbookURL.

Linux tīkla lietojumprogrammu veiktspēja. Ievads
Kā darbojas viesu grāmatas lietojumprogramma

Kad ir jāizdod viesu grāmatas lapa, tiek veikts viens izsaukums failu sistēmai, lai nolasÄ«tu veidni atmiņā, un trÄ«s tÄ«kla zvani uz Redis. Veidnes failā ir lielākā daļa lapas HTML satura, kas parādÄ«ta iepriekÅ” redzamajā ekrānuzņēmumā. Satura dinamiskajai daļai ir arÄ« Ä«paÅ”i vietturi: ziņas un apmeklētāju skaitÄ«tājs. Tos saņemam no Redis, ievietojam lapā un nodroÅ”inām klientam pilnÄ«bā noformētu saturu. Var izvairÄ«ties no treŔā zvana Redis, jo Redis atgriež jauno atslēgas vērtÄ«bu, kad tā tiek palielināta. Tomēr mÅ«su serverim, kuram ir asinhrona uz notikumiem balstÄ«ta arhitektÅ«ra, daudzi tÄ«kla zvani ir labs pārbaudÄ«jums mācÄ«bu nolÅ«kos. Tāpēc mēs atmetam Redis atgrieÅ”anās vērtÄ«bu apmeklētāju skaitam un vaicājam to ar atseviŔķu zvanu.

Serveru arhitektūras ZeroHTTPd

Mēs veidojam septiņas ZeroHTTPd versijas ar vienādu funkcionalitāti, bet atŔķirÄ«gu arhitektÅ«ru:

  • IteratÄ«vs
  • Fork serveris (viens pakārtots process katram pieprasÄ«jumam)
  • Pre-fork serveris (procesu iepriekŔēja dakÅ”a)
  • Serveris ar izpildes pavedieniem (viens pavediens katram pieprasÄ«jumam)
  • Serveris ar pirmspavediena izveidi
  • BalstÄ«ts uz arhitektÅ«ru poll()
  • BalstÄ«ts uz arhitektÅ«ru epoll

Mēs novērtējam katras arhitektūras veiktspēju, ielādējot serveri ar HTTP pieprasījumiem. Bet, salīdzinot ļoti paralēlas arhitektūras, vaicājumu skaits palielinās. Mēs pārbaudām trīs reizes un aprēķinām vidējo.

TestēŔanas metodika

Linux tīkla lietojumprogrammu veiktspēja. Ievads
ZeroHTTPd slodzes pārbaudes iestatīŔana

Ir svarÄ«gi, lai, veicot testus, visas sastāvdaļas nedarbotos vienā un tajā paŔā maŔīnā. Å ajā gadÄ«jumā operētājsistēmai OS rodas papildu plānoÅ”anas izmaksas, jo komponenti sacenÅ”as par centrālo procesoru. Operētājsistēmas izmaksu mērÄ«Å”ana katrai atlasÄ«tajai servera arhitektÅ«rai ir viens no svarÄ«gākajiem Ŕī uzdevuma mērÄ·iem. Vairāk mainÄ«go pievienoÅ”ana kaitēs procesam. Tāpēc vislabāk darbojas iepriekÅ” redzamajā attēlā redzamais iestatÄ«jums.

Ko dara katrs no Ŕiem serveriem?

  • load.unixism.net: Å”eit mēs skrienam ab, Apache Benchmark utilÄ«ta. Tas Ä£enerē slodzi, kas nepiecieÅ”ama mÅ«su serveru arhitektÅ«ras pārbaudei.
  • nginx.unixism.net: dažreiz mēs vēlamies palaist vairāk nekā vienu servera programmas gadÄ«jumu. Lai to izdarÄ«tu, Nginx serveris ar atbilstoÅ”iem iestatÄ«jumiem darbojas kā slodzes lÄ«dzsvarotājs, kas nāk no ab mÅ«su servera procesiem.
  • zerohttpd.unixism.net: Å”eit mēs pa vienai palaižam mÅ«su serveru programmas septiņās dažādās arhitektÅ«rās.
  • redis.unixism.net: Å”is serveris palaiž Redis dēmonu, kurā tiek glabāti viesu grāmatas ieraksti un apmeklētāju skaitÄ«tāji.

Visi serveri darbojas vienā procesora kodolā. Ideja ir novērtēt katras arhitektÅ«ras maksimālo veiktspēju. Tā kā visas serveru programmas tiek pārbaudÄ«tas vienā un tajā paŔā aparatÅ«rā, tas ir salÄ«dzināŔanas pamats. Mana testa iestatÄ«Å”ana sastāv no virtuālajiem serveriem, kas nomāti no Digital Ocean.

Ko mēs mērām?

Varat izmērīt dažādus rādītājus. Mēs novērtējam katras arhitektūras veiktspēju noteiktā konfigurācijā, ielādējot serverus ar pieprasījumiem dažādos paralēlisma līmeņos: slodze pieaug no 20 līdz 15 000 vienlaicīgiem lietotājiem.

Pārbaudes rezultāti

Nākamajā diagrammā parādīta serveru veiktspēja dažādās arhitektūrās dažādos paralēlisma līmeņos. Y ass ir pieprasījumu skaits sekundē, x ass ir paralēli savienojumi.

Linux tīkla lietojumprogrammu veiktspēja. Ievads

Linux tīkla lietojumprogrammu veiktspēja. Ievads

Linux tīkla lietojumprogrammu veiktspēja. Ievads

Zemāk ir tabula ar rezultātiem.

pieprasījumus sekundē

paralēli
iteratīvs
dakŔa
pirmsdakŔa
straumēŔana
iepriekŔēja straumÄ“Å”ana
Aptauja
epoll

20
7
112
2100
1800
2250
1900
2050

50
7
190
2200
1700
2200
2000
2000

100
7
245
2200
1700
2200
2150
2100

200
7
330
2300
1750
2300
2200
2100

300
-
380
2200
1800
2400
2250
2150

400
-
410
2200
1750
2600
2000
2000

500
-
440
2300
1850
2700
1900
2212

600
-
460
2400
1800
2500
1700
2519

700
-
460
2400
1600
2490
1550
2607

800
-
460
2400
1600
2540
1400
2553

900
-
460
2300
1600
2472
1200
2567

1000
-
475
2300
1700
2485
1150
2439

1500
-
490
2400
1550
2620
900
2479

2000
-
350
2400
1400
2396
550
2200

2500
-
280
2100
1300
2453
490
2262

3000
-
280
1900
1250
2502
liela izplatība
2138

5000
-
liela izplatība
1600
1100
2519
-
2235

8000
-
-
1200
liela izplatība
2451
-
2100

10 000
-
-
liela izplatība
-
2200
-
2200

11 000
-
-
-
-
2200
-
2122

12 000
-
-
-
-
970
-
1958

13 000
-
-
-
-
730
-
1897

14 000
-
-
-
-
590
-
1466

15 000
-
-
-
-
532
-
1281

No diagrammas un tabulas var redzēt, ka virs 8000 vienlaicÄ«giem pieprasÄ«jumiem mums ir palikuÅ”i tikai divi spēlētāji: pre-fork un epoll. Palielinoties slodzei, uz aptauju balstÄ«ts serveris darbojas sliktāk nekā straumÄ“Å”anas serveris. Pavedienu pirmsizveides arhitektÅ«ra ir cienÄ«gs epoll konkurents, kas liecina par to, cik labi Linux kodols ieplāno lielu skaitu pavedienu.

ZeroHTTPd avota kods

ZeroHTTPd avota kods Ŕeit. Katrai arhitektūrai ir atseviŔķs direktorijs.

ZeroHTTPd ā”‚ ā”œā”€ā”€ 01_iterative ā”‚ ā”œā”€ā”€ main.c ā”œā”€ā”€ 02_forking ā”‚ ā”œā”€ā”€ main.c ā”œā”€ā”€ 03_preforking ā”€ā”€ 04_preforking ā”€. 05_ vÄ«tņoÅ”ana ā”‚ ā”œā”€ā”€ galvenais.c ā”œā”€ā”€ 06_priekÅ”paveÅ”ana ā”‚ ā”œā”€ā”€ main.c ā”œā”€ā”€ 07_aptauja ā”‚ ā”œā”€ā”€ main.c ā”œā”€ā”€ XNUMX_epoll ā”‚ ā”‚ ā”€ā”€ā”€ Publisks fails.c ā”€ā”€ā”€ā”€ ā”œā”€ā”€ indekss .html ā”‚ ā””ā”€ā”€ tux png ā””ā”€ā”€ veidnes ā””ā”€ā”€ viesu grāmata ā””ā”€ā”€ index.html

Papildus septiņiem visu arhitektÅ«ru direktorijiem augstākā lÄ«meņa direktorijā ir vēl divi: publiskais un veidnes. Pirmajā ir fails index.html un attēls no pirmā ekrānuzņēmuma. Tur varat ievietot citus failus un mapes, un ZeroHTTPd bez problēmām vajadzētu apkalpot Å”os statiskos failus. Ja ceļŔ pārlÅ«kprogrammā sakrÄ«t ar ceļu publiskajā mapē, tad ZeroHTTPd Å”ajā direktorijā meklē failu index.html. Viesu grāmatas saturs tiek Ä£enerēts dinamiski. Tam ir tikai sākumlapa, un tās saturs ir balstÄ«ts uz failu 'templates/guestbook/index.html'. ZeroHTTPd viegli pievieno dinamiskas lapas paplaÅ”ināŔanai. Ideja ir tāda, ka lietotāji var pievienot Å”im direktorijam veidnes un pēc vajadzÄ«bas paplaÅ”ināt ZeroHTTPd.

Lai izveidotu visus septiņus serverus, palaidiet make all no augstākā lÄ«meņa direktorija ā€” un visas bÅ«ves parādÄ«sies Å”ajā direktorijā. Izpildāmie faili meklē publiskos un veidņu direktorijus direktorijā, no kura tie tiek palaisti.

Linux API

Lai saprastu Å”ajā rakstu sērijā sniegto informāciju, jums nav labi jāpārzina Linux API. Tomēr es iesaku lasÄ«t vairāk par Å”o tēmu, internetā ir daudz uzziņu resursu. Lai gan mēs pieskarsimies vairākām Linux API kategorijām, mÅ«su uzmanÄ«ba galvenokārt bÅ«s vērsta uz procesiem, pavedieniem, notikumiem un tÄ«kla steku. Papildus grāmatām un rakstiem par Linux API, es iesaku lasÄ«t arÄ« mana sistēmas izsaukumiem un izmantotajām bibliotēkas funkcijām.

Veiktspēja un mērogojamība

Viena piezÄ«me par veiktspēju un mērogojamÄ«bu. Teorētiski starp tiem nav nekādas saistÄ«bas. Jums var bÅ«t tÄ«mekļa pakalpojums, kas darbojas ļoti labi un ar reakcijas laiku ir dažas milisekundes, taču tas vispār netiek mērogots. Tāpat var bÅ«t slikta tÄ«mekļa lietojumprogramma, kurai ir nepiecieÅ”amas dažas sekundes, lai atbildētu, taču tās mērogs palielinās par desmitiem, lai apstrādātu desmitiem tÅ«kstoÅ”u vienlaicÄ«gu lietotāju. Tomēr augstas veiktspējas un mērogojamÄ«bas kombinācija ir ļoti spēcÄ«ga kombinācija. Augstas veiktspējas lietojumprogrammas parasti izmanto resursus taupÄ«gi un tādējādi efektÄ«vi apkalpo vairāk vienlaikus lietotāju serverÄ«, samazinot izmaksas.

CPU un I/O uzdevumi

Visbeidzot, skaitļoÅ”anā vienmēr ir divi iespējamie uzdevumu veidi: I/O un CPU. PieprasÄ«jumu saņemÅ”ana internetā (tÄ«kla I/O), failu apkalpoÅ”ana (tÄ«kla un diska I/O), saziņa ar datubāzi (tÄ«kls un diska I/O) ir visas I/O darbÄ«bas. Daži datu bāzes vaicājumi var bÅ«t nedaudz CPU intensÄ«vi (ŔķiroÅ”ana, vidējais miljons rezultātu utt.). Lielāko daļu tÄ«mekļa lietojumprogrammu ierobežo maksimālais iespējamais I/O, un procesors tiek reti izmantots ar pilnu jaudu. Ja redzat, ka kāds I/O uzdevums izmanto daudz CPU, tas, visticamāk, liecina par sliktu lietojumprogrammu arhitektÅ«ru. Tas var nozÄ«mēt, ka CPU resursi tiek izŔķiesti procesu pārvaldÄ«bai un konteksta maiņai ā€” un tas nav gluži noderÄ«gi. Ja veicat tādu darbÄ«bu kā attēlu apstrāde, audio failu konvertÄ“Å”ana vai maŔīnmācÄ«Å”anās, lietojumprogrammai ir nepiecieÅ”ami jaudÄ«gi CPU resursi. Bet lielākajai daļai lietojumprogrammu tas tā nav.

Uzziniet vairāk par serveru arhitektūrām

  1. I daļa: Iteratīvā arhitektūra
  2. II daļa. DakŔu serveri
  3. III daļa. Pre-fork serveri
  4. IV daļa. Serveri ar izpildes pavedieniem
  5. V daļa. IepriekÅ” vÄ«tņoti serveri
  6. VI daļa. Pol balstīta arhitektūra
  7. VII daļa. uz epoll balstīta arhitektūra

Avots: www.habr.com

Pievieno komentāru