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).
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.
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.
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
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.
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.
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.