Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd

Mae cymwysiadau gwe bellach yn cael eu defnyddio ym mhobman, ac ymhlith yr holl brotocolau trafnidiaeth, mae HTTP yn meddiannu cyfran y llew. Wrth astudio naws datblygu cymwysiadau gwe, ychydig iawn o sylw y mae'r rhan fwyaf o bobl yn ei dalu i'r system weithredu lle mae'r cymwysiadau hyn yn rhedeg mewn gwirionedd. Roedd gwahanu datblygiad (Dev) a gweithrediadau (Ops) ond yn gwaethygu'r sefyllfa. Ond gyda thwf diwylliant DevOps, mae datblygwyr yn dod yn gyfrifol am redeg eu cymwysiadau yn y cwmwl, felly mae'n ddefnyddiol iawn iddynt ddod yn gwbl gyfarwydd â chefn y system weithredu. Mae hyn yn arbennig o ddefnyddiol os ydych chi'n ceisio defnyddio system ar gyfer miloedd neu ddegau o filoedd o gysylltiadau cydamserol.

Mae'r cyfyngiadau mewn gwasanaethau gwe yn debyg iawn i'r rhai mewn cymwysiadau eraill. P'un a yw'n gydbwyswyr llwyth neu'n weinyddion cronfa ddata, mae gan bob un o'r cymwysiadau hyn broblemau tebyg mewn amgylchedd perfformiad uchel. Bydd deall y cyfyngiadau sylfaenol hyn a sut i'w goresgyn yn gyffredinol yn eich helpu i werthuso perfformiad a scalability eich cymwysiadau gwe.

Rwy'n ysgrifennu'r gyfres hon o erthyglau mewn ymateb i gwestiynau gan ddatblygwyr ifanc sydd am ddod yn benseiri systemau gwybodus. Mae'n amhosibl deall technegau optimeiddio cymhwysiad Linux yn glir heb blymio i mewn i'r pethau sylfaenol o sut maen nhw'n gweithio ar lefel y system weithredu. Er bod llawer o fathau o gymwysiadau, yn y gyfres hon rwyf am archwilio cymwysiadau ar y we yn hytrach na chymwysiadau bwrdd gwaith fel porwr neu olygydd testun. Mae'r deunydd hwn wedi'i fwriadu ar gyfer datblygwyr a phenseiri sydd am ddeall sut mae rhaglenni Linux neu Unix yn gweithio a sut i'w strwythuro ar gyfer perfformiad uchel.

Mae Linux ystafell gweinydd system weithredu, ac yn fwyaf aml mae eich cymwysiadau yn rhedeg ar yr OS hwn. Er fy mod yn dweud "Linux", y rhan fwyaf o'r amser gallwch chi dybio'n ddiogel fy mod yn golygu pob system weithredu tebyg i Unix yn gyffredinol. Fodd bynnag, nid wyf wedi profi’r cod cysylltiedig ar systemau eraill. Felly, os oes gennych ddiddordeb mewn FreeBSD neu OpenBSD, gall eich canlyniadau amrywio. Pan fyddaf yn rhoi cynnig ar rywbeth Linux-benodol, yr wyf yn tynnu sylw ato.

Er y gallwch chi ddefnyddio'r wybodaeth hon i adeiladu app o'r dechrau a bydd wedi'i optimeiddio'n berffaith, mae'n well peidio â gwneud hynny. Os ydych chi'n ysgrifennu gweinydd gwe newydd yn C neu C ++ ar gyfer cais busnes eich sefydliad, efallai mai hwn yw eich diwrnod olaf yn y swydd. Fodd bynnag, bydd gwybod strwythur y cymwysiadau hyn yn helpu i ddewis rhaglenni presennol. Byddwch yn gallu cymharu systemau sy'n seiliedig ar broses â systemau sy'n seiliedig ar edau yn ogystal â rhai sy'n seiliedig ar ddigwyddiadau. Byddwch yn deall ac yn gwerthfawrogi pam mae Nginx yn perfformio'n well nag Apache httpd, pam y gall cymhwysiad Python seiliedig ar Tornado wasanaethu mwy o ddefnyddwyr o'i gymharu â chymhwysiad Python yn seiliedig ar Django.

ZeroHTTPd: Offeryn Dysgu

SeroHTTPd yn weinydd gwe a ysgrifennais o'r dechrau yn C fel offeryn addysgu. Nid oes ganddo unrhyw ddibyniaethau allanol, gan gynnwys mynediad i Redis. Rydym yn rhedeg ein gweithdrefnau Redis ein hunain. Gweler isod am ragor o fanylion.

Er y gallem drafod theori yn helaeth, nid oes dim byd gwell nag ysgrifennu cod, ei redeg, a chymharu holl saernïaeth y gweinydd â'i gilydd. Dyma'r dull mwyaf amlwg. Felly, byddwn yn ysgrifennu gweinydd gwe ZeroHTTPd syml gan ddefnyddio pob model: yn seiliedig ar broses, yn seiliedig ar edau, ac yn seiliedig ar ddigwyddiadau. Gadewch i ni edrych ar bob un o'r gweinyddwyr hyn a gweld sut maen nhw'n perfformio o gymharu â'i gilydd. Gweithredir ZeroHTTPd mewn un ffeil C. Mae'r gweinydd sy'n seiliedig ar ddigwyddiad yn cynnwys uthash, gweithredu tabl hash gwych sy'n dod mewn ffeil pennawd sengl. Mewn achosion eraill, nid oes unrhyw ddibyniaethau, er mwyn peidio â chymhlethu'r prosiect.

Mae llawer o sylwadau yn y cod i'ch helpu i ddeall. Gan ei fod yn weinydd gwe syml mewn ychydig linellau o god, mae ZeroHTTPd hefyd yn fframwaith lleiaf posibl ar gyfer datblygu gwe. Mae ganddo ymarferoldeb cyfyngedig, ond mae'n gallu gwasanaethu ffeiliau statig a thudalennau "deinamig" syml iawn. Mae'n rhaid i mi ddweud bod ZeroHTTPd yn dda ar gyfer dysgu sut i greu cymwysiadau Linux perfformiad uchel. Ar y cyfan, mae'r rhan fwyaf o wasanaethau gwe yn aros am geisiadau, yn eu gwirio ac yn eu prosesu. Dyma'n union beth fydd ZeroHTTPd yn ei wneud. Offeryn ar gyfer dysgu yw hwn, nid cynhyrchu. Nid yw'n wych am drin gwallau ac mae'n annhebygol o frolio arferion diogelwch gorau (o ie, defnyddiais strcpy) neu driciau clyfar yr iaith C. Ond gobeithio ei fod yn gwneud ei waith yn dda.

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd
Tudalen gartref ZeroHTTPd. Gall allbwn gwahanol fathau o ffeiliau gan gynnwys delweddau

Cais Llyfr Gwesteion

Fel arfer nid yw cymwysiadau gwe modern yn gyfyngedig i ffeiliau statig. Mae ganddynt ryngweithiadau cymhleth gyda chronfeydd data amrywiol, caches, ac ati. Felly byddwn yn creu cymhwysiad gwe syml o'r enw "Llyfr Gwesteion" lle mae ymwelwyr yn gadael cofnodion o dan eu henwau. Mae'r llyfr gwestai yn storio cofnodion a adawyd yn gynharach. Mae yna hefyd gownter ymwelwyr ar waelod y dudalen.

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd
Cymhwysiad gwe "Guest Book" ZeroHTTPd

Mae'r cownter ymwelwyr a chofnodion llyfrau gwesteion yn cael eu storio yn Redis. Ar gyfer cyfathrebu â Redis, mae gweithdrefnau eu hunain yn cael eu gweithredu; nid ydynt yn dibynnu ar y llyfrgell allanol. Nid wyf yn gefnogwr mawr o gyflwyno cod homebrew pan fo atebion sydd ar gael i'r cyhoedd ac sydd wedi'u profi'n dda. Ond pwrpas ZeroHTTPd yw astudio perfformiad Linux a mynediad at wasanaethau allanol, tra bod gwasanaethu ceisiadau HTTP yn cael effaith perfformiad difrifol. Mae'n rhaid i ni reoli cyfathrebiadau â Redis yn llawn ym mhob un o'n pensaernïaeth gweinyddwyr. Mewn rhai saernïaeth rydym yn defnyddio galwadau blocio, mewn eraill rydym yn defnyddio gweithdrefnau sy'n seiliedig ar ddigwyddiadau. Ni fydd defnyddio llyfrgell cleientiaid Redis allanol yn darparu'r rheolaeth hon. Yn ogystal, dim ond ychydig o swyddogaethau y mae ein cleient Redis bach yn eu cyflawni (cael, gosod a chynyddu allwedd; cael ac atodi arae). Yn ogystal, mae protocol Redis yn hynod o gain a syml. Nid oes angen i chi hyd yn oed ei ddysgu'n arbennig. Mae'r union ffaith bod y protocol yn gwneud yr holl waith mewn tua chant o linellau o god yn dangos pa mor dda yw meddwl amdano.

Mae'r ffigur canlynol yn dangos beth mae'r cais yn ei wneud pan fydd y cleient (porwr) yn gofyn /guestbookURL.

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd
Sut mae'r rhaglen llyfr gwestai yn gweithio

Pan fydd angen cyhoeddi tudalen llyfr gwestai, mae un alwad i'r system ffeiliau i ddarllen y templed i'r cof a thair galwad rhwydwaith i Redis. Mae'r ffeil templed yn cynnwys y rhan fwyaf o'r cynnwys HTML ar gyfer y dudalen yn y sgrinlun uchod. Mae yna hefyd ddalfannau arbennig ar gyfer rhan ddeinamig y cynnwys: postiadau a chownter ymwelwyr. Rydyn ni'n eu derbyn gan Redis, yn eu mewnosod yn y dudalen ac yn darparu cynnwys wedi'i ffurfio'n llawn i'r cleient. Gellir osgoi'r trydydd galwad i Redis oherwydd bod Redis yn dychwelyd y gwerth allweddol newydd pan gaiff ei gynyddu. Fodd bynnag, ar gyfer ein gweinydd, sydd â phensaernïaeth asyncronaidd yn seiliedig ar ddigwyddiadau, mae llawer o alwadau rhwydwaith yn brawf da at ddibenion dysgu. Felly rydym yn taflu gwerth dychwelyd Redis o nifer yr ymwelwyr ac yn ei holi gyda galwad ar wahân.

Saernïaeth gweinydd ZeroHTTPd

Rydym yn adeiladu saith fersiwn o ZeroHTTPd gyda'r un swyddogaeth ond pensaernïaeth wahanol:

  • iteraidd
  • Gweinydd fforch (un broses plentyn fesul cais)
  • Gweinydd cyn fforc (fforcio prosesau ymlaen llaw)
  • Gweinydd gydag edafedd gweithredu (un edefyn fesul cais)
  • Gweinydd gyda chreu cyn-edau
  • Seiliedig ar bensaernïaeth poll()
  • Seiliedig ar bensaernïaeth epoll

Rydym yn mesur perfformiad pob pensaernïaeth trwy lwytho'r gweinydd gyda cheisiadau HTTP. Ond wrth gymharu pensaernïaeth hynod gyfochrog, mae nifer yr ymholiadau yn cynyddu. Rydyn ni'n profi tair gwaith ac yn cyfrifo'r cyfartaledd.

Methodoleg profi

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd
Gosodiad profi llwyth ZeroHTTPd

Mae'n bwysig, wrth redeg profion, nad yw'r holl gydrannau'n rhedeg ar yr un peiriant. Yn yr achos hwn, mae'r OS yn mynd i orbenion amserlennu ychwanegol wrth i gydrannau gystadlu am CPU. Mae mesur y system weithredu uwchben pob un o'r pensaernïaeth gweinydd a ddewiswyd yn un o nodau pwysicaf yr ymarfer hwn. Bydd ychwanegu mwy o newidynnau yn niweidiol i'r broses. Felly, y lleoliad yn y llun uchod sy'n gweithio orau.

Beth mae pob un o'r gweinyddwyr hyn yn ei wneud?

  • load.unixism.net: Dyma lle rydyn ni'n rhedeg ab, cyfleustodau Meincnod Apache. Mae'n cynhyrchu'r llwyth sydd ei angen i brofi pensaernïaeth ein gweinydd.
  • nginx.unixism.net: Weithiau rydym am redeg mwy nag un enghraifft o raglen gweinydd. I wneud hyn, mae gweinydd Nginx gyda'r gosodiadau priodol yn gweithio fel cydbwysedd llwyth yn dod o ab i'n prosesau gweinydd.
  • zerohttpd.unixism.net: Yma rydym yn rhedeg ein rhaglenni gweinydd ar saith gwahanol bensaernïaeth, un ar y tro.
  • redis.unixism.net: Mae'r gweinydd hwn yn rhedeg yr ellyll Redis, lle mae cofnodion llyfr gwesteion a chownteri ymwelwyr yn cael eu storio.

Mae pob gweinydd yn rhedeg ar yr un craidd prosesydd. Y syniad yw gwerthuso perfformiad uchaf pob pensaernïaeth. Gan fod yr holl raglenni gweinydd yn cael eu profi ar yr un caledwedd, mae hwn yn llinell sylfaen ar gyfer cymharu. Mae fy nghyfosodiad prawf yn cynnwys gweinyddwyr rhithwir wedi'u rhentu gan Digital Ocean.

Beth ydyn ni'n ei fesur?

Gallwch fesur gwahanol ddangosyddion. Rydym yn gwerthuso perfformiad pob pensaernïaeth mewn cyfluniad penodol trwy lwytho'r gweinyddwyr â cheisiadau ar wahanol lefelau o gyfochrog: mae'r llwyth yn tyfu o 20 i 15 o ddefnyddwyr cydamserol.

Canlyniadau profion

Mae'r siart a ganlyn yn dangos perfformiad gweinyddwyr ar wahanol bensaernïaeth ar wahanol lefelau o gyfochredd. Yr echelin-y yw nifer y ceisiadau yr eiliad, mae'r echelin-x yn gysylltiadau cyfochrog.

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd

Perfformiad cymhwysiad rhwydwaith Linux. Rhagymadrodd

Isod mae tabl gyda'r canlyniadau.

ceisiadau yr eiliad

cyfochrogrwydd
iterus
fforch
rhag-fforch
ffrydio
cyn-ffrydio
pleidleisio
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
lledaeniad mawr
2138

5000
-
lledaeniad mawr
1600
1100
2519
-
2235

8000
-
-
1200
lledaeniad mawr
2451
-
2100

10
-
-
lledaeniad mawr
-
2200
-
2200

11
-
-
-
-
2200
-
2122

12
-
-
-
-
970
-
1958

13
-
-
-
-
730
-
1897

14
-
-
-
-
590
-
1466

15
-
-
-
-
532
-
1281

O'r graff a'r tabl gellir gweld mai dim ond dau chwaraewr sydd ar ôl dros 8000 o geisiadau cydamserol: rhag-fforch ac epoll. Wrth i'r llwyth gynyddu, mae gweinydd sy'n seiliedig ar bôl yn perfformio'n waeth nag un ffrydio. Mae'r bensaernïaeth edau-cyn-greu yn gystadleuydd teilwng i epoll, yn dyst i ba mor dda y mae cnewyllyn Linux yn amserlennu nifer fawr o edafedd.

Cod Ffynhonnell ZeroHTTPd

Cod Ffynhonnell ZeroHTTPd yma. Mae cyfeiriadur ar wahân ar gyfer pob pensaernïaeth.

ZeroHTTPd │ ├── 01_iterative │ ├── main.c ├── 02_forking │ ├── main.c ├── 03_preforking ─ ─ ─ ─ ─ ─ 04_ edafu │ ├── main.c ├── 05_prethreading │ ├── main.c ├── 06_poll │ ├── main.c ├── 07_epoll │ └ ─ ─ main.c ├ ─ ─ ├ ─ ─ ─ ├ ffeil ─ ─ ─ ─ ├ ─ ─ ─ ├ ─ ─ prif ffeil. ── mynegai .html │ └── tux .png └── templedi └── llyfr gwesteion └── index.html

Yn ogystal â saith cyfeiriadur ar gyfer pob pensaernïaeth, mae dau arall yn y cyfeiriadur lefel uchaf: cyhoeddus a thempledi. Mae'r cyntaf yn cynnwys y ffeil index.html a'r ddelwedd o'r sgrinlun cyntaf. Gallwch chi roi ffeiliau a ffolderi eraill yno, a dylai ZeroHTTPd wasanaethu'r ffeiliau sefydlog hynny heb unrhyw broblemau. Os yw'r llwybr yn y porwr yn cyfateb i'r llwybr yn y ffolder cyhoeddus, yna mae ZeroHTTPd yn edrych am y ffeil index.html yn y cyfeiriadur hwn. Mae cynnwys y llyfr gwestai yn cael ei gynhyrchu'n ddeinamig. Dim ond tudalen gartref sydd ganddo, ac mae ei gynnwys yn seiliedig ar y ffeil 'templates/guestbook/index.html'. Mae ZeroHTTPd yn ychwanegu tudalennau deinamig ar gyfer estyniad yn hawdd. Y syniad yw y gall defnyddwyr ychwanegu templedi i'r cyfeiriadur hwn ac ymestyn ZeroHTTPd yn ôl yr angen.

I adeiladu pob un o'r saith gweinydd, rhedeg make all o'r cyfeiriadur lefel uchaf - a bydd pob adeiladwaith yn ymddangos yn y cyfeiriadur hwn. Mae ffeiliau gweithredadwy yn chwilio am y cyfeirlyfrau cyhoeddus a thempledi yn y cyfeiriadur y cânt eu lansio ohono.

Linux API

Nid oes angen i chi fod yn hyddysg yn yr API Linux i ddeall y wybodaeth yn y gyfres erthygl hon. Fodd bynnag, rwy'n argymell darllen mwy ar y pwnc hwn; mae yna lawer o adnoddau cyfeirio ar y Rhyngrwyd. Er y byddwn yn cyffwrdd â sawl categori o APIs Linux, bydd ein ffocws yn bennaf ar brosesau, edafedd, digwyddiadau, a'r pentwr rhwydwaith. Yn ogystal â llyfrau ac erthyglau am yr API Linux, rwyf hefyd yn argymell darllen mana ar gyfer galwadau system a swyddogaethau llyfrgell a ddefnyddir.

Perfformiad a Scalability

Un nodyn am berfformiad a scalability. Yn ddamcaniaethol, nid oes unrhyw gysylltiad rhyngddynt. Gallwch gael gwasanaeth gwe sy'n gweithio'n dda iawn, gydag amser ymateb o rai milieiliadau, ond nid yw'n graddio o gwbl. Yn yr un modd, efallai y bydd cymhwysiad gwe sy'n perfformio'n wael sy'n cymryd ychydig eiliadau i ymateb, ond mae'n graddio degau i drin degau o filoedd o ddefnyddwyr cydamserol. Fodd bynnag, mae'r cyfuniad o berfformiad uchel a scalability yn gyfuniad pwerus iawn. Yn gyffredinol, mae cymwysiadau perfformiad uchel yn defnyddio adnoddau'n gynnil ac felly'n gwasanaethu mwy o ddefnyddwyr cydamserol ar y gweinydd yn effeithlon, gan leihau costau.

Tasgau CPU ac I/O

Yn olaf, mewn cyfrifiadura mae dau fath posibl o dasgau bob amser: ar gyfer I/O a CPU. Mae derbyn ceisiadau dros y Rhyngrwyd (rhwydwaith I/O), gweini ffeiliau (rhwydwaith a disg I/O), cyfathrebu â'r gronfa ddata (rhwydwaith a disg I/O) i gyd yn weithgareddau I/O. Gall rhai ymholiadau cronfa ddata fod ychydig yn CPU dwys (didoli, cyfartaledd miliwn o ganlyniadau, ac ati). Mae'r rhan fwyaf o gymwysiadau gwe wedi'u cyfyngu gan yr I/O mwyaf posibl, ac anaml y caiff y prosesydd ei ddefnyddio i'w gapasiti llawn. Pan welwch fod rhywfaint o dasg I / O yn defnyddio llawer o CPU, mae'n fwyaf tebygol o fod yn arwydd o bensaernïaeth cymhwysiad gwael. Gall hyn olygu bod adnoddau CPU yn cael eu gwastraffu ar reoli prosesau a newid cyd-destun - ac nid yw hyn yn gwbl ddefnyddiol. Os ydych chi'n gwneud rhywbeth fel prosesu delweddau, trosi ffeiliau sain, neu ddysgu peiriant, yna mae angen adnoddau CPU pwerus ar y rhaglen. Ond nid yw hyn yn wir ar gyfer y rhan fwyaf o geisiadau.

Dysgwch fwy am saernïaeth gweinyddwyr

  1. Rhan I: Pensaernïaeth iteraidd
  2. Rhan II. Gweinyddion fforch
  3. Rhan III. Gweinyddion cyn fforc
  4. Rhan IV. Gweinyddion ag edafedd gweithredu
  5. Rhan V. Gweinyddion rhag-edau
  6. Rhan VI. Pensaernïaeth seiliedig ar Pol
  7. Rhan VII. pensaernïaeth sy'n seiliedig ar epoll

Ffynhonnell: hab.com

Ychwanegu sylw