Steal: wa steals prosessor tiid út firtuele masines

Steal: wa steals prosessor tiid út firtuele masines

Hallo! Ik wol jo yn ienfâldige termen fertelle oer de meganika fan steal binnen firtuele masines en oer guon net-foar de hân lizzende artefakten dy't wy wisten te finen tidens har ûndersyk, wêryn ik moast dûke yn as technysk direkteur fan in wolkplatfoarm Mail.ru Cloud Solutions. It platfoarm rint op KVM.

CPU-stealtiid is de tiid wêryn't de firtuele masine gjin prosessorboarnen ûntfangt foar syn útfiering. Dizze tiid wurdt allinnich teld yn gast bestjoeringssystemen yn virtualisaasje omjouwings. De redenen foar wêr't dizze meast tawiisde middels gean, lykas yn it libben, binne heul vague. Mar wy besletten it út te finen, en hawwe sels in oantal eksperiminten útfierd. It is net dat wy no alles witte oer stellerij, mar wy sille jo no wat nijsgjirrichs fertelle.

1. Wat is stelle

Dat, steal is in metrysk dy't in gebrek oan prosessortiid oanjout foar prosessen yn in firtuele masine. As beskreaun yn de KVM kernel patchStealth is de tiid wêryn't de hypervisor oare prosessen útfiert op it host OS, ek al hat it it firtuele masineproses yn 'e wachtrige steld foar útfiering. Dat is, steal wurdt berekkene as it ferskil tusken de tiid doe't it proses is klear om út te fieren en de tiid doe't it proses wurdt tawiisd prosessor tiid.

De kernel fan 'e firtuele masine ûntfangt de stealmetrik fan' e hypervisor. Tagelyk spesifisearret de hypervisor net krekt hokker oare prosessen it rint, it seit gewoan "wylst ik drok bin, kin ik jo gjin tiid jaan." Op KVM is stipe foar stealberekkening tafoege oan patches. D'r binne hjir twa wichtige punten:

  • De firtuele masine leart oer stelle fan 'e hypervisor. Dat is, út it eachpunt fan ferliezen, foar prosessen op 'e firtuele masine sels is dit in yndirekte mjitting dy't ûnderwurpen wurde kin oan ferskate distortions.
  • De hypervisor dielt gjin ynformaasje mei de firtuele masine oer wat it oars docht - it wichtichste is dat it der gjin tiid oan wijt. Hjirtroch kin de firtuele masine sels gjin fersteuringen detektearje yn 'e steal-yndikator, dy't koe wurde beoardiele troch de aard fan konkurrearjende prosessen.

2. Wat beynfloedet stelle

2.1. Steal berekkening

Yn essinsje wurdt steal sawat itselde berekkene as de normale CPU-gebrûkstiid. Der is net folle ynformaasje oer hoe't recycling wurdt beskôge. Wierskynlik om't de measte minsken dizze fraach fanselssprekkend beskôgje. Mar d'r binne hjir ek pitfallen. Om jo fertroud te meitsjen mei dit proses, kinne jo lêze artikel troch Brendan Gregg: jo sille leare oer in protte nuânses by it berekkenjen fan gebrûk en oer situaasjes wêryn dizze berekkening ferkeard sil wêze om de folgjende redenen:

  • De prosessor oververhit, wêrtroch't syklusen oerslaan.
  • Aktivearje / útskeakelje turbo boost, dy't feroaret de prosessor klok frekwinsje.
  • In feroaring yn 'e lingte fan' e tiid slice dy't optreedt by it brûken fan prosessor enerzjybesparjende technologyen lykas SpeedStep.
  • It probleem mei it berekkenjen fan it gemiddelde: it skatten fan ien minút gebrûk op 80% kin in koarte termyn burst fan 100% ferbergje.
  • In spin slot feroarsaket de prosessor wurdt werombrocht, mar de brûker proses sjocht gjin foarútgong yn syn útfiering. As gefolch, de berekkene prosessor utilisaasje troch it proses sil wêze hûndert prosint, hoewol't it proses sil net fysyk ferbrûke prosessor tiid.

Ik haw gjin artikel fûn dat in ferlykbere berekkening foar steal beskriuwt (as jo witte, diel it yn 'e kommentaren). Mar, beoardielje troch de boarnekoade, is it berekkeningsmeganisme itselde as foar recycling. Gewoanwei wurdt in oare teller tafoege yn 'e kearn, direkt foar it KVM-proses (firtuele masineproses), dy't de doer telt fan it KVM-proses dat wachtet op CPU-tiid. De teller nimt ynformaasje oer de prosessor út syn spesifikaasje en kontrolearret oft al syn tikjes wurde brûkt troch it firtuele masineproses. As dat alles is, geane wy ​​derfan út dat de prosessor allinich beset wie mei it firtuele masineproses. Oars, wy ynformearje dat de prosessor die wat oars, steal ferskynde.

It steal tellen proses is ûnderwurpen oan deselde problemen as reguliere recycling tellen. Net te sizzen dat sokke problemen faak ferskine, mar se sjogge ûntmoedigend.

2.2. Soarten virtualisaasje op KVM

Yn 't algemien binne d'r trije soarten virtualisaasje, dy't allegear wurde stipe troch KVM. It meganisme fan it foarkommen fan steal kin ôfhinklik wêze fan it type virtualisaasje.

Útstjoere. Yn dit gefal komt de wurking fan it firtuele masine-bestjoeringssysteem mei fysike hypervisor-apparaten sa'n ding foar:

  1. It gastbestjoeringssysteem stjoert in kommando nei syn gastapparaat.
  2. De bestjoerder fan it gastapparaat ûntfangt it kommando, genereart in fersyk foar it apparaat BIOS en stjoert it nei de hypervisor.
  3. It hypervisorproses fertaalt kommando nei kommando foar it fysike apparaat, wêrtroch it ûnder oare feiliger is.
  4. De bestjoerder fan it fysike apparaat akseptearret it wizige kommando en stjoert it nei it fysike apparaat sels.
  5. De resultaten fan it útfieren fan kommando's geane op itselde paad werom.

It foardiel fan oersetting is dat jo elk apparaat kinne emulearje en gjin spesjale tarieding fan 'e kernel fan it bestjoeringssysteem fereasket. Mar jo moatte betelje foar dit, earst fan alle, yn snelheid.

Hardware virtualisaasje. Yn dit gefal begrypt it apparaat op hardwarenivo kommando's fan it bestjoeringssysteem. Dit is de fluchste en bêste manier. Mar, spitigernôch, it wurdt net stipe troch alle fysike apparaten, hypervisors en gast bestjoeringssystemen. Op it stuit binne de wichtichste apparaten dy't hardware-virtualisaasje stypje processors.

Paravirtualisaasje. De meast foarkommende opsje foar apparaatvirtualisaasje op KVM en oer it algemien de meast foarkommende virtualisaasjemodus foar gastbestjoeringssystemen. Syn eigenaardichheid is dat wurk mei guon hypervisor subsystemen (bygelyks, mei it netwurk of skiif stack) of tawizing fan ûnthâld siden bart mei help fan de hypervisor API, sûnder it oersetten fan leech-nivo kommando's. It neidiel fan dizze virtualisaasjemetoade is dat de kearn fan it gastbestjoeringssysteem moat wurde wizige sadat it kin kommunisearje mei de hypervisor mei dizze API. Mar dit wurdt meastal oplost troch it ynstallearjen fan spesjale bestjoerders op it gast bestjoeringssysteem. Yn KVM wurdt dizze API neamd virtio API.

Mei paravirtualisaasje, yn ferliking mei útstjoering, wurdt it paad nei it fysike apparaat signifikant fermindere troch kommando's direkt fan 'e firtuele masine nei it hypervisorproses op' e host te stjoeren. Hjirmei kinne jo de útfiering fan alle ynstruksjes binnen de firtuele masine rapper meitsje. Yn KVM wurdt dit dien troch de virtio API, dy't allinich wurket foar bepaalde apparaten, lykas in netwurk of skiifadapter. Dit is wêrom virtio-bestjoerders binne ynstalleare yn firtuele masines.

It neidiel fan dizze fersnelling is dat net alle prosessen dy't rinne yn 'e firtuele masine deryn bliuwe. Dit soarget foar wat spesjale effekten dy't kinne resultearje yn spawning op steal. Ik riede in begjinnende in detaillearre stúdzje fan dit probleem mei In API foar firtuele I / O: virtio.

2.3. "Earlike" skema

In firtuele masine op in hypervisor is trouwens in gewoan proses dat de wetten fan scheduling folget (boarneferdieling tusken prosessen) yn 'e Linux-kernel, dus litte wy it neier besjen.

Linux brûkt de saneamde CFS, Completely Fair Scheduler, dy't sûnt kernel 2.6.23 de standertplanner wurden is. Om dit algoritme te begripen, kinne jo de Linux Kernel Architecture of de boarnekoade lêze. De essinsje fan CFS is om prosessortiid te fersprieden tusken prosessen ôfhinklik fan 'e doer fan har útfiering. De mear CPU-tiid in proses fereasket, hoe minder CPU-tiid it ûntfangt. Dit soarget derfoar dat alle prosessen "reedlik" wurde útfierd - sadat ien proses net alle prosessoren konstant beset, en oare prosessen kinne ek útfiere.

Soms liedt dit paradigma ta nijsgjirrige artefakten. Lange Linux-brûkers ûnthâlde wierskynlik it befriezen fan in gewoane tekstbewurker op in buroblêd by it útfieren fan boarne-yntinsive applikaasjes lykas in kompilator. Dit barde om't net-boarne-yntinsive taken yn buroblêd-applikaasjes konkurrearje mei boarne-yntinsive taken, lykas de kompilator. CFS tinkt dat dit ûnrjochtfeardich is, dus stopet it de tekstbewurker periodyk en lit de prosessor de taken fan 'e kompilator behannelje. Dit waard korrizjearre mei in meganisme sched_autogroup, mar in protte oare funksjes fan de ferdieling fan prosessor tiid tusken taken bleau. Eins is dit gjin ferhaal oer hoe slim alles is yn CFS, mar in besykjen om omtinken te jaan oan it feit dat "earlike" ferdieling fan prosessortiid net de meast triviale taak is.

In oar wichtich punt yn 'e planner is preemption. Dit is nedich om it snikkeproses fan 'e prosessor út te traapjen en oaren te litten wurkje. It útwerpproses wurdt kontekstwikseling neamd. Yn dit gefal wurdt de hiele kontekst fan 'e taak bewarre bleaun: de steat fan' e stapel, registers, ensfh., wêrnei't it proses wurdt stjoerd om te wachtsjen, en in oar nimt syn plak. Dit is in djoere operaasje foar it OS en wurdt selden brûkt, mar d'r is neat ynherint mis mei. Frequent kontekstwikseling kin in probleem yn it OS oanjaan, mar meastentiids is it kontinu en jout neat spesjaal oan.

Sa'n lang ferhaal is nedich om ien feit te ferklearjen: hoe mear prosessorboarnen in proses besiket te konsumearjen yn in earlike Linux-planner, hoe flugger it sil wurde stoppe, sadat oare prosessen ek kinne wurkje. Oft dit goed is of net, is in komplekse fraach dy't ûnder ferskate lesten oars oplost wurde kin. Yn Windows, oant koartlyn, wie de planner rjochte op prioriteitsferwurking fan buroblêdapplikaasjes, wat eftergrûnprosessen koe feroarsaakje om te befriezen. Sun Solaris hie fiif ferskillende klassen fan planners. Doe't wy virtualisaasje lansearren, hawwe wy in sechsde tafoege, Fair share scheduler, om't de foarige fiif net genôch wurken mei Solaris Zones-virtualisaasje. Ik advisearje om in detaillearre stúdzje fan dit probleem te begjinnen mei boeken lykas Solaris Internals: Solaris 10 en OpenSolaris Kernel Architecture of De Linux Kernel begripe.

2.4. Hoe kontrolearje stellerij?

It kontrolearjen fan steal binnen in firtuele masine, lykas elke oare prosessormetrik, is ienfâldich: jo kinne elk ark foar prosessormetriken brûke. It wichtichste is dat de firtuele masine op Linux is. Om ien of oare reden jout Windows dizze ynformaasje net oan har brûkers. 🙁

Steal: wa steals prosessor tiid út firtuele masines
Utfier fan it boppeste kommando: details fan 'e prosessorlading, yn' e rjochterste kolom - stelle

De muoite ûntstiet as jo besykje dizze ynformaasje te krijen fan 'e hypervisor. Jo kinne besykje te foarsizze steal op de host masine, bygelyks, mei help fan de Load Average (LA) parameter - de gemiddelde wearde fan it oantal prosessen wachtsjend yn de útfiering wachtrige. De metoade foar it berekkenjen fan dizze parameter is net ienfâldich, mar yn 't algemien, as LA normalisearre troch it oantal prosessor-threads mear as 1 is, jout dit oan dat de Linux-tsjinner mei wat oerladen is.

Wêr wachtsje al dizze prosessen op? It foar de hân lizzende antwurd is de prosessor. Mar it antwurd is net hielendal korrekt, want soms de prosessor is fergees, mar LA giet út skaal. Unthâld hoe't NFS falt en hoe't LA groeit. Itselde kin barre mei in skiif en oare input / output apparaten. Mar yn feite, prosessen kinne wachtsje op it ein fan eltse slot, itsij fysyk, assosjearre mei in I / O apparaat, of logysk, lykas in mutex. Dit omfettet ek beskoatteljen op it nivo fan hardware (deselde reaksje fan 'e skiif), of logika (de saneamde locking primitives, dy't omfiemet in boskje entiteiten, mutex adaptive en spin, semaphores, betingst fariabelen, rw slûzen, ipc slûzen ...).

In oar skaaimerk fan LA is dat it wurdt beskôge as in gemiddelde fan bestjoeringssysteem. Bygelyks, 100 prosessen konkurrearje foar ien bestân, en dan LA = 50. Sa'n grutte wearde soe lykje oan te jaan dat it bestjoeringssysteem min is. Mar foar oare krom skreaune koade kin dit in normale steat wêze, nettsjinsteande it feit dat allinich it min is, en oare prosessen yn it bestjoeringssysteem net lije.

Fanwegen dit gemiddelde (en yn net minder dan in minút) is it bepalen fan alles troch de LA-yndikator net de meast beleanjend taak, mei heul ûnwisse resultaten yn spesifike gefallen. As jo ​​besykje it út te finen, sille jo fine dat artikels op Wikipedia en oare beskikbere boarnen allinich de ienfâldichste gefallen beskriuwe, sûnder in djippe útlis fan it proses. Ik stjoer elkenien dy't ynteressearre is, wer, hjir nei Brendan Gregg  - folgje de links hjirûnder. Wa is te lui om Ingelsk te praten - oersetting fan syn populêre artikel oer LA.

3. Spesjale effekten

Litte wy no sjen nei de wichtichste gefallen fan stelle dy't wy tsjinkamen. Ik sil jo fertelle hoe't se folgje fan al it boppesteande en hoe't se relatearje oan de yndikatoaren op 'e hypervisor.

Recycling. It ienfâldichste en meast foarkommende: de hypervisor is opnij brûkt. Yndied binne d'r in protte rinnende firtuele masines, hege prosessorkonsumpsje yn har, in protte konkurrinsje, LA-gebrûk is mear dan 1 (normalisearre troch prosessor-threads). Alles binnen alle firtuele masines fertraget. Steal oerdroegen fan 'e hypervisor groeit ek, it is needsaaklik om de lading te fersprieden of immen út te skeakeljen. Yn 't algemien is alles logysk en begryplik.

Paravirtualisaasje vs Single Instances. D'r is mar ien firtuele masine op 'e hypervisor; it konsumearret in lyts diel dêrfan, mar produsearret in grutte I / O-load, bygelyks op skiif. En fan earne komt der in lyts steal yn, oant 10% (lykas sjen litten troch ferskate eksperiminten).

De saak is nijsgjirrich. Steal ferskynt hjir krekt fanwegen blokkearjen op it nivo fan paravirtualisearre bestjoerders. In ûnderbrekking wurdt makke binnen de firtuele masine, ferwurke troch de bestjoerder en stjoerd nei de hypervisor. Troch de ûnderbrekking ôfhanneling op 'e hypervisor, foar de firtuele masine liket in ferstjoerd fersyk, it is klear foar útfiering en wachtet op de prosessor, mar it wurdt net jûn prosessor tiid. It firtuele famke tinkt dat dizze kear stellen is.

Dit bart op it momint dat de buffer ferstjoerd wurdt, it giet yn 'e kernelromte fan' e hypervisor, en wy begjinne derop te wachtsjen. Hoewol, út it eachpunt fan 'e firtuele masine, moat hy fuortendaliks weromkomme. Dêrom, neffens de stellerij berekkening algoritme, dizze tiid wurdt beskôge as stellen. Meast wierskynlik, yn dizze situaasje kinne d'r oare meganismen wêze (bygelyks ferwurkjen fan guon oare sys-oproppen), mar se moatte net folle oars wêze.

Scheduler tsjin heul laden firtuele masines. As ien firtuele masine lijt fan stelle mear as oaren, dit komt troch de scheduler. Hoe mear in proses de prosessor laadt, hoe earder de planner it útskopt, sadat de oaren ek wurkje kinne. As de firtuele masine verbruikt bytsje, it sil amper sjen stelle: syn proses earlik siet en wachte, wy moatte jaan it mear tiid. As in firtuele masine de maksimale lading op al syn kearnen produseart, wurdt it faaks út 'e prosessor skopt en besykje se it net in protte tiid te jaan.

It is noch slimmer as prosessen binnen de firtuele masine besykje mear prosessor te krijen, om't se net kinne omgean mei gegevensferwurking. Dan sil it bestjoeringssysteem op 'e hypervisor, troch earlike optimalisaasje, hieltyd minder prosessortiid leverje. Dit proses bart as in lawine, en steal springt nei de loften, hoewol't oare firtuele masines meie amper fernimme it. En de mear kearnen, de slimmer de troffen masine. Koartsein, heul laden firtuele masines mei in protte kearnen lije it measte.

Low LA, mar der is stellen. As LA sawat 0,7 is (dat is, de hypervisor liket te wêzen ûnderladen), mar steal wurdt waarnommen binnen yndividuele firtuele masines:

  • De opsje mei paravirtualisaasje al beskreaun hjirboppe. De firtuele masine kin metriken ûntfange dy't stelle stelle, hoewol de hypervisor goed is. Neffens de resultaten fan ús eksperiminten is dizze steal-opsje net mear as 10% en moat gjin signifikante ynfloed hawwe op 'e prestaasjes fan applikaasjes binnen de firtuele masine.
  • De parameter LA is ferkeard berekkene. Mear krekter, op elk spesifyk momint wurdt it korrekt berekkene, mar as it gemiddeld oer ien minút wurdt wurdt it ûnderskat. Bygelyks, as ien firtuele masine per tredde fan 'e hypervisor al syn processors foar krekt in heale minút konsumearret, dan sil LA per minút op' e hypervisor 0,15 wêze; fjouwer sokke firtuele masines wurkje tagelyk sil jaan 0,6. En it feit dat der foar in heale minút op elk fan harren in wylde stellerij wie op 25% neffens de LA-yndikator kin net mear útlutsen wurde.
  • Nochris, fanwegen de planner dy't besleat dat immen tefolle iet en dy immen wachtsje liet. Yn 'e tuskentiid sil ik de kontekst wikselje, interrupts behannelje en soargje foar oare wichtige systeemdingen. As gefolch, guon firtuele masines sjogge gjin problemen, wylst oaren ûnderfine serieuze prestaasjes degradaasje.

4. Oare ferfoarmings

D'r binne in miljoen mear redenen foar ferfoarming fan it earlike weromkommen fan prosessortiid op in firtuele masine. Bygelyks, hyperthreading en NUMA yntrodusearje swierrichheden yn berekkeningen. Se betiizje de kar fan kernel folslein foar it útfieren fan it proses, om't de planner koeffizienten - gewichten brûkt, dy't de berekkening noch dreger meitsje by it wikseljen fan 'e kontekst.

D'r binne ferfoarmingen troch technologyen lykas turbo-boost of, oarsom, enerzjybesparjende modus, dy't, by it berekkenjen fan gebrûk, de frekwinsje of sels de tiidslice op 'e tsjinner keunstmjittich ferheegje of ferminderje kinne. It ynskeakeljen fan turbo-boost ferleget de prestaasjes fan ien prosessor-thread fanwege in ferheging fan 'e prestaasjes fan in oar. Op dit stuit, ynformaasje oer de hjoeddeiske prosessor frekwinsje wurdt net oerdroegen oan de firtuele masine, en it is fan betinken dat immen is stelle syn tiid (Bygelyks, it frege 2 GHz, mar krige de helte fan dat).

Yn 't algemien kinne d'r in protte redenen wêze foar ferfoarming. Jo kinne wat oars fine op in bepaald systeem. It is better om te begjinnen mei de boeken dêr't ik hjirboppe keppelings joech, en statistiken ophelje fan 'e hypervisor mei helpprogramma's lykas perf, sysdig, systemtap, wêrfan tsientallen.

5. Konklúzjes

  1. Guon hoemannichte steal kin foarkomme fanwege paravirtualisaasje, en it kin as normaal beskôge wurde. Se skriuwe op it ynternet dat dizze wearde 5-10% kin wêze. Hinget ôf fan 'e applikaasjes yn' e firtuele masine en fan 'e lading dy't it op har fysike apparaten set. Hjir is it wichtich om omtinken te jaan oan hoe't applikaasjes fiele binnen firtuele masines.
  2. De ferhâlding fan 'e lading op' e hypervisor en steal yn 'e firtuele masine binne net altyd dúdlik mei-inoar ferbûn; beide skattingen fan stelle kinne ferkeard wêze yn spesifike situaasjes ûnder ferskate loads.
  3. De planner hat in minne hâlding foar prosessen dy't in protte freegje. Hy besiket minder te jaan oan dyjingen dy't mear freegje. Grutte firtuele masines binne kwea.
  4. In bytsje stellerij kin de noarm wêze, sels sûnder paravirtualisaasje (mei rekken hâldend mei de lading binnen de firtuele masine, de skaaimerken fan 'e lading fan buorlju, ferdieling fan' e lading oer triedden en oare faktoaren).
  5. As jo ​​wolle útfine stellerij yn in spesifyk systeem, jo ​​moatte ferkenne ferskate opsjes, sammelje metriken, se foarsichtich analysearje en tinke oer hoe't te fersprieden de lading evenredich. Ofwikingen fan alle gefallen binne mooglik, dy't eksperiminteel moatte wurde befêstige of besjoen yn 'e kernel-debugger.

Boarne: www.habr.com

Add a comment