pèfòmans aplikasyon rezo Linux. Entwodiksyon

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.

pèfòmans aplikasyon rezo Linux. Entwodiksyon
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.

pèfòmans aplikasyon rezo Linux. Entwodiksyon
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.

pèfòmans aplikasyon rezo Linux. Entwodiksyon
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

pèfòmans aplikasyon rezo Linux. Entwodiksyon
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.

pèfòmans aplikasyon rezo Linux. Entwodiksyon

pèfòmans aplikasyon rezo Linux. Entwodiksyon

pèfòmans aplikasyon rezo Linux. Entwodiksyon

Anba a se yon tablo ak rezilta yo.

demann pou chak segonn

konkouran
iteratif
fouchèt
pre-fouchèt
difizyon
pre-difizyon
biwo vòt
epol

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
gwo gaye
2138

5000
-
gwo gaye
1600
1100
2519
-
2235

8000
-
-
1200
gwo gaye
2451
-
2100

10
-
-
gwo gaye
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

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.

ZeroHTTPd │ ├── 01_iteratif │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking │── ─── main. 04_ threading │ ├── main.c ├── 05_prethreading │ ├── main.c ├── 06_poll │ ├── main.c ├── 07_epoll │ └── XNUMX_poll │ ├── main.c ├── XNUMX_epoll │ └── └── main.c ─ Fè piblik la ├── endèks .html │ └── tux . png └── modèl └── liv envite └── index.html

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.

Aprann plis sou achitekti sèvè

  1. Pati I: Achitekti iteratif
  2. Pati II. Sèvè fouchèt
  3. Pati III. Serveurs pre-fouchèt
  4. Pati IV. Sèvè ak fil nan ekzekisyon
  5. Pati V. Sèvè pre-threaded
  6. Pati VI. Achitekti ki baze sou Pol
  7. Pati VII. achitekti ki baze sou epoll

Sous: www.habr.com

Add nouvo kòmantè