Performansa serîlêdana torê ya Linux. Pêşkêş

Serlêdanên Webê naha li her derê têne bikar anîn, û di nav hemî protokolên veguheztinê de, HTTP para şêr digire. Dema ku nuwazeyên pêşkeftina serîlêdana malperê dixwînin, pir kes pir hindik bala xwe didin pergala xebitandinê ya ku ev serîlêdan bi rastî lê dixebitin. Veqetandina pêşveçûnê (Dev) û operasyonan (Ops) tenê rewş xirabtir kir. Lê bi bilindbûna çanda DevOps re, pêşdebiran dibin berpirsiyar ji bo meşandina serîlêdanên xwe di ewrê de, ji ber vê yekê ji wan re pir bikêr e ku bi paşverûya pergala xebitandinê re bi tevahî nas bibin. Ev bi taybetî bikêr e heke hûn hewl didin ku pergalek ji bo bi hezaran an bi deh hezaran girêdanên hevdemî bicîh bikin.

Sînorên di karûbarên malperê de pir dişibin yên di serîlêdanên din de. Ka ew balansên barkirinê an pêşkêşkerên databasê bin, van hemî serîlêdan di hawîrdorek performansa bilind de pirsgirêkên wekhev hene. Fêmkirina van tixûbên bingehîn û meriv çawa wan bi gelemperî derbas dike dê ji we re bibe alîkar ku hûn performans û pîvana serîlêdanên weba xwe binirxînin.

Ez vê rêze gotaran dinivîsim di bersiva pirsên pêşdebirên ciwan ên ku dixwazin bibin mîmarên pergalên baş agahdar. Ne gengaz e ku meriv bi zelalî teknîkên xweşbînkirina serîlêdana Linux-ê fam bike bêyî ku li bingehên ka ew di asta pergala xebitandinê de çawa dixebitin. Her çend gelek celeb serîlêdan hene jî, di vê rêzê de ez dixwazim li şûna serîlêdanên sermaseyê yên wekî gerokek an edîtorê nivîsê, serîlêdanên web-based keşif bikim. Ev materyal ji bo pêşdebir û mîmarên ku dixwazin fam bikin ka bernameyên Linux an Unix çawa dixebitin û çawa wan ji bo performansa bilind ava dikin tê armanc kirin.

Linux e odeya server pergala xebitandinê, û pir caran serîlêdanên we li ser vê OS-ê dimeşînin. Her çend ez dibêjim "Linux", pir caran hûn dikarin bi ewlehî texmîn bikin ku mebesta min bi gelemperî hemî pergalên xebitandinê yên mîna Unix-ê ye. Lêbelê, min koda pêvek li ser pergalên din ceriband. Ji ber vê yekê, heke hûn bi FreeBSD an OpenBSD re eleqedar in, dibe ku encamên we cûda bibin. Dema ku ez tiştek Linux-taybetî diceribînim, ez wê destnîşan dikim.

Dema ku hûn dikarin vê zanînê bikar bînin da ku serîlêdanek ji sifrê ava bikin û ew ê bêkêmasî were xweşbîn kirin, çêtirîn e ku hûn wiya nekin. Ger hûn ji bo serîlêdana karsaziya rêxistina xwe serverek webê ya nû di C an C++ de binivîsin, dibe ku ev roja weya paşîn be li ser kar. Lêbelê, zanîna strukturên van serlêdanan dê di hilbijartina bernameyên heyî de bibe alîkar. Hûn ê bikaribin pergalên pêvajo-based bi pergalên-based thread-ê û hem jî yên li ser bûyeran re bidin ber hev. Hûn ê fam bikin û binirxînin ka çima Nginx ji Apache httpd çêtir performans dike, çima serîlêdana Python-ya Tornado-yê li gorî serîlêdana Python-a bingehîn a Django dikare bêtir bikarhêneran xizmet bike.

ZeroHTTPd: Amûra Fêrbûnê

ZeroHTTPd serverek malperê ye ku min ji nû ve di C de wekî amûrek hînkirinê nivîsî. Ew ti girêdanên derveyî tune, tevî gihîştina Redis. Em prosedurên xwe yên Redis dimeşînin. Ji bo bêtir agahdarî li jêr binêrin.

Her çend em dikarin teoriyê bi dirêjî nîqaş bikin jî, ji nivîsandina kodê, xebitandina wê û berhevkirina hemî mîmarên serverê bi hev re çêtir tiştek tune. Ev rêbaza herî eşkere ye. Ji ber vê yekê, em ê bi karanîna her modelê serverek malperê ZeroHTTPd-ya hêsan binivîsin:-based-pêvajoyê,-based-based, û-based-bûyerê. Ka em her yek ji van serveran binihêrin û bibînin ka ew li gorî hevûdu çawa dikin. ZeroHTTPd di pelek yek C de tête bicîh kirin. Pêşkêşkara-based bûyer tê de ye uthash, pêkanînek maseya hash a mezin ku di pelek sernavê de tê. Di rewşên din de, ti girêdan tune, da ku projeyê tevlihev nekin.

Di kodê de gelek şîrove hene ku ji we re bibin alîkar ku hûn fam bikin. ZeroHTTPd di çend rêzikên kodê de serverek malperê ya hêsan e, ji bo pêşkeftina malperê jî çarçoveyek hindiktirîn e. Ew xwedan fonksiyonek tixûbdar e, lê dikare pelên statîk û rûpelên "dînamîkî" yên pir hêsan xizmet bike. Divê ez bibêjim ku ZeroHTTPd ji bo fêrbûna çêkirina serîlêdanên Linux-ê yên performansa bilind baş e. Bi gelemperî, piraniya karûbarên malperê li benda daxwazan in, wan kontrol bikin û wan pêvajoyê bikin. Ya ku ZeroHTTPd dê bike ev e. Ev amûrek fêrbûnê ye, ne hilberînê. Ew di birêvebirina xeletiyê de ne pir baş e û ne mimkûn e ku pesnê pratîkên ewlehiyê yên çêtirîn bide (oh erê, min bikar anî strcpy) an jî hîleyên zîrek ên zimanê C. Lê ez hêvî dikim ku ew karê xwe baş bike.

Performansa serîlêdana torê ya Linux. Pêşkêş
Rûpelê malê ZeroHTTPd. Ew dikare cûreyên pelan ên cihêreng tevî wêneyan derxe

Serlêdana Pirtûka Mêvanan

Serlêdanên webê yên nûjen bi gelemperî bi pelên statîk re sînorkirî ne. Têkiliyên wan ên tevlîhev bi databasên cihêreng, cache, hwd re hene. Ji ber vê yekê em ê serîlêdanek webê ya hêsan a bi navê "Pirtûka Mêvanan" ava bikin ku mêvan di bin navên xwe de navnîşan dihêlin. Têketinên pirtûkfiroşên mêvan berê derketin. Di binê rûpelê de jimareyek mêvanan jî heye.

Performansa serîlêdana torê ya Linux. Pêşkêş
Serlêdana malperê "Pirtûka Mêvan" ZeroHTTPd

Hejmara mêvanan û navnîşên pirtûka mêvanan li Redis têne hilanîn. Ji bo danûstandinên bi Redis re, prosedurên xwe têne bicîh kirin; ew bi pirtûkxaneya derveyî ve girêdayî ne. Gava ku çareseriyên gelemperî û baş-ceribandinî hebin, ez ne heyranokek mezin im ku koda homebrew-ê derxînim. Lê mebesta ZeroHTTPd xwendina performansa Linux û gihîştina karûbarên derveyî ye, dema ku xizmetkirina daxwazên HTTP bandorek performansê ya ciddî heye. Pêdivî ye ku em di her mîmariya servera xwe de danûstandinên bi Redis re bi tevahî kontrol bikin. Di hin mîmarî de em bangên astengkirinê bikar tînin, di hinên din de em prosedurên li ser bûyeran bikar tînin. Bikaranîna pirtûkxaneyek xerîdar a Redis a derveyî dê vê kontrolê peyda neke. Wekî din, muwekîlê meya piçûk Redis tenê çend fonksiyonan pêk tîne (destanîn, danîn, û zêdekirina miftekê; girtin û pêvekirina arrayekê). Wekî din, protokola Redis zehf xweşik û hêsan e. Tewra ne hewce ye ku hûn wê bi taybetî hîn bikin. Rastiya ku protokol hemî karan di nav sed rêzikên kodê de dike nîşan dide ku ew çiqas xweş fikirî ye.

Nîgara jêrîn nîşan dide ku dema ku xerîdar (gerok) daxwaz dike serîlêdan çi dike /guestbookURL.

Performansa serîlêdana torê ya Linux. Pêşkêş
Serlêdana pirtûka mêvan çawa dixebite

Dema ku pêdivî ye ku rûpelek pirtûka mêvan were derxistin, yek bang li pergala pelan tê kirin ku şablonê di bîranînê de bixwîne û sê bangên torê ji Redis re. Pelê şablonê piraniya naveroka HTML-ê ya rûpelê di dîmena jorîn de vedihewîne. Ji bo beşa dînamîkî ya naverokê jî cîhgirên taybetî hene: posts û jimareya mêvanan. Em wan ji Redis werdigirin, wan têxin nav rûpelê û naverokek bi tevahî çêkirî ji xerîdar re peyda dikin. Banga sêyemîn ji Redis re dikare were dûr kirin ji ber ku Redis dema ku zêde bibe nirxa mifteya nû vedigerîne. Lêbelê, ji bo servera me, ku xwedan mîmariyek-based bûyerek asynkron e, gelek bangên torê ji bo mebestên fêrbûnê ceribandinek baş in. Ji ber vê yekê em nirxa vegerê ya Redis ya jimara mêvanan radikin û bi bangek cihê jê dipirsin.

Mîmarên serverê ZeroHTTPd

Em heft guhertoyên ZeroHTTPd bi heman fonksiyonê lê mîmariyên cihêreng ava dikin:

  • Iterative
  • Pêşkêşkara Fork (ji her daxwazek pêvajoyek zarokek)
  • Pêşkêşkara pêş-fork (pêş-forkkirina pêvajoyan)
  • Pêşkêşkara bi mijarên înfazê (ji her daxwazê ​​yek mijar)
  • Server bi çêkirina pêş-mijarê
  • Architecture bingeha poll()
  • Architecture bingeha epoll

Em performansa her mîmarî bi barkirina serverê bi daxwazên HTTP dipîvin. Lê dema ku mîmariyên pir paralel têne berhev kirin, hejmara pirsan zêde dibe. Em sê caran ceribandin û navînî hesab dikin.

Methodolojiya ceribandinê

Performansa serîlêdana torê ya Linux. Pêşkêş
Sazkirina ceribandina barkirina ZeroHTTPd

Girîng e ku dema ceribandinan dimeşînin, hemî pêkhate li ser heman makîneyê naçin. Di vê rewşê de, OS ji ber ku pêkhateyên ji bo CPU-yê pêşbaziyê dikin, bernamekirina zêde zêde dike. Pîvandina pergala xebitandinê ya serê her yek ji mîmariya servera bijartî yek ji girîngtirîn armancên vê xebatê ye. Zêdekirina guherbaran dê zirarê bide pêvajoyê. Ji ber vê yekê, mîhengê di wêneya jorîn de çêtirîn dixebite.

Her yek ji van serveran çi dike?

  • load.unixism.net: Li vir em direvin ab, kargêriya Apache Benchmark. Ew barê ku ji bo ceribandina mîmariyên servera me hewce dike çêdike.
  • nginx.unixism.net: Carinan em dixwazin ji yekê zêdetir mînakek bernameyek serverê bimeşînin. Ji bo vê yekê, servera Nginx bi mîhengên guncan re wekî balansek barkirinê ku jê tê dixebite ab pêvajoyên servera me.
  • zerohttpd.unixism.net: Li vir em bernameyên servera xwe li ser heft mîmariyên cihêreng, yek bi yek dimeşînin.
  • redis.unixism.net: Ev server şeyda Redisê dimeşîne, ku têketinên pirtûka mêvanan û hejmarên mêvanan têne hilanîn.

Hemî pêşkêşker li ser heman bingehê pêvajoyê dixebitin. Fikir ev e ku meriv performansa herî zêde ya her mîmarî binirxîne. Ji ber ku hemî bernameyên serverê li ser heman hardware têne ceribandin, ev bingehek ji bo berhevdanê ye. Sazkirina ceribandina min ji serverên virtual yên ku ji Okyanûsa Dîjîtal hatine kirêkirin pêk tê.

Em çi dipîvin?

Hûn dikarin nîşanên cûda bipîvin. Em performansa her mîmarî di veavakirinek diyarkirî de bi barkirina serveran bi daxwazên di astên cihêreng ên paralelîzmê de dinirxînin: barkirin ji 20 ber 15 bikarhênerên hevdemî mezin dibe.

Encamên testê

Nexşeya jêrîn performansa pêşkêşkeran li ser mîmariyên cihêreng di astên cihêreng ên paralelîzmê de nîşan dide. Tebeqeya y hejmara daxwazan di saniyeyê de ye, tebeqeya x jî girêdanên paralel e.

Performansa serîlêdana torê ya Linux. Pêşkêş

Performansa serîlêdana torê ya Linux. Pêşkêş

Performansa serîlêdana torê ya Linux. Pêşkêş

Li jêr tabloyek bi encaman heye.

daxwazên per second

mîqdar
iterative
milêv
pre-fork
streaming
pre-streaming
gelpisî
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
belavbûna mezin
2138

5000
-
belavbûna mezin
1600
1100
2519
-
2235

8000
-
-
1200
belavbûna mezin
2451
-
2100

10
-
-
belavbûna mezin
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Ji grafîk û tabloyê tê dîtin ku li jor 8000 daxwazên hevdem tenê du lîstikvan mane: pre-fork û epoll. Her ku bar zêde dibe, serverek-based anketê ji ya streaming xirabtir dike. Mîmariya Mijara-pêş-afirandinê hevrikek hêja ye ji bo epoll, şahidiyek ji bo ku kernel Linux-ê çiqasî hejmareke mezin ji mijaran plansaz dike.

Koda Çavkaniya ZeroHTTPd

Koda Çavkaniya ZeroHTTPd vir. Ji bo her mîmarî pelrêçek cûda heye.

ZeroHTTPd │ ├── 01_iterative │ ├── sereke.c ├── 02_forking │ ├── sereke.c ├── 03_├── 04_preforking ├──. 05_ threading │ ├── sereke.c ├── Bike ├── index .html │ └── tux . png └── şablon └── pirtûka mêvanan └── index.html

Ji bilî heft pelrêçan ji bo hemî mîmarî, di pelrêça asta jorîn de du kesên din jî hene: giştî û şablon. Ya yekem pelê index.html û wêneyê ji dîmena yekem vedihewîne. Hûn dikarin pel û peldankên din li wir bixin, û ZeroHTTPd divê bêyî pirsgirêk ji wan pelên statîk re xizmet bike. Ger rêça di gerokê de bi riya peldanka giştî re li hev bike, wê hingê ZeroHTTPd li pelê index.html di vê pelrêçê de digere. Naveroka pirtûka mêvanan bi dînamîk tê hilberandin. Ew tenê rûpelek malê heye, û naveroka wê li ser bingeha pelê 'şablon/guestbook/index.html' ye. ZeroHTTPd bi hêsanî rûpelên dînamîkî ji bo dirêjkirinê zêde dike. Fikir ev e ku bikarhêner dikarin şablonan li vê pelrêça zêde bikin û li gorî hewcedariyê ZeroHTTPd dirêj bikin.

Ji bo avakirina her heft pêşkêşkeran, bixebitin make all ji pelrêça asta jorîn - û hemî avahî dê di vê pelrêçê de xuya bibin. Pelên darvekirî di pelrêça ku jê hatî destpêkirin de li pelrêça giştî û şablonan digerin.

Linux API

Hûn ne hewce ne ku hûn di API-ya Linux-ê de baş bizanibin da ku agahdariya di vê rêza gotarê de fam bikin. Lêbelê, ez pêşniyar dikim ku li ser vê mijarê bêtir bixwînin; li ser Înternetê gelek çavkaniyên referansê hene. Her çend em ê li ser çend kategoriyên API-ên Linux-ê bisekinin jî, bala me dê di serî de li ser pêvajo, mijar, bûyer û stûna torê be. Ji bilî pirtûk û gotarên di derbarê API-a Linux-ê de, ez xwendina mana ji bo bangên pergalê û fonksiyonên pirtûkxaneyê jî pêşniyar dikim.

Performansa û Scalability

Nîşeyek di derbarê performans û pîvandinê de. Ji aliyê teorîk ve ti têkiliya wan tune. Hûn dikarin karûbarek webê ya ku pir baş dixebite, bi demek bersivê ya çend milî çirkeyan re hebe, lê ew qet pîvaz nake. Di heman demê de, dibe ku serîlêdanek webê ya nebaş hebe ku bersivê çend saniyeyan digire, lê ew bi dehan hûr dibe ku bi deh hezaran bikarhênerên hevdem re mijûl bibe. Lêbelê, berhevoka performansa bilind û pîvandinê tevliheviyek pir hêzdar e. Serlêdanên performansa bilind bi gelemperî çavkaniyan bi kêmanî bikar tînin û bi vî rengî bi bandorkerî bêtir bikarhênerên hevdem li ser serverê xizmet dikin, lêçûn kêm dikin.

Karên CPU û I / O

Di dawiyê de, di hesabkirinê de her gav du celeb karûbar hene: ji bo I/O û CPU. Wergirtina daxwazan li ser Înternetê (tora I/O), xizmetkirina pelan (tor û dîsk I/O), danûstendina bi databasê re (tor û dîsk I/O) hemî çalakiyên I/O ne. Hin pirsên databasê dikarin hinekî CPU-ya zexm bin (serhevkirin, navînî mîlyonek encam, hwd.). Piraniya serîlêdanên malperê ji hêla I/O ya herî gengaz ve têne sînorkirin, û pêvajo kêm kêm bi kapasîteya tevahî tê bikar anîn. Gava ku hûn dibînin ku hin peywira I/O gelek CPU bikar tîne, ew bi îhtîmalek mezin nîşanek mîmariya serîlêdana belengaz e. Ev dikare were vê wateyê ku çavkaniyên CPU li ser rêveberiya pêvajoyê û guheztina çarçovê winda dibin - û ev bi tevahî ne bikêr e. Ger hûn tiştek wekî pêvajoyek wêneyê, guheztina pelê deng, an fêrbûna makîneyê dikin, wê hingê serîlêdan çavkaniyên CPU-ya hêzdar hewce dike. Lê ji bo piraniya serlêdanan ev ne wusa ye.

Di derbarê mîmariya serverê de bêtir fêr bibin

  1. Beş I: Mîmariya Iterative
  2. Beş II. pêşkêşkerên Fork
  3. Beş III. Pêşkêşkerên fork
  4. Beş IV. Serverên bi mijarên darvekirinê
  5. Beş V. Pêşkêşkerên pêşdibistanê
  6. Beş VI. mîmariya-based Pol
  7. Beş VII. mîmariya-based epoll

Source: www.habr.com

Add a comment