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.
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.
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.
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
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.
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.
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.