Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni

L-applikazzjonijiet tal-web issa jintużaw kullimkien, u fost il-protokolli kollha tat-trasport, HTTP jokkupa l-akbar sehem. Meta tistudja l-sfumaturi tal-iżvilupp tal-applikazzjoni tal-web, ħafna nies jagħtu ftit li xejn attenzjoni lis-sistema operattiva fejn dawn l-applikazzjonijiet fil-fatt jaħdmu. Is-separazzjoni tal-iżvilupp (Dev) u l-operazzjonijiet (Ops) għamlet biss is-sitwazzjoni agħar. Iżda biż-żieda tal-kultura DevOps, l-iżviluppaturi qed isiru responsabbli biex imexxu l-applikazzjonijiet tagħhom fil-cloud, għalhekk huwa utli ħafna għalihom li jsiru familjari sewwa mal-backend tas-sistema operattiva. Dan huwa speċjalment utli jekk qed tipprova tuża sistema għal eluf jew għexieren ta 'eluf ta' konnessjonijiet simultanji.

Il-limitazzjonijiet fis-servizzi tal-web huma simili ħafna għal dawk f'applikazzjonijiet oħra. Kemm jekk huma load balancers jew servers ta 'databases, dawn l-applikazzjonijiet kollha għandhom problemi simili f'ambjent ta' prestazzjoni għolja. Il-fehim ta' dawn il-limitazzjonijiet fundamentali u kif tegħlebhom b'mod ġenerali jgħinek tevalwa l-prestazzjoni u l-iskalabbiltà tal-applikazzjonijiet tal-web tiegħek.

Qed nikteb din is-serje ta' artikli bi tweġiba għal mistoqsijiet minn żviluppaturi żgħażagħ li jridu jsiru periti tas-sistemi infurmati tajjeb. Huwa impossibbli li wieħed jifhem b'mod ċar it-tekniki tal-ottimizzazzjoni tal-applikazzjoni tal-Linux mingħajr ma jidħol fil-baŜi ta 'kif jaħdmu fil-livell tas-sistema operattiva. Għalkemm hemm ħafna tipi ta 'applikazzjonijiet, f'din is-serje nixtieq nesplora applikazzjonijiet ibbażati fuq il-web aktar milli applikazzjonijiet desktop bħal browser jew editur tat-test. Dan il-materjal huwa maħsub għall-iżviluppaturi u l-periti li jridu jifhmu kif jaħdmu l-programmi Linux jew Unix u kif jistrutturawhom għal prestazzjoni għolja.

Linux huwa kamra tas-server sistema operattiva, u ħafna drabi l-applikazzjonijiet tiegħek jaħdmu fuq dan l-OS. Għalkemm ngħid "Linux", il-biċċa l-kbira tal-ħin tista' tassumi b'mod sikur li nifhem is-sistemi operattivi kollha bħal Unix b'mod ġenerali. Madankollu, ma ttestjajtx il-kodiċi ta' akkumpanjament fuq sistemi oħra. Għalhekk, jekk int interessat fi FreeBSD jew OpenBSD, ir-riżultati tiegħek jistgħu jvarjaw. Meta nipprova xi ħaġa speċifika għal Linux, nirrimarkaha.

Filwaqt li tista 'tuża dan l-għarfien biex tibni app mill-bidu u tkun perfettament ottimizzata, huwa aħjar li ma tagħmilx dan. Jekk tikteb web server ġdid f'C jew C++ għall-applikazzjoni tan-negozju tal-organizzazzjoni tiegħek, din tista' tkun l-aħħar jum tiegħek fuq ix-xogħol. Madankollu, li tkun taf l-istruttura ta 'dawn l-applikazzjonijiet se tgħin fl-għażla ta' programmi eżistenti. Int tkun tista 'tqabbel sistemi bbażati fuq proċess ma' sistemi bbażati fuq ħajt kif ukoll dawk ibbażati fuq avvenimenti. Se tifhem u tapprezza għaliex Nginx jaħdem aħjar minn Apache httpd, għaliex applikazzjoni Python ibbażata fuq Tornado tista 'sservi aktar utenti meta mqabbla ma' applikazzjoni Python ibbażata fuq Django.

ZeroHTTPd: Għodda għat-Tagħlim

ZeroHTTPd huwa web server li ktibt mill-bidu f'C bħala għodda ta' tagħlim. M'għandha l-ebda dipendenzi esterni, inkluż aċċess għal Redis. Aħna nmexxu l-proċeduri Redis tagħna stess. Ara hawn taħt għal aktar dettalji.

Għalkemm nistgħu niddiskutu t-teorija fit-tul, m'hemm xejn aħjar milli tikteb kodiċi, tħaddem, u tqabbel l-arkitetturi kollha tas-server ma 'xulxin. Dan huwa l-aktar metodu ovvju. Għalhekk, se niktbu server web ZeroHTTPd sempliċi billi nużaw kull mudell: ibbażat fuq proċess, ibbażat fuq ħajt u bbażat fuq avveniment. Ejja niċċekkjaw kull wieħed minn dawn is-servers u naraw kif jaħdmu meta mqabbla ma 'xulxin. ZeroHTTPd huwa implimentat f'fajl wieħed C. Is-server ibbażat fuq l-avvenimenti jinkludi uthash, implimentazzjoni ta 'tabella hash kbira li tiġi f'fajl ta' header wieħed. F'każijiet oħra, m'hemm l-ebda dipendenzi, sabiex ma tikkomplikax il-proġett.

Hemm ħafna kummenti fil-kodiċi biex jgħinuk tifhem. Billi huwa server tal-web sempliċi fi ftit linji ta 'kodiċi, ZeroHTTPd huwa wkoll qafas minimu għall-iżvilupp tal-web. Għandha funzjonalità limitata, iżda kapaċi sservi fajls statiċi u paġni "dinamiċi" sempliċi ħafna. Ikolli ngħid li ZeroHTTPd huwa tajjeb biex titgħallem kif toħloq applikazzjonijiet Linux ta 'prestazzjoni għolja. B'mod ġenerali, il-biċċa l-kbira tas-servizzi tal-web jistennew it-talbiet, iċċekkjawhom u jipproċessawhom. Dan huwa eżattament dak li se jagħmel ZeroHTTPd. Din hija għodda għat-tagħlim, mhux il-produzzjoni. Mhux tajjeb ħafna fl-immaniġġjar tal-iżbalji u mhux probabbli li jiftaħar bl-aħjar prattiki tas-sigurtà (oh yeah, użajt strcpy) jew it-tricks għaqlija tal-lingwa C. Imma nittama li jagħmel xogħolha tajjeb.

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni
Home page ZeroHTTPd. Hija tista 'output tipi ta' fajls differenti inklużi stampi

Applikazzjoni Ktieb tal-Mistieden

L-applikazzjonijiet moderni tal-web normalment mhumiex limitati għal fajls statiċi. Huma għandhom interazzjonijiet kumplessi ma 'diversi databases, caches, eċċ. Allura aħna se noħolqu applikazzjoni web sempliċi msejħa "Guest Book" fejn il-viżitaturi jħallu daħliet taħt isimhom. Il-ktieb tal-mistednin jaħżen l-entrati li ħallew qabel. Hemm ukoll counter tal-viżitaturi fil-qiegħ tal-paġna.

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni
Applikazzjoni tal-web "Guest Book" ZeroHTTPd

Il-counter tal-viżitaturi u l-entrati fil-ktieb tal-mistednin huma maħżuna f'Redis. Għal komunikazzjonijiet ma' Redis, huma implimentati proċeduri proprji; ma jiddependux fuq il-librerija esterna. M'iniex fan kbir li nagħmel kodiċi homebrew meta jkun hemm soluzzjonijiet disponibbli pubblikament u ttestjati tajjeb. Iżda l-għan ta 'ZeroHTTPd huwa li jistudja l-prestazzjoni tal-Linux u l-aċċess għal servizzi esterni, filwaqt li s-servizz ta' talbiet HTTP għandu impatt serju fuq il-prestazzjoni. Irridu nikkontrollaw bis-sħiħ il-komunikazzjonijiet ma' Redis f'kull waħda mill-arkitetturi tas-server tagħna. F'xi arkitetturi nużaw sejħiet li jimblokkaw, f'oħrajn nużaw proċeduri bbażati fuq l-avvenimenti. L-użu ta' librerija esterna tal-klijenti Redis mhux se jipprovdi dan il-kontroll. Barra minn hekk, il-klijent żgħir tagħna Redis iwettaq biss ftit funzjonijiet (kiseb, issettjar, u inkrementazzjoni ta 'ċavetta; jkollna u tehmeż ma' firxa). Barra minn hekk, il-protokoll Redis huwa estremament eleganti u sempliċi. Lanqas m’għandek bżonn tgħallemha b’mod speċjali. Il-fatt stess li l-protokoll jagħmel ix-xogħol kollu f'madwar mitt linja ta 'kodiċi juri kemm hu maħsub sew.

Il-figura li ġejja turi x'tagħmel l-applikazzjoni meta l-klijent (browser) jitlob /guestbookURL.

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni
Kif taħdem l-applikazzjoni tal-ktieb tal-mistednin

Meta jeħtieġ li tinħareġ paġna tal-ktieb tal-mistednin, hemm sejħa waħda lis-sistema tal-fajls biex taqra l-mudell fil-memorja u tliet sejħiet tan-netwerk lil Redis. Il-fajl tal-mudell fih ħafna mill-kontenut HTML għall-paġna fil-screenshot hawn fuq. Hemm ukoll placeholders speċjali għall-parti dinamika tal-kontenut: postijiet u counter tal-viżitaturi. Nirċievuhom mingħand Redis, daħħalhom fil-paġna u nipprovdu lill-klijent kontenut iffurmat bis-sħiħ. It-tielet sejħa lil Redis tista 'tiġi evitata minħabba li Redis jirritorna l-valur taċ-ċavetta l-ġdid meta jiżdied. Madankollu, għas-server tagħna, li għandu arkitettura asinkronika bbażata fuq l-avvenimenti, ħafna sejħiet tan-netwerk huma test tajjeb għal skopijiet ta 'tagħlim. Allura aħna narmi l-valur ta 'ritorn Redis tan-numru ta' viżitaturi u mistoqsija b'sejħa separata.

Arkitetturi tas-server ZeroHTTPd

Qed nibnu seba' verżjonijiet ta' ZeroHTTPd bl-istess funzjonalità iżda arkitetturi differenti:

  • Iterattiv
  • Fork server (proċess tifel wieħed għal kull talba)
  • Pre-fork server (pre-fork tal-proċessi)
  • Server b'ħjut ta' eżekuzzjoni (ħajt wieħed għal kull talba)
  • Server bil-ħolqien ta 'pre-thread
  • Ibbażat fuq l-arkitettura poll()
  • Ibbażat fuq l-arkitettura epoll

Aħna nkejlu l-prestazzjoni ta 'kull arkitettura billi tagħbija s-server b'talbiet HTTP. Iżda meta jitqabblu arkitetturi paralleli ħafna, in-numru ta 'mistoqsijiet jiżdied. Aħna nittestjaw tliet darbiet u nikkalkulaw il-medja.

Metodoloġija tal-ittestjar

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni
Setup tal-ittestjar tat-tagħbija ZeroHTTPd

Huwa importanti li meta jsiru t-testijiet, il-komponenti kollha ma jaħdmux fuq l-istess magna. F'dan il-każ, l-OS jeħel overhead ta' skedar addizzjonali hekk kif il-komponenti jikkompetu għas-CPU. Il-kejl tal-overhead tas-sistema operattiva ta 'kull waħda mill-arkitetturi tas-server magħżula huwa wieħed mill-aktar għanijiet importanti ta' dan l-eżerċizzju. Iż-żieda ta 'aktar varjabbli se ssir ta' detriment għall-proċess. Għalhekk, l-issettjar fl-istampa ta 'hawn fuq jaħdem l-aħjar.

X'jagħmel kull wieħed minn dawn is-servers?

  • load.unixism.net: Dan huwa fejn niġru ab, Utilità Apache Benchmark. Jiġġenera t-tagħbija meħtieġa biex jiġu ttestjati l-arkitetturi tas-server tagħna.
  • nginx.unixism.net: Xi drabi rridu nħaddmu aktar minn istanza waħda ta 'programm server. Biex tagħmel dan, is-server Nginx bis-settings xierqa jaħdem bħala load balancer li ġej minn ab għall-proċessi tas-server tagħna.
  • zerohttpd.unixism.net: Hawnhekk inħaddmu l-programmi tas-server tagħna fuq seba’ arkitetturi differenti, waħda kull darba.
  • redis.unixism.net: Dan is-server imexxi d-daemon Redis, fejn jinħażnu l-entrati fil-ktieb tal-mistednin u l-counters tal-viżitaturi.

Is-servers kollha jaħdmu fuq l-istess qalba tal-proċessur. L-idea hija li tiġi evalwata l-prestazzjoni massima ta 'kull arkitettura. Peress li l-programmi kollha tas-server huma ttestjati fuq l-istess ħardwer, din hija linja bażi għat-tqabbil. Is-setup tat-test tiegħi jikkonsisti minn servers virtwali mikrija minn Digital Ocean.

X'qed nkejlu?

Tista 'tkejjel indikaturi differenti. Aħna nevalwaw il-prestazzjoni ta 'kull arkitettura f'konfigurazzjoni partikolari billi tagħbija s-servers b'talbiet f'livelli differenti ta' paralleliżmu: it-tagħbija tikber minn 20 għal 15 utent konkorrenti.

Ir-riżultati tat-test

It-tabella li ġejja turi l-prestazzjoni tas-servers fuq arkitetturi differenti f'livelli differenti ta 'paralleliżmu. L-assi y huwa n-numru ta 'talbiet kull sekonda, l-assi x huwa konnessjonijiet paralleli.

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni

Prestazzjoni tal-applikazzjoni tan-netwerk Linux. Introduzzjoni

Hawn taħt hawn tabella bir-riżultati.

talbiet kull sekonda

paralleliżmu
iterattiv
furketta
pre-furketta
streaming
pre-streaming
poll
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
tixrid kbir
2138

5000
-
tixrid kbir
1600
1100
2519
-
2235

8000
-
-
1200
tixrid kbir
2451
-
2100

10
-
-
tixrid kbir
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Mill-graff u t-tabella wieħed jista’ jara li ‘l fuq minn 8000 talba simultanja fadal biss żewġ plejers: pre-fork u epoll. Hekk kif it-tagħbija tiżdied, server ibbażat fuq il-votazzjoni jagħmel agħar minn wieħed ta' streaming. L-arkitettura ta 'qabel il-ħolqien tal-ħajt hija kompetitur denju li epoll, xhieda ta' kemm il-qalba tal-Linux tiskeda għadd kbir ta 'ħjut.

Kodiċi Sors ZeroHTTPd

Kodiċi Sors ZeroHTTPd hawn. Hemm direttorju separat għal kull arkitettura.

ZeroHTTPd │ ├── 01_iterattiv │ ├── main.c ├── 02_forking │ ├── main.c ├─── 03_preforking │── main. 04_ kamini │ ├── main.c ├── 05_prethreading │ ├── main.c ├── 06_poll │ ├── main.c ├── 07_epoll │ └── main.c ─ Agħmel pubbliku ── ─ fajl main.c ├ ├── indiċi .html │ └── tux . png └── mudelli └── guestbook └── index.html

Minbarra seba' direttorji għall-arkitetturi kollha, hemm tnejn oħra fid-direttorju tal-ogħla livell: pubbliku u mudelli. L-ewwel fih il-fajl index.html u l-immaġni mill-ewwel screenshot. Tista 'tpoġġi fajls u folders oħra hemmhekk, u ZeroHTTPd għandu jservi dawk il-fajls statiċi mingħajr problemi. Jekk il-mogħdija fil-browser taqbel mal-mogħdija fil-folder pubbliku, allura ZeroHTTPd ifittex il-fajl index.html f'dan id-direttorju. Il-kontenut għall-ktieb tal-mistednin huwa ġġenerat b'mod dinamiku. Għandu biss home page, u l-kontenut tiegħu huwa bbażat fuq il-fajl 'templates/guestbook/index.html'. ZeroHTTPd faċilment iżid paġni dinamiċi għall-estensjoni. L-idea hija li l-utenti jistgħu jżidu mudelli ma 'dan id-direttorju u jestendu ZeroHTTPd kif meħtieġ.

Biex tibni s-seba' servers kollha, run make all mid-direttorju tal-ogħla livell - u l-bini kollha se jidhru f'dan id-direttorju. Fajls eżekubbli jfittxu d-direttorji pubbliċi u mudelli fid-direttorju li minnu jkunu mnedija.

Linux API

M'għandekx bżonn tkun kapaċi sew fil-Linux API biex tifhem l-informazzjoni f'din is-serje ta 'artikoli. Madankollu, nirrakkomanda li taqra aktar dwar dan is-suġġett; hemm ħafna riżorsi ta 'referenza fuq l-Internet. Għalkemm se nmissu diversi kategoriji ta 'APIs Linux, l-attenzjoni tagħna se tkun primarjament fuq proċessi, ħjut, avvenimenti, u l-munzell tan-netwerk. Minbarra l-kotba u l-artikoli dwar il-Linux API, nirrakkomanda wkoll li naqra l-mana għas-sejħiet tas-sistema u l-funzjonijiet tal-librerija użati.

Prestazzjoni u Skalabbiltà

Nota waħda dwar il-prestazzjoni u l-iskalabbiltà. Teoretikament, m'hemm l-ebda konnessjoni bejniethom. Jista 'jkollok servizz tal-web li jaħdem tajjeb ħafna, b'ħin ta' rispons ta 'ftit millisekondi, iżda ma jiskala xejn. Bl-istess mod, jista 'jkun hemm applikazzjoni tal-web li taħdem ħażin li tieħu ftit sekondi biex twieġeb, iżda tiskala b'għexieren biex timmaniġġja għexieren ta' eluf ta 'utenti konkorrenti. Madankollu, il-kombinazzjoni ta 'prestazzjoni għolja u skalabbiltà hija kombinazzjoni qawwija ħafna. Applikazzjonijiet ta 'prestazzjoni għolja ġeneralment jużaw ir-riżorsi b'mod kemxejn u b'hekk jaqdu b'mod effiċjenti aktar utenti konkorrenti fuq is-server, u jnaqqsu l-ispejjeż.

Ħidmiet tas-CPU u I/O

Fl-aħħarnett, fl-informatika dejjem hemm żewġ tipi possibbli ta 'kompiti: għal I/O u CPU. Ir-riċeviment ta' talbiet fuq l-Internet (network I/O), li jservu fajls (netwerk u disk I/O), il-komunikazzjoni mad-database (netwerk u disk I/O) huma kollha attivitajiet I/O. Xi mistoqsijiet tad-database jistgħu jkunu daqsxejn CPU intensiv (issortjar, medja ta 'miljun riżultat, eċċ.). Ħafna mill-applikazzjonijiet tal-web huma limitati mill-I/O massimu possibbli, u l-proċessur rarament jintuża fil-kapaċità sħiħa. Meta tara li xi xogħol I/O qed juża ħafna CPU, x'aktarx huwa sinjal ta 'arkitettura ta' applikazzjoni fqira. Dan jista' jfisser li r-riżorsi tas-CPU jinħlew fuq il-ġestjoni tal-proċess u l-bdil tal-kuntest - u dan mhux utli għal kollox. Jekk qed tagħmel xi ħaġa bħall-ipproċessar tal-immaġni, il-konverżjoni tal-fajl awdjo, jew it-tagħlim tal-magni, allura l-applikazzjoni teħtieġ riżorsi CPU qawwija. Iżda għal ħafna applikazzjonijiet dan mhuwiex il-każ.

Tgħallem aktar dwar l-arkitetturi tas-server

  1. Parti I: Arkitettura Iterattiva
  2. Parti II. Servers tal-furketta
  3. Taqsima III. Servers ta' qabel il-furketta
  4. Taqsima IV. Servers b'ħjut ta' eżekuzzjoni
  5. Parti V. Servers pre-threaded
  6. Taqsima VI. Arkitettura bbażata fuq Pol
  7. Taqsima VII. arkitettura bbażata fuq l-epoll

Sors: www.habr.com

Żid kumment