Utendaji wa programu ya mtandao wa Linux. Utangulizi

Programu za wavuti sasa zinatumika kila mahali, na kati ya itifaki zote za usafirishaji, HTTP inachukua sehemu kubwa. Wakati wa kusoma nuances ya ukuzaji wa programu ya wavuti, watu wengi huzingatia kidogo sana mfumo wa uendeshaji ambapo programu hizi zinaendesha. Kutenganishwa kwa maendeleo (Dev) na shughuli (Ops) kulifanya hali kuwa mbaya zaidi. Lakini kutokana na kuongezeka kwa utamaduni wa DevOps, watengenezaji wanakuwa na jukumu la kuendesha programu zao kwenye wingu, kwa hivyo ni muhimu sana kwao kufahamiana kabisa na nyuma ya mfumo wa uendeshaji. Hii ni muhimu sana ikiwa unajaribu kupeleka mfumo kwa maelfu au makumi ya maelfu ya miunganisho ya wakati mmoja.

Mapungufu katika huduma za wavuti ni sawa na yale ya programu zingine. Iwe ni visawazishaji vya upakiaji au seva za hifadhidata, programu hizi zote zina matatizo sawa katika mazingira ya utendakazi wa juu. Kuelewa mapungufu haya ya kimsingi na jinsi ya kuyashinda kwa ujumla kutakusaidia kutathmini utendakazi na upanuzi wa programu zako za wavuti.

Ninaandika mfululizo huu wa makala kujibu maswali kutoka kwa watengenezaji wachanga ambao wanataka kuwa wasanifu wa mifumo wenye ufahamu. Haiwezekani kuelewa kwa uwazi mbinu za uboreshaji wa matumizi ya Linux bila kupiga mbizi katika misingi ya jinsi inavyofanya kazi katika kiwango cha mfumo wa uendeshaji. Ingawa kuna aina nyingi za programu, katika mfululizo huu ninataka kuchunguza programu zinazotegemea wavuti badala ya programu za kompyuta ya mezani kama vile kivinjari au kihariri maandishi. Nyenzo hii imekusudiwa wasanidi programu na wasanifu ambao wanataka kuelewa jinsi programu za Linux au Unix zinavyofanya kazi na jinsi ya kuziunda kwa utendakazi wa hali ya juu.

Linux ni chumba cha seva mfumo wa uendeshaji, na mara nyingi programu zako huendeshwa kwenye OS hii. Ingawa nasema "Linux", wakati mwingi unaweza kudhani kwa usalama kuwa ninamaanisha mifumo yote ya uendeshaji kama Unix kwa ujumla. Walakini, sijajaribu nambari inayoambatana kwenye mifumo mingine. Kwa hivyo, ikiwa ungependa FreeBSD au OpenBSD, matokeo yako yanaweza kutofautiana. Ninapojaribu kitu mahususi cha Linux, ninakielekeza.

Ingawa unaweza kutumia maarifa haya kuunda programu kutoka mwanzo na itaboreshwa kikamilifu, ni bora kutofanya hivyo. Ukiandika seva mpya ya wavuti katika C au C++ kwa ajili ya maombi ya biashara ya shirika lako, hii inaweza kuwa siku yako ya mwisho kwenye kazi. Hata hivyo, kujua muundo wa maombi haya itasaidia katika kuchagua programu zilizopo. Utaweza kulinganisha mifumo inayotegemea mchakato na mifumo inayotegemea nyuzi na vile vile inayotegemea matukio. Utaelewa na kufahamu kwa nini Nginx hufanya vizuri zaidi kuliko Apache httpd, kwa nini programu ya Tornado based Python inaweza kuhudumia watumiaji zaidi ikilinganishwa na programu ya Python ya Django.

ZeroHTTPd: Zana ya Kujifunza

ZeroHTTPd ni seva ya wavuti ambayo niliandika kutoka mwanzo katika C kama zana ya kufundishia. Haina tegemezi za nje, pamoja na ufikiaji wa Redis. Tunaendesha taratibu zetu za Redis. Tazama hapa chini kwa maelezo zaidi.

Ingawa tunaweza kujadili nadharia kwa urefu, hakuna kitu bora kuliko kuandika nambari, kuiendesha, na kulinganisha usanifu wote wa seva na kila mmoja. Hii ndiyo njia iliyo wazi zaidi. Kwa hivyo, tutaandika seva rahisi ya wavuti ya ZeroHTTPd kwa kutumia kila modeli: msingi wa mchakato, msingi wa nyuzi, na msingi wa hafla. Wacha tuangalie kila seva hizi na tuone jinsi zinavyofanya kazi ikilinganishwa na zingine. ZeroHTTPd inatekelezwa katika faili moja C. Seva ya matukio inajumuisha uthash, utekelezaji mzuri wa jedwali la hashi ambao huja katika faili moja ya kichwa. Katika hali nyingine, hakuna utegemezi, ili usiwe na ugumu wa mradi.

Kuna maoni mengi katika msimbo ili kukusaidia kuelewa. Kwa kuwa seva rahisi ya wavuti katika mistari michache ya msimbo, ZeroHTTPd pia ni mfumo mdogo wa ukuzaji wa wavuti. Ina utendakazi mdogo, lakini ina uwezo wa kutumikia faili tuli na kurasa rahisi sana za "nguvu". Lazima niseme kwamba ZeroHTTPd ni nzuri kwa kujifunza jinsi ya kuunda programu za Linux zenye utendaji wa juu. Kwa ujumla, huduma nyingi za wavuti husubiri maombi, yaangalie na kuyashughulikia. Hivi ndivyo ZeroHTTPd itafanya. Hii ni zana ya kujifunza, sio uzalishaji. Sio nzuri katika kushughulikia makosa na hakuna uwezekano wa kujivunia mazoea bora ya usalama (oh ndio, nilitumia strcpy) au ujanja wa lugha ya C. Lakini natumai itafanya kazi yake vyema.

Utendaji wa programu ya mtandao wa Linux. Utangulizi
Ukurasa wa nyumbani wa ZeroHTTPd. Inaweza kutoa aina tofauti za faili ikiwa ni pamoja na picha

Maombi ya Kitabu cha Wageni

Programu za kisasa za wavuti kwa kawaida hazizuiliwi na faili tuli. Wana mwingiliano changamano na hifadhidata mbalimbali, akiba, n.k. Kwa hivyo tutaunda programu rahisi ya wavuti inayoitwa "Kitabu cha Wageni" ambapo wageni huacha maingizo chini ya majina yao. Vitabu vya wageni huhifadhi maingizo yaliyoachwa mapema. Pia kuna kaunta ya wageni chini ya ukurasa.

Utendaji wa programu ya mtandao wa Linux. Utangulizi
Programu ya wavuti "Kitabu cha Wageni" ZeroHTTPd

Kaunta ya wageni na maingizo ya kitabu cha wageni yanahifadhiwa katika Redis. Kwa mawasiliano na Redis, taratibu za kibinafsi zinatekelezwa; hazitegemei maktaba ya nje. Mimi si shabiki mkubwa wa kusambaza msimbo wa pombe ya nyumbani wakati kuna suluhisho zinazopatikana hadharani na zilizojaribiwa vizuri. Lakini madhumuni ya ZeroHTTPd ni kusoma utendaji wa Linux na ufikiaji wa huduma za nje, huku kutumikia maombi ya HTTP kuna athari kubwa ya utendaji. Lazima tudhibiti kikamilifu mawasiliano na Redis katika kila usanifu wa seva zetu. Katika baadhi ya usanifu tunatumia kuzuia simu, kwa wengine tunatumia taratibu zinazotegemea matukio. Kutumia maktaba ya mteja wa Redis ya nje haitatoa udhibiti huu. Zaidi ya hayo, mteja wetu mdogo wa Redis hufanya kazi chache tu (kupata, kuweka, na kuongeza ufunguo; kupata na kuambatanisha kwa safu). Kwa kuongeza, itifaki ya Redis ni ya kifahari sana na rahisi. Hauitaji hata kuifundisha haswa. Ukweli kwamba itifaki hufanya kazi yote katika safu mia moja ya nambari inaonyesha jinsi inavyofikiriwa vizuri.

Kielelezo kifuatacho kinaonyesha kile programu hufanya mteja (kivinjari) anapoomba /guestbookURL.

Utendaji wa programu ya mtandao wa Linux. Utangulizi
Jinsi maombi ya kitabu cha wageni yanavyofanya kazi

Wakati ukurasa wa kitabu cha wageni unahitajika kutolewa, kuna simu moja kwa mfumo wa faili ili kusoma kiolezo kwenye kumbukumbu na simu tatu za mtandao kwa Redis. Faili ya kiolezo ina maudhui mengi ya HTML ya ukurasa katika picha ya skrini hapo juu. Pia kuna vishikilia nafasi maalum kwa sehemu inayobadilika ya maudhui: machapisho na kaunta ya wageni. Tunazipokea kutoka kwa Redis, kuziingiza kwenye ukurasa na kumpa mteja maudhui yaliyoundwa kikamilifu. Simu ya tatu kwa Redis inaweza kuepukwa kwa sababu Redis hurejesha thamani mpya ya ufunguo inapoongezwa. Hata hivyo, kwa seva yetu, ambayo ina usanifu wa msingi wa matukio usiolingana, simu nyingi za mtandao ni mtihani mzuri kwa madhumuni ya kujifunza. Kwa hivyo tunatupa dhamana ya kurudi kwa Redis ya idadi ya wageni na kuihoji kwa simu tofauti.

Usanifu wa seva ZeroHTTPd

Tunaunda matoleo saba ya ZeroHTTPd yenye utendaji sawa lakini usanifu tofauti:

  • Inarudia
  • Seva ya uma (mchakato wa mtoto mmoja kwa kila ombi)
  • Seva ya pre-fork (pre-forking of process)
  • Seva iliyo na nyuzi za utekelezaji (nyuzi moja kwa kila ombi)
  • Seva iliyo na uundaji wa nyuzi kabla
  • Msingi wa usanifu poll()
  • Msingi wa usanifu epoll

Tunapima utendaji wa kila usanifu kwa kupakia seva na maombi ya HTTP. Lakini wakati wa kulinganisha usanifu unaofanana sana, idadi ya maswali huongezeka. Tunajaribu mara tatu na kuhesabu wastani.

Mbinu ya majaribio

Utendaji wa programu ya mtandao wa Linux. Utangulizi
Usanidi wa majaribio ya upakiaji wa ZeroHTTPd

Ni muhimu kwamba wakati wa kufanya vipimo, vipengele vyote havifanyiki kwenye mashine moja. Katika hali hii, Mfumo wa Uendeshaji huleta upangaji wa ziada kwani vipengele vinashindana kwa CPU. Kupima mfumo wa uendeshaji juu ya kila moja ya usanifu wa seva iliyochaguliwa ni mojawapo ya malengo muhimu zaidi ya zoezi hili. Kuongeza vigeu zaidi kutaathiri mchakato. Kwa hiyo, mpangilio katika picha hapo juu hufanya kazi vizuri zaidi.

Je, kila moja ya seva hizi hufanya nini?

  • load.unixism.net: Hapa ndipo tunapoendesha ab, matumizi ya Apache Benchmark. Inazalisha mzigo unaohitajika ili kujaribu usanifu wetu wa seva.
  • nginx.unixism.net: Wakati mwingine tunataka kuendesha zaidi ya mfano mmoja wa programu ya seva. Ili kufanya hivyo, seva ya Nginx iliyo na mipangilio inayofaa hufanya kazi kama mizani ya mzigo inayotoka ab kwa michakato yetu ya seva.
  • zerohttpd.unixism.net: Hapa tunaendesha programu zetu za seva kwenye usanifu saba tofauti, mmoja baada ya mwingine.
  • redis.unixism.net: Seva hii inaendesha daemon ya Redis, ambapo maingizo ya kitabu cha wageni na vihesabio vya wageni huhifadhiwa.

Seva zote zinaendesha kwenye msingi sawa wa processor. Wazo ni kutathmini utendaji wa juu wa kila usanifu. Kwa kuwa programu zote za seva zinajaribiwa kwenye vifaa sawa, hii ni msingi wa kulinganisha. Usanidi wangu wa majaribio una seva pepe zilizokodiwa kutoka Digital Ocean.

Je, tunapima nini?

Unaweza kupima viashiria tofauti. Tunatathmini utendakazi wa kila usanifu katika usanidi fulani kwa kupakia seva na maombi katika viwango tofauti vya ulinganifu: mzigo hukua kutoka kwa watumiaji 20 hadi 15 wanaotumia wakati mmoja.

Matokeo ya Uchunguzi

Chati ifuatayo inaonyesha utendaji wa seva kwenye usanifu tofauti katika viwango tofauti vya ulinganifu. Mhimili wa y ni idadi ya maombi kwa sekunde, mhimili wa x ni miunganisho inayofanana.

Utendaji wa programu ya mtandao wa Linux. Utangulizi

Utendaji wa programu ya mtandao wa Linux. Utangulizi

Utendaji wa programu ya mtandao wa Linux. Utangulizi

Chini ni jedwali na matokeo.

maombi kwa sekunde

concurrency
ya kurudia
uma
kabla ya uma
kutiririka
kutiririsha kabla
uchaguzi
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
kuenea kubwa
2138

5000
-
kuenea kubwa
1600
1100
2519
-
2235

8000
-
-
1200
kuenea kubwa
2451
-
2100

10
-
-
kuenea kubwa
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

Kutoka kwa grafu na jedwali inaweza kuonekana kuwa zaidi ya maombi 8000 ya wakati mmoja tuna wachezaji wawili tu waliosalia: pre-fork na epoll. Upakiaji unapoongezeka, seva inayotegemea kura ya maoni hufanya vibaya zaidi kuliko utiririshaji. Usanifu wa uundaji wa nyuzi kabla ya kuunda ni mshindani anayefaa wa epoll, ushahidi wa jinsi kernel ya Linux inavyopanga idadi kubwa ya nyuzi.

Msimbo wa Chanzo cha ZeroHTTPd

Msimbo wa Chanzo cha ZeroHTTPd hapa. Kuna saraka tofauti kwa kila usanifu.

ZeroHTTPd │ ├── 01_iterative │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking │││ kuu │││ │ kuu kuunganisha │ ├── main.c ├── 04_kusoma kabla │ ├── kuu.c ├── 05_kura │ ├── kuu.c ├── 06_epoll │ └── main.c ─ Faili kuu ─ ─ ─ ─ ├── index .html │ └── tux png └── violezo └── kitabu cha wageni └── index.html

Mbali na saraka saba za usanifu wote, kuna mbili zaidi kwenye saraka ya kiwango cha juu: umma na violezo. Ya kwanza ina faili ya index.html na picha kutoka kwa picha ya skrini ya kwanza. Unaweza kuweka faili na folda zingine hapo, na ZeroHTTPd inapaswa kutumikia faili hizo tuli bila shida yoyote. Ikiwa njia katika kivinjari inalingana na njia kwenye folda ya umma, basi ZeroHTTPd inatafuta faili ya index.html kwenye saraka hii. Maudhui ya kitabu cha wageni yanazalishwa kwa nguvu. Ina ukurasa wa nyumbani pekee, na maudhui yake yanatokana na faili 'templates/guestbook/index.html'. ZeroHTTPd huongeza kwa urahisi kurasa zinazobadilika kwa ugani. Wazo ni kwamba watumiaji wanaweza kuongeza violezo kwenye saraka hii na kupanua ZeroHTTPd inavyohitajika.

Ili kuunda seva zote saba, endesha make all kutoka kwa saraka ya kiwango cha juu - na muundo wote utaonekana kwenye saraka hii. Faili zinazoweza kutekelezwa hutafuta saraka za umma na violezo kwenye saraka ambako zimezinduliwa.

Linux API

Huhitaji kufahamu vyema API ya Linux ili kuelewa maelezo katika mfululizo wa makala haya. Walakini, napendekeza kusoma zaidi juu ya mada hii; kuna rasilimali nyingi za kumbukumbu kwenye mtandao. Ingawa tutagusa kategoria kadhaa za API za Linux, lengo letu litakuwa hasa kwenye michakato, nyuzi, matukio na safu ya mtandao. Mbali na vitabu na makala kuhusu API ya Linux, ninapendekeza pia kusoma mana kwa simu za mfumo na vipengele vya maktaba vinavyotumika.

Utendaji na Scalability

Dokezo moja kuhusu utendaji na scalability. Kinadharia, hakuna uhusiano kati yao. Unaweza kuwa na huduma ya wavuti ambayo inafanya kazi vizuri sana, na muda wa majibu wa milisekunde chache, lakini haina ukubwa hata kidogo. Vile vile, kunaweza kuwa na programu ya wavuti isiyofanya kazi vizuri ambayo inachukua sekunde chache kujibu, lakini inakua kwa makumi ili kushughulikia makumi ya maelfu ya watumiaji wanaotumia wakati mmoja. Hata hivyo, mchanganyiko wa utendaji wa juu na scalability ni mchanganyiko wenye nguvu sana. Programu zenye utendakazi wa hali ya juu kwa ujumla hutumia rasilimali kwa uangalifu na hivyo hutumikia kwa ufanisi watumiaji wanaotumia wakati mmoja kwenye seva, hivyo kupunguza gharama.

Kazi za CPU na I/O

Hatimaye, katika kompyuta daima kuna aina mbili zinazowezekana za kazi: kwa I / O na CPU. Kupokea maombi kupitia Mtandao (mtandao wa I/O), kuhudumia faili (mtandao na diski I/O), kuwasiliana na hifadhidata (mtandao na diski I/O) zote ni shughuli za I/O. Baadhi ya maswali ya hifadhidata yanaweza kuwa ya kina kidogo ya CPU (kupanga, wastani wa matokeo milioni, nk.). Programu nyingi za wavuti hupunguzwa na kiwango cha juu cha I/O kinachowezekana, na kichakataji hakitumiki kwa uwezo kamili. Unapoona kuwa kazi fulani ya I/O inatumia CPU nyingi, kuna uwezekano mkubwa kuwa ni ishara ya usanifu duni wa programu. Hii inaweza kumaanisha kuwa rasilimali za CPU zinapotea kwenye usimamizi wa mchakato na kubadilisha muktadha - na hii sio muhimu kabisa. Ikiwa unafanya kitu kama vile kuchakata picha, kubadilisha faili za sauti, au kujifunza kwa mashine, basi programu inahitaji rasilimali zenye nguvu za CPU. Lakini kwa programu nyingi hii sivyo.

Pata maelezo zaidi kuhusu usanifu wa seva

  1. Sehemu ya I: Usanifu wa Kurudia
  2. Sehemu ya II. Seva za uma
  3. Sehemu ya III. Seva za kabla ya uma
  4. Sehemu ya IV. Seva zilizo na nyuzi za utekelezaji
  5. Sehemu ya V. Seva zilizounganishwa mapema
  6. Sehemu ya VI. Usanifu wa msingi wa Pol
  7. Sehemu ya VII. usanifu wa msingi wa epoll

Chanzo: mapenzi.com

Kuongeza maoni