Aplikasyon entènèt yo kounye a yo itilize toupatou, ak pami tout pwotokòl transpò, HTTP okipe pati lyon an. Lè w ap etidye nuans devlopman aplikasyon entènèt, pifò moun peye anpil atansyon sou sistèm operasyon kote aplikasyon sa yo aktyèlman ap kouri. Separasyon devlopman (Dev) ak operasyon (Ops) sèlman fè sitiyasyon an vin pi mal. Men, ak ogmantasyon nan kilti DevOps, devlopè yo ap vin responsab pou kouri aplikasyon yo nan nwaj la, kidonk li trè itil pou yo vin byen abitye ak backend sistèm opere a. Sa a itil sitou si w ap eseye deplwaye yon sistèm pou plizyè milye oswa dizèn milye koneksyon similtane.
Limit yo nan sèvis entènèt yo sanble anpil ak sa yo nan lòt aplikasyon yo. Kit se balans chaj oswa serveurs baz done, tout aplikasyon sa yo gen pwoblèm menm jan an nan yon anviwònman pèfòmans segondè. Konprann limit fondamantal sa yo ak fason pou simonte yo an jeneral ap ede ou evalye pèfòmans ak évolutivité aplikasyon entènèt ou yo.
Mwen ekri seri atik sa a pou reponn kesyon jèn devlopè yo ki vle vin achitèk sistèm byen enfòme. Li enposib klèman konprann teknik optimize aplikasyon Linux san yo pa plonje nan Basics yo sou fason yo travay nan nivo sistèm operasyon an. Malgre ke gen anpil kalite aplikasyon, nan seri sa a mwen vle eksplore aplikasyon ki baze sou entènèt olye ke aplikasyon pou Desktop tankou yon navigatè oswa editè tèks. Materyèl sa a fèt pou devlopè ak achitèk ki vle konprann ki jan pwogram Linux oswa Unix travay ak kijan pou estriktire yo pou pèfòmans segondè.
Linux se chanm sèvè sistèm operasyon, ak pi souvan aplikasyon ou yo kouri sou eksplwatasyon sa a. Malgre ke mwen di "Linux", pi fò nan tan ou ka san danje asime ke mwen vle di tout sistèm opere Unix-tankou an jeneral. Sepandan, mwen pa te teste kòd akonpayman an sou lòt sistèm yo. Kidonk, si w enterese nan FreeBSD oswa OpenBSD, rezilta ou yo ka varye. Lè mwen eseye yon bagay espesifik Linux, mwen montre li.
Pandan ke ou ka itilize konesans sa a yo bati yon app nan grafouyen epi li pral parfe optimize, li pi bon pa fè sa. Si ou ekri yon nouvo sèvè entènèt nan C oswa C++ pou aplikasyon biznis òganizasyon w lan, sa a ka dènye jou ou nan travay la. Sepandan, konnen estrikti aplikasyon sa yo ap ede nan chwazi pwogram ki egziste deja. Ou pral kapab konpare sistèm ki baze sou pwosesis ak sistèm ki baze sou fil osi byen ke sa ki baze sou evènman yo. Ou pral konprann ak apresye poukisa Nginx fè pi bon pase Apache httpd, poukisa yon aplikasyon Python ki baze sou Tornado ka sèvi plis itilizatè yo konpare ak yon aplikasyon Python ki baze sou Django.
ZeroHTTPd: Zouti Aprantisaj
ZeroHTTPd se yon sèvè entènèt ke mwen te ekri nan grafouyen nan C kòm yon zouti ansèyman. Li pa gen okenn depandans ekstèn, ki gen ladan aksè nan Redis. Nou kouri pwòp pwosedi Redis nou yo. Gade anba a pou plis detay.
Malgre ke nou te kapab diskite sou teyori nan longè, pa gen anyen ki pi bon pase ekri kòd, kouri li, ak konpare tout achitekti sèvè youn ak lòt. Sa a se metòd ki pi evidan. Se poutèt sa, nou pral ekri yon senp sèvè entènèt ZeroHTTPd lè l sèvi avèk chak modèl: ki baze sou pwosesis, ki baze sou fil, ak ki baze sou evènman. Ann tcheke chak nan serveurs sa yo ak wè ki jan yo fè konpare ak lòt. ZeroHTTPd aplike nan yon sèl fichye C. Sèvè ki baze sou evènman an gen ladan l uthash, yon gwo aplikasyon tab hash ki vini nan yon dosye header sèl. Nan lòt ka, pa gen okenn depandans, pou yo pa konplike pwojè a.
Gen anpil kòmantè nan kòd la pou ede w konprann. Lè ou yon senp sèvè entènèt nan kèk liy nan kòd, ZeroHTTPd se tou yon fondasyon minim pou devlopman entènèt. Li gen fonksyonalite limite, men li kapab sèvi fichye estatik ak paj "dinamik" trè senp. Mwen dwe di ke ZeroHTTPd bon pou aprann kijan pou kreye aplikasyon pou Linux pèfòmans-wo. An jeneral, pifò sèvis entènèt yo tann demann, tcheke yo epi trete yo. Sa a se egzakteman sa ZeroHTTPd pral fè. Sa a se yon zouti pou aprann, pa pwodiksyon. Li pa bon nan manyen erè epi li pa fasil pou vante pi bon pratik sekirite (o yeah, mwen te itilize strcpy) oswa ke trik nouvèl yo entelijan nan lang C. Men, mwen espere ke li fè travay li byen.
ZeroHTTPd paj lakay. Li ka pwodiksyon diferan kalite dosye ki gen ladan imaj
Aplikasyon Liv Envite
Aplikasyon entènèt modèn yo anjeneral pa limite a fichye estatik. Yo gen entèraksyon konplèks ak divès baz done, kachèt, elatriye Se konsa, nou pral kreye yon aplikasyon entènèt ki senp ki rele "Guest Book" kote vizitè yo kite antre anba non yo. Liv envite nan magazen antre yo kite pi bonè. Genyen tou yon kontwa vizitè nan pati anba a nan paj la.
Aplikasyon entènèt "Guest Book" ZeroHTTPd
Kontwa vizitè yo ak antre liv envite yo estoke nan Redis. Pou kominikasyon ak Redis, pwosedi pwòp yo aplike; yo pa depann de bibliyotèk ekstèn lan. Mwen pa yon gwo fanatik woule kòd homebrew lè gen solisyon piblik ki disponib ak byen teste. Men, objektif ZeroHTTPd se etidye pèfòmans Linux ak aksè nan sèvis ekstèn, pandan y ap sèvi demann HTTP gen yon enpak grav pèfòmans. Nou dwe konplètman kontwole kominikasyon ak Redis nan chak nan achitekti sèvè nou yo. Nan kèk achitekti nou itilize bloke apèl, nan lòt nou itilize pwosedi ki baze sou evènman. Sèvi ak yon bibliyotèk ekstèn kliyan Redis pa pral bay kontwòl sa a. Anplis de sa, ti kliyan Redis nou an sèlman fè kèk fonksyon (jwenn, mete, ak ogmante yon kle; jwenn ak ajoute nan yon etalaj). Anplis de sa, pwotokòl Redis la trè elegant ak senp. Ou pa menm bezwen espesyalman anseye li. Lefèt ke pwotokòl la fè tout travay la nan apeprè yon santèn liy nan kòd montre kouman li byen panse deyò.
Figi sa a montre sa aplikasyon an fè lè kliyan an (navigatè) mande /guestbookURL.
Ki jan aplikasyon liv envite a ap travay
Lè yon paj liv envite bezwen bay, gen yon apèl nan sistèm nan dosye pou li modèl la nan memwa ak twa apèl rezo a Redis. Fichye modèl la gen pi fò nan kontni HTML pou paj la nan ekran ki anwo a. Genyen tou yon plas espesyal pou pati dinamik kontni an: pòs ak kontwa vizitè yo. Nou resevwa yo nan men Redis, mete yo nan paj la epi bay kliyan an kontni konplètman fòme. Twazyèm apèl Redis la ka evite paske Redis retounen nouvo valè kle a lè yo ogmante. Sepandan, pou sèvè nou an, ki gen yon achitekti evènman asynchrone ki baze sou, yon anpil nan apèl rezo yo se yon bon tès pou rezon aprann. Se konsa, nou jete valè a retounen Redis nan kantite vizitè ak demann li ak yon apèl separe.
Achitekti sèvè ZeroHTTPd
Nou ap bati sèt vèsyon nan ZeroHTTPd ak menm fonksyonalite a men diferan achitekti:
Iteratif
Sèvè Fork (yon pwosesis pitit pou chak demann)
Pre-fork sèvè (pre-fork nan pwosesis)
Sèvè ak fil ekzekisyon (yon fil pou chak demann)
Sèvè ak kreyasyon pre-fil
Achitekti baze poll()
Achitekti baze epoll
Nou mezire pèfòmans chak achitekti pa chaje sèvè a ak demann HTTP. Men, lè konpare achitekti trè paralèl, kantite demann ogmante. Nou teste twa fwa epi kalkile mwayèn la.
Tès metodoloji
Konfigirasyon tès chaj ZeroHTTPd
Li enpòtan ke lè w ap fè tès yo, tout eleman pa kouri sou menm machin nan. Nan ka sa a, eksplwatasyon an antrene plis orè anlè kòm eleman konpetisyon pou CPU. Mezire sistèm operasyon anlè chak nan achitekti sèvè chwazi yo se youn nan objektif ki pi enpòtan nan egzèsis sa a. Ajoute plis varyab pral vin prejidis nan pwosesis la. Se poutèt sa, anviwònman an nan foto ki anwo a ap travay pi byen.
Kisa chak nan serveurs sa yo fè?
load.unixism.net: Sa a se kote nou kouri ab, Apache Benchmark sèvis piblik. Li jenere chaj ki nesesè pou teste achitekti sèvè nou an.
nginx.unixism.net: Pafwa nou vle kouri plis pase yon egzanp nan yon pwogram sèvè. Pou fè sa, sèvè Nginx ak paramèt ki apwopriye yo ap travay kòm yon balanse chaj ki soti ab nan pwosesis sèvè nou an.
zerohttpd.unixism.net: Isit la nou kouri pwogram sèvè nou yo sou sèt achitekti diferan, youn nan yon tan.
redis.unixism.net: Sèvè sa a kouri demon Redis la, kote antre liv envite yo ak kontè vizitè yo estoke.
Tout serveurs kouri sou menm nwayo processeur. Lide a se evalye pèfòmans maksimòm chak achitekti. Depi tout pwogram sèvè yo teste sou pyès ki nan konpitè menm, sa a se yon baz pou konparezon. Konfigirasyon tès mwen an konsiste de serveurs vityèl yo lwe nan Digital Ocean.
Kisa nap mezire?
Ou ka mezire diferan endikatè. Nou evalye pèfòmans chak achitekti nan yon konfigirasyon bay lè nou chaje sèvè yo ak demann nan diferan nivo paralelis: chaj la ap grandi soti nan 20 a 15 itilizatè konkouran.
Rezilta tès yo
Tablo ki anba la a montre pèfòmans sèvè sou diferan achitekti nan diferan nivo paralelis. Y-aks la se kantite demann pou chak segonn, aks x la se koneksyon paralèl.
Soti nan graf la ak tablo ou ka wè ke pi wo a 8000 demann similtane nou gen sèlman de jwè ki rete: pre-fork ak epoll. Kòm chaj la ogmante, yon sèvè ki baze sou biwo vòt fè pi mal pase yon difizyon. Achitekti fil-pre-kreyasyon an se yon konkiran merite pou epoll, yon temwayaj sou kòman nwayo Linux la pwograme yon gwo kantite fil.
ZeroHTTPd Sous Kòd
ZeroHTTPd Sous Kòd isit la. Gen yon anyè separe pou chak achitekti.
Anplis sèt repèrtwar pou tout achitekti, gen de plis nan anyè ki pi wo a: piblik ak modèl. Premye a gen fichye index.html la ak imaj ki soti nan premye ekran an. Ou ka mete lòt dosye ak dosye la, epi ZeroHTTPd ta dwe sèvi fichye estatik sa yo san okenn pwoblèm. Si chemen an nan navigatè a matche ak chemen an nan katab piblik la, Lè sa a, ZeroHTTPd gade pou fichye index.html nan anyè sa a. Se kontni an pou liv envite yo pwodwi dinamik. Li sèlman gen yon paj lakay, ak kontni li yo baze sou dosye a 'templates/guestbook/index.html'. ZeroHTTPd fasil ajoute paj dinamik pou ekstansyon. Lide a se ke itilizatè yo ka ajoute modèl nan anyè sa a epi pwolonje ZeroHTTPd jan sa nesesè.
Pou konstwi tout sèt serveurs, kouri make all soti nan anyè nan nivo siperyè - ak tout bati yo ap parèt nan anyè sa a. Fichye ègzekutabl yo chèche anyè piblik ak modèl yo nan anyè kote yo te lanse a.
Linux API
Ou pa bezwen konn byen nan API Linux pou w konprann enfòmasyon ki nan seri atik sa a. Sepandan, mwen rekòmande li plis sou sijè sa a; gen anpil resous referans sou entènèt la. Malgre ke nou pral manyen plizyè kategori API Linux, konsantre nou pral prensipalman sou pwosesis, fil, evènman, ak pile rezo a. Anplis liv ak atik sou API Linux, mwen rekòmande tou li mana pou apèl sistèm ak fonksyon bibliyotèk yo itilize.
Pèfòmans ak Évolutivité
Yon nòt sou pèfòmans ak évolutivité. Teyorikman, pa gen okenn koneksyon ant yo. Ou ka gen yon sèvis entènèt ki travay trè byen, ak yon tan repons nan kèk milisgond, men li pa echèl ditou. Menm jan an tou, ka gen yon aplikasyon entènèt ki mal fè ki pran kèk segonn pou reponn, men li balanse pa dizèn pou okipe plizyè dizèn de milye itilizatè konkouran. Sepandan, konbinezon an nan pèfòmans segondè ak évolutivité se yon konbinezon trè pwisan. Aplikasyon ki wo-pèfòmans jeneralman itilize resous ti kras epi konsa avèk efikasite sèvi itilizatè plis konkouran sou sèvè a, diminye depans yo.
CPU ak travay I/O
Finalman, nan informatique toujou gen de kalite travay posib: pou I/O ak CPU. Resevwa demann sou Entènèt (rezo I/O), sèvi fichye (rezo ak disk I/O), kominike avèk baz done a (rezo ak disk I/O) se tout aktivite I/O. Gen kèk demann baz done ka yon ti jan CPU entansif (triye, mwayèn yon milyon rezilta, elatriye). Pifò aplikasyon entènèt yo limite pa maksimòm I/O posib, ak processeur a raman itilize nan kapasite plen. Lè ou wè ke kèk travay I/O ap itilize yon anpil nan CPU, li gen plis chans yon siy achitekti aplikasyon pòv. Sa ka vle di ke resous CPU yo gaspiye sou jesyon pwosesis ak chanje kontèks - e sa a pa totalman itil. Si w ap fè yon bagay tankou pwosesis imaj, konvèsyon dosye odyo, oswa aprantisaj machin, Lè sa a, aplikasyon an mande pou resous CPU pwisan. Men, pou pifò aplikasyon sa a se pa ka a.