Stela: hver stelur örgjörvatíma frá sýndarvélum

Stela: hver stelur örgjörvatíma frá sýndarvélum

Halló! Mig langar að segja þér á einfaldan hátt frá vélfræði stela inni í sýndarvélum og frá nokkrum óaugljósum gripum sem okkur tókst að komast að í rannsóknum þess, sem ég þurfti að kafa ofan í sem tæknistjóri skýjapalls Mail.ru skýjalausnir. Pallurinn keyrir á KVM.

CPU stela tími er sá tími sem sýndarvélin fær ekki örgjörva tilföng fyrir framkvæmd sína. Þessi tími er aðeins talinn í gestastýrikerfum í sýndarumhverfi. Ástæðurnar fyrir því hvert þessar mest úthlutaðar auðlindir fara, eins og í lífinu, eru mjög óljósar. En við ákváðum að finna út úr því og gerðum jafnvel nokkrar tilraunir. Það er ekki það að við vitum núna allt um stela, en við munum segja þér eitthvað áhugavert núna.

1. Hvað er að stela

Svo, stela er mælikvarði sem gefur til kynna skort á örgjörvatíma fyrir ferla inni í sýndarvél. Eins og lýst er í KVM kjarnaplástrinumLaumuspil er tíminn sem yfirsýnarinn er að keyra önnur ferli á stýrikerfi gestgjafans, jafnvel þó að hann hafi sett sýndarvélarferlið í biðröð til framkvæmdar. Það er að stela er reiknað út sem mismuninn á milli þess tíma þegar ferlið er tilbúið til framkvæmdar og þess tíma þegar ferlinu er úthlutað örgjörvatíma.

Sýndarvélarkjarninn tekur á móti stelamælingunni frá hypervisornum. Á sama tíma tilgreinir yfirsýnarmaðurinn ekki nákvæmlega hvaða önnur ferli hann er í gangi, hann segir einfaldlega „á meðan ég er upptekinn, get ég ekki gefið þér tíma. Á KVM hefur verið bætt við stuðningi við stelaútreikning plástra. Hér eru tvö lykilatriði:

  • Sýndarvélin lærir um þjófnað frá hypervisor. Það er, frá sjónarhóli taps, fyrir ferla á sýndarvélinni sjálfri er þetta óbein mæling sem getur verið háð ýmsum bjögun.
  • Hypervisorinn deilir ekki upplýsingum með sýndarvélinni um hvað annað hún er að gera - aðalatriðið er að það verji ekki tíma í það. Vegna þessa getur sýndarvélin sjálf ekki greint brenglun í stelavísinum, sem gæti verið metið út frá eðli samkeppnisferla.

2. Hvað hefur áhrif á stela

2.1. Stela útreikning

Í meginatriðum er stela reiknað um það bil það sama og venjulegur CPU nýtingartími. Það eru ekki miklar upplýsingar um hvernig litið er á endurvinnslu. Sennilega vegna þess að flestir telja þessa spurningu augljósa. En hér eru líka gildrur. Til að kynna þér þetta ferli geturðu lesið grein eftir Brendan Gregg: þú munt læra um mörg blæbrigði við útreikninga á nýtingu og um aðstæður þegar þessi útreikningur verður rangur af eftirfarandi ástæðum:

  • Örgjörvinn ofhitnar, sem veldur því að lotur sleppa.
  • Virkja/slökkva á turbo boost, sem breytir klukkutíðni örgjörva.
  • Breyting á lengd tímasneiðs sem á sér stað þegar orkusparandi tækni eins og SpeedStep er notuð.
  • Vandamálið við að reikna meðaltalið: að áætla einnar mínútu nýtingu á 80% getur falið skammtímahring upp á 100%.
  • Snúningslás veldur því að örgjörvinn er endurheimtur, en notendaferlið sér engar framfarir í framkvæmd hans. Þar af leiðandi mun útreiknuð örgjörvanýting ferlisins vera hundrað prósent, þó ferlið muni ekki líkamlega neyta örgjörvatíma.

Ég hef ekki fundið grein sem lýsir svipuðum útreikningi fyrir stela (ef þú veist, deildu því í athugasemdum). En miðað við frumkóðann er útreikningskerfið það sama og fyrir endurvinnslu. Einfaldlega er annar teljari bætt við í kjarnanum, beint fyrir KVM ferlið (sýndarvélaferli), sem telur lengd KVM ferlisins sem bíður eftir CPU tíma. Teljarinn tekur upplýsingar um örgjörvann úr forskrift sinni og athugar hvort allar merkingar hans séu nýttar af sýndarvélarferlinu. Ef það er allt, þá gerum við ráð fyrir að örgjörvinn hafi aðeins verið upptekinn af sýndarvélarferlinu. Annars upplýsum við að örgjörvinn hafi verið að gera eitthvað annað, stela birtist.

Talning stela er háð sömu vandamálum og venjuleg endurvinnslutalning. Ekki að segja að slík vandamál komi oft upp, en þau virðast letjandi.

2.2. Tegundir sýndarvæðingar á KVM

Í stórum dráttum eru þrjár gerðir sýndarvæðingar, sem allar eru studdar af KVM. Tilhögun stela getur verið háð gerð sýndarvæðingar.

Útsending. Í þessu tilviki gerist rekstur sýndarvélastýrikerfisins með líkamlegum yfirsýnartækjum eitthvað á þessa leið:

  1. Gestastýrikerfið sendir skipun til gestatækisins.
  2. Bílstjóri gestatækisins fær skipunina, býr til beiðni um BIOS tækisins og sendir hana til yfirsýnarans.
  3. Hypervisor ferlið þýðir skipun yfir í stjórn fyrir líkamlega tækið, sem gerir það meðal annars öruggara.
  4. Bílstjóri líkamlega tækisins samþykkir breyttu skipunina og sendir hana til líkamlega tækisins sjálfs.
  5. Niðurstöður framkvæmdar skipana fara aftur á sömu braut.

Kosturinn við þýðingar er að hún gerir þér kleift að líkja eftir hvaða tæki sem er og krefst ekki sérstakrar undirbúnings stýrikerfiskjarna. En þú þarft að borga fyrir þetta, fyrst og fremst, í hraða.

Vélbúnaðar sýndarvæðing. Í þessu tilviki skilur tækið á vélbúnaðarstigi skipanir frá stýrikerfinu. Þetta er fljótlegasta og besta leiðin. En því miður er það ekki stutt af öllum líkamlegum tækjum, yfirsýnum og gestastýrikerfum. Sem stendur eru helstu tækin sem styðja sýndarvæðingu vélbúnaðar örgjörvar.

Paravirtualization. Algengasta valkosturinn fyrir sýndarvæðingu tækis á KVM og almennt algengasti sýndarvæðingarhamurinn fyrir gestastýrikerfi. Sérkenni þess er að vinna með sumum undirkerfum hypervisor (til dæmis með netkerfi eða diskastafla) eða úthlutun minnissíðu á sér stað með því að nota hypervisor API, án þess að þýða skipanir á lágu stigi. Ókosturinn við þessa sýndarvæðingaraðferð er að breyta verður kjarna gestastýrikerfisins þannig að hann geti átt samskipti við hypervisorinn með því að nota þetta API. En þetta er venjulega leyst með því að setja upp sérstaka rekla á gestastýrikerfið. Í KVM er þetta API kallað virtio API.

Með paravirtualization, samanborið við útsendingar, minnkar leiðin að líkamlega tækinu verulega með því að senda skipanir beint frá sýndarvélinni til hypervisor ferlið á hýsilinn. Þetta gerir þér kleift að flýta fyrir framkvæmd allra leiðbeininga inni í sýndarvélinni. Í KVM er þetta gert með virtio API, sem virkar aðeins fyrir ákveðin tæki, eins og net- eða diska millistykki. Þetta er ástæðan fyrir því að virtio reklar eru settir upp inni í sýndarvélum.

Gallinn við þessa hröðun er að ekki eru allir ferlar sem keyra inni í sýndarvélinni áfram inni í henni. Þetta skapar nokkrar tæknibrellur sem geta leitt til hrygningar þegar stolið er. Ég mæli með því að hefja ítarlega rannsókn á þessu máli með API fyrir sýndar I/O: virtio.

2.3. "Sanngjarn" tímasetning

Sýndarvél á hypervisor er í raun venjulegt ferli sem hlýðir lögum um tímasetningu (dreifingu auðlinda á milli ferla) í Linux kjarnanum, svo við skulum skoða það nánar.

Linux notar svokallað CFS, Completely Fair Scheduler, sem hefur orðið sjálfgefinn tímaáætlun frá kjarna 2.6.23. Til að skilja þetta reiknirit geturðu lesið Linux Kernel Architecture eða frumkóðann. Kjarninn í CFS er að dreifa örgjörvatíma á milli ferla eftir því hversu lengi þeir eru framkvæmdir. Því meiri CPU tíma sem ferli krefst, því minni CPU tíma fær það. Þetta tryggir að öll ferli séu keyrð "sanngjarnt" - þannig að eitt ferli tekur ekki stöðugt upp á alla örgjörva, og önnur ferli geta líka keyrt.

Stundum leiðir þessi hugmyndafræði til áhugaverðra gripa. Langvarandi Linux notendur muna líklega eftir því að venjulegur textaritill frjósi á skjáborði á meðan á auðlindafrekum forritum stóð eins og þýðanda. Þetta gerðist vegna þess að verkefni sem krefjast auðlinda í skjáborðsforritum kepptu við auðlindafrekt verkefni, eins og þýðandann. CFS telur þetta ósanngjarnt, svo það stöðvar textaritlina reglulega og leyfir örgjörvanum að sjá um verkefni þýðandans. Þetta var leiðrétt með vélbúnaði sched_autogroup, en margir aðrir eiginleikar dreifingar örgjörvatíma milli verkefna voru eftir. Reyndar er þetta ekki saga um hversu slæmt allt er í CFS, heldur tilraun til að vekja athygli á því að „sanngjörn“ dreifing á örgjörvatíma er ekki léttvægasta verkefnið.

Annar mikilvægur punktur í tímaáætlunarkerfinu er forgangur. Þetta er nauðsynlegt til að sparka út hlátursferlið úr örgjörvanum og láta aðra vinna. Útkastunarferlið er kallað samhengisskipti. Í þessu tilviki er allt samhengi verkefnisins varðveitt: ástand staflans, skráa osfrv., eftir það er ferlið sent til að bíða og annað kemur í staðinn. Þetta er dýr aðgerð fyrir stýrikerfið og er sjaldan notuð, en það er ekkert athugavert við það. Tíð samhengisskipti geta bent til vandamála í stýrikerfinu, en venjulega er það stöðugt og gefur ekki til kynna neitt sérstaklega.

Svo langa sögu þarf til að útskýra eina staðreynd: því meira örgjörvaforða sem ferli reynir að neyta í heiðarlegum Linux tímaáætlun, því hraðar verður það stöðvað svo að önnur ferli geti líka virkað. Hvort þetta sé rétt eða ekki er flókin spurning sem hægt er að leysa á mismunandi hátt undir mismunandi álagi. Í Windows, þar til nýlega, var tímaáætlunin lögð áhersla á forgangsvinnslu skjáborðsforrita, sem gæti valdið því að bakgrunnsferlar frjósi. Sun Solaris var með fimm mismunandi flokka tímasetningar. Þegar við settum af stað sýndarvæðingu, bættum við þeirri sjöttu við, Sanngjarn hlutdeildaráætlun, vegna þess að fyrri fimm virkuðu ekki nægilega vel með Solaris Zones sýndarvæðingu. Ég mæli með því að hefja ítarlega rannsókn á þessu máli með bókum eins og Solaris innri: Solaris 10 og OpenSolaris kjarnaarkitektúr eða Að skilja Linux kjarnann.

2.4. Hvernig á að fylgjast með stela?

Það er einfalt að fylgjast með því að stela inni í sýndarvél, eins og hverri annarri örgjörvamælingu: þú getur notað hvaða örgjörvamælingar sem er. Aðalatriðið er að sýndarvélin er á Linux. Af einhverjum ástæðum veitir Windows ekki þessar upplýsingar til notenda sinna. 🙁

Stela: hver stelur örgjörvatíma frá sýndarvélum
Framleiðsla efstu skipunarinnar: upplýsingar um hleðslu örgjörva, í dálknum lengst til hægri - stela

Erfiðleikarnir koma upp þegar reynt er að fá þessar upplýsingar frá yfirsýnaranum. Þú getur reynt að spá fyrir um þjófnað á hýsingarvélinni, til dæmis með því að nota færibreytuna Load Average (LA) - meðalgildi fjölda ferla sem bíða í framkvæmdarröðinni. Aðferðin til að reikna út þessa færibreytu er ekki einföld, en almennt, ef LA staðlað með fjölda örgjörvaþráða er meira en 1, gefur það til kynna að Linux þjónninn sé ofhlaðinn af einhverju.

Eftir hverju bíða öll þessi ferli? Augljósa svarið er örgjörvinn. En svarið er ekki alveg rétt, því stundum er örgjörvinn ókeypis, en LA fer úr mælikvarða. Mundu hvernig NFS fellur og hvernig LA vex. Sama getur gerst með disk og önnur inntaks-/úttakstæki. En í raun geta ferli beðið eftir lok hvers læsingar, annaðhvort líkamlegt, tengt I/O tæki, eða rökrétt, eins og mutex. Þetta felur einnig í sér læsingu á vélbúnaðarstigi (sama svar frá disknum), eða rökfræði (svokallaða læsingarfrumstæður, sem felur í sér fullt af einingum, mutex aðlögunarhæfni og snúningi, semaphores, ástandsbreytur, rw læsingar, ipc læsingar ...).

Annar eiginleiki LA er að það er talið vera meðaltal stýrikerfis. Til dæmis eru 100 ferli að keppa um eina skrá og síðan LA=50. Svo mikið gildi virðist benda til þess að stýrikerfið sé slæmt. En fyrir annan skakkt skrifaðan kóða getur þetta verið eðlilegt ástand, þrátt fyrir að aðeins það sé slæmt og önnur ferli í stýrikerfinu þjáist ekki.

Vegna þessa meðaltals (og á ekki minna en einni mínútu) er það ekki það gefandi verkefni að ákvarða eitthvað með LA vísinum, með mjög óvissum niðurstöðum í sérstökum tilvikum. Ef þú reynir að átta þig á því muntu komast að því að greinar á Wikipediu og öðrum tiltækum heimildum lýsa aðeins einföldustu tilfellunum, án djúprar skýringar á ferlinu. Ég sendi alla sem hafa áhuga, aftur, hingað til Brendan Gregg  - fylgdu krækjunum hér að neðan. Hver er of latur til að tala ensku - þýðing á vinsælum grein hans um LA.

3. Tæknibrellur

Nú skulum við líta á helstu tilvik stela sem við lentum í. Ég skal segja þér hvernig þau fylgja af öllu ofangreindu og hvernig þau tengjast vísbendingunum á hypervisornum.

Endurvinna. Einfaldasta og algengasta: Hypervisorinn hefur verið endurnotaður. Reyndar eru margar sýndarvélar í gangi, mikil örgjörvanotkun inni í þeim, mikil samkeppni, nýting LA er meira en 1 (aðlöguð af örgjörvaþráðum). Allt inni í öllum sýndarvélum hægir á sér. Stela sendur frá hypervisor er einnig að vaxa, það er nauðsynlegt að dreifa álaginu eða slökkva á einhverjum. Almennt séð er allt rökrétt og skiljanlegt.

Paravirtualization vs einstök tilvik. Það er aðeins ein sýndarvél á yfirsýnarnum, hún eyðir litlum hluta af henni en framleiðir mikið I/O álag, til dæmis á diski. Og einhvers staðar frá birtist lítill stela í því, allt að 10% (eins og sýnt er með nokkrum tilraunum).

Málið er athyglisvert. Stela birtist hér einmitt vegna blokkunar á stigi paravirtualized ökumanna. Truflun er búin til inni í sýndarvélinni, unnin af ökumanni og send til yfirsýnar. Vegna truflana meðhöndlunar á hypervisor, fyrir sýndarvélina lítur hún út eins og send beiðni, hún er tilbúin til framkvæmdar og bíður eftir örgjörvanum, en henni er ekki gefinn örgjörvatími. Sýndarstelpan heldur að þessum tíma hafi verið stolið.

Þetta gerist á því augnabliki sem biðminni er sendur, hann fer inn í kjarnarými yfirsýnarans og við byrjum að bíða eftir því. Þó, frá sjónarhóli sýndarvélarinnar, ætti hann að snúa aftur strax. Þess vegna telst þessi tími vera stolinn samkvæmt reikniritinu til að stela útreikningi. Líklegast, í þessu ástandi geta verið aðrar leiðir (til dæmis að vinna úr sumum öðrum sys símtölum), en þau ættu ekki að vera mikið öðruvísi.

Tímaáætlun á móti mjög hlaðnum sýndarvélum. Þegar ein sýndarvél þjáist af þjófnaði meira en aðrar, er þetta vegna tímaáætlunar. Því meira sem ferli hleður örgjörvanum, því fyrr mun tímaáætlunarmaðurinn sparka því út þannig að hinir geti líka unnið. Ef sýndarvélin eyðir litlu mun hún varla sjá stela: ferli hennar sat heiðarlega og beið, við þurfum að gefa henni meiri tíma. Ef sýndarvél framleiðir hámarksálag á alla kjarna sína er henni oft sparkað út úr örgjörvanum og þeir reyna að gefa henni ekki mikinn tíma.

Það er enn verra þegar ferlar inni í sýndarvélinni reyna að fá meiri örgjörva vegna þess að þeir geta ekki ráðið við gagnavinnslu. Þá mun stýrikerfið á hypervisornum, vegna heiðarlegrar hagræðingar, veita minni og minni örgjörvatíma. Þetta ferli gerist eins og snjóflóð og stela hoppar til skýjanna, þó að aðrar sýndarvélar taki varla eftir því. Og því fleiri kjarna, því verri vélin sem er fyrir áhrifum. Í stuttu máli þjást mjög hlaðnar sýndarvélar með marga kjarna.

Lágt LA, en það er stolið. Ef LA er um það bil 0,7 (þ.e. hypervisorinn virðist vera of mikið hlaðinn), en stela sést inni í einstökum sýndarvélum:

  • Valkosturinn með paravirtualization sem þegar hefur verið lýst hér að ofan. Sýndarvélin getur tekið á móti mæligildum sem gefa til kynna að stela sé stolið, þó að hypervisor sé í lagi. Samkvæmt niðurstöðum tilrauna okkar fer þessi stelavalkostur ekki yfir 10% og ætti ekki að hafa veruleg áhrif á afköst forrita inni í sýndarvélinni.
  • LA færibreytan er rangt reiknuð. Nánar tiltekið, á hverju tilteknu augnabliki er það rétt reiknað, en þegar meðaltalið er yfir eina mínútu reynist það vanmetið. Til dæmis, ef ein sýndarvél á hvern þriðjung af hypervisor eyðir öllum örgjörvum sínum í nákvæmlega hálfa mínútu, þá verður LA á mínútu á hypervisor 0,15; fjórar slíkar sýndarvélar sem vinna samtímis gefa 0,6. Og þá staðreynd að í hálfa mínútu á hverjum þeirra var villt stela á 25% samkvæmt LA vísinum er ekki lengur hægt að draga út.
  • Aftur, vegna dagskrárgerðarmannsins sem ákvað að einhver væri að borða of mikið og lét þann bíða. Í millitíðinni mun ég skipta um samhengi, sjá um truflanir og sjá um aðra mikilvæga kerfishluti. Fyrir vikið sjá sumar sýndarvélar engin vandamál á meðan aðrar upplifa alvarlega skerðingu á frammistöðu.

4. Önnur brenglun

Það eru milljón fleiri ástæður fyrir því að skekkja sanngjarna ávöxtun örgjörvatíma á sýndarvél. Til dæmis, ofþráður og NUMA setja erfiðleika í útreikninga. Þeir rugla algjörlega valinu á kjarna til að framkvæma ferlið, vegna þess að tímaáætlunarmaðurinn notar stuðla - lóð, sem gera útreikninginn enn erfiðari þegar skipt er um samhengi.

Það eru brenglun vegna tækni eins og turbo boost eða öfugt orkusparnaðarhamur, sem, þegar nýting er reiknuð, getur tilbúið aukið eða lækkað tíðnina eða jafnvel tímasneið á þjóninum. Að virkja turbo boost dregur úr afköstum eins örgjörvaþráðs vegna aukinnar frammistöðu annars. Í augnablikinu eru upplýsingar um núverandi tíðni örgjörva ekki sendar til sýndarvélarinnar og hún telur að einhver sé að stela tíma sínum (til dæmis óskaði hún eftir 2 GHz, en fékk helming þess).

Almennt séð geta verið margar ástæður fyrir brenglun. Þú gætir fundið eitthvað annað á tilteknu kerfi. Það er betra að byrja á bókunum sem ég gaf tengla á hér að ofan og sækja tölfræði úr yfirsýninni með því að nota tól eins og perf, sysdig, systemtap, þar af tugir.

5. Ályktanir

  1. Nokkuð magn af stoli getur átt sér stað vegna paravirtualization og það getur talist eðlilegt. Þeir skrifa á netinu að þetta gildi geti verið 5-10%. Fer eftir forritunum inni í sýndarvélinni og álaginu sem hún setur á líkamleg tæki sín. Hér er mikilvægt að borga eftirtekt til hvernig forritum líður inni í sýndarvélum.
  2. Hlutfall álags á hypervisor og stela inni í sýndarvélinni er ekki alltaf skýrt samtengd; bæði áætlanir um stela geta verið rangar við sérstakar aðstæður undir mismunandi álagi.
  3. Tímagerðarmaðurinn hefur slæmt viðhorf til ferla sem spyrja mikið. Hann reynir að gefa minna til þeirra sem biðja um meira. Stórar sýndarvélar eru vondar.
  4. Smá stela getur verið normið án paravirtualization (að teknu tilliti til álagsins inni í sýndarvélinni, eiginleikum álags nágranna, álagsdreifingar yfir þræði og annarra þátta).
  5. Ef þú vilt komast að því að stela í tilteknu kerfi þarftu að kanna ýmsa möguleika, safna mælingum, greina þær vandlega og hugsa um hvernig á að dreifa álaginu jafnt. Frávik frá öllum tilfellum eru möguleg, sem verður að staðfesta með tilraunum eða skoða í kjarnakembiforritinu.

Heimild: www.habr.com

Bæta við athugasemd