Varastaa: kuka varastaa suoritinaikaa virtuaalikoneen

Varastaa: kuka varastaa suoritinaikaa virtuaalikoneen

Hei! Haluan kertoa yksinkertaisesti virtuaalikoneiden sisällä tapahtuvan varastamisen mekaniikasta ja joistakin ei-ilmeisistä artefakteista, jotka saimme selville hänen tutkimuksensa aikana ja joihin minun piti sukeltaa pilvialustan teknisenä johtajana. Mail.ru Pilviratkaisut. Alusta toimii KVM:llä.

Suorittimen varastusaika on aika, jonka aikana virtuaalikone ei saa suorittimen resursseja sen suorittamiseen. Tämä aika otetaan huomioon vain vieraskäyttöjärjestelmissä virtualisointiympäristöissä. Syyt siihen, mihin nämä varat menevät, kuten elämässä, ovat hyvin epämääräisiä. Mutta päätimme selvittää sen, jopa perustaa useita kokeita. Emme nyt tiedä kaikkea varastamisesta, mutta kerromme sinulle nyt jotain mielenkiintoista.

1. Mikä on varastaminen

Joten varastaminen on mittari, joka osoittaa prosessoriajan puutteen virtuaalikoneen sisällä oleville prosesseille. Kuten kuvattu KVM-ytimen korjaustiedostossa, steal on aika, jonka hypervisor suorittaa muita prosesseja isäntäkäyttöjärjestelmässä, vaikka se on asettanut virtuaalikoneen prosessin jonoon suorittamista varten. Toisin sanoen varastaminen lasketaan erona ajan välillä, jolloin prosessi on valmis suoritukseen, ja ajan välillä, jolloin prosessille on varattu CPU-aikaa.

Virtuaalikoneen ydin vastaanottaa varastamismetriikan hypervisorilta. Samanaikaisesti hypervisor ei määrittele, mitä muita prosesseja se suorittaa, vaan "kun olen kiireinen, en voi antaa sinulle aikaa". KVM:ssä varaslaskelman tuki on lisätty laastareita. Tässä on kaksi keskeistä kohtaa:

  • Virtuaalikone oppii varastamisen hypervisorilta. Eli itse virtuaalikoneen prosessien häviöiden kannalta tämä on epäsuora mittaus, joka voi altistua erilaisille vääristymille.
  • Hypervisor ei jaa virtuaalikoneen kanssa tietoja siitä, mitä se tekee muusta - pääasia, että se ei omista aikaa siihen. Tästä johtuen virtuaalikone itse ei pysty havaitsemaan varas-indikaattorin vääristymiä, jotka voitaisiin arvioida kilpailevien prosessien luonteen perusteella.

2. Mikä vaikuttaa varastukseen?

2.1. Varasta laskelma

Itse asiassa varastamista pidetään pitkälti samalla tavalla kuin tavallista suorittimen käyttöaikaa. Ei ole paljon tietoa siitä, miten kierrätys otetaan huomioon. Luultavasti siksi, että enemmistö pitää tätä kysymystä itsestään selvänä. Mutta tässäkin on sudenkuoppia. Jos haluat yleiskatsauksen tästä prosessista, lue Brendan Greggin artikkeli: opit joukosta vivahteita käyttöastetta laskettaessa ja tilanteista, joissa tämä laskenta on virheellinen seuraavista syistä:

  • Prosessorin ylikuumeneminen, jossa jaksot ohitetaan.
  • Ota käyttöön/poista käytöstä turbotehostus, joka muuttaa prosessorin kellotaajuutta.
  • Aikaviipaleen pituuden muutos, joka tapahtuu käytettäessä prosessorin virransäästötekniikoita, kuten SpeedStep.
  • Keskimääräisen ongelman laskeminen: minuutin käyttöarvio 80 % voi piilottaa lyhytaikaisen 100 %:n purskeen.
  • Pyörimislukko saa prosessorin takaisin, mutta käyttäjäprosessi ei näe edistymistä sen suorittamisessa. Tämän seurauksena prosessin arvioitu prosessorin käyttöaste on XNUMX %, vaikka prosessi ei fyysisesti kuluta prosessoriaikaa.

En löytänyt artikkelia, jossa kuvattaisiin samanlainen varastamislaskenta (jos tiedät, jaa se kommenteissa). Mutta lähteistä päätellen laskentamekanismi on sama kuin kierrätyksessä. Se on vain, että toinen laskuri lisätään ytimeen suoraan KVM-prosessille (virtuaalikoneprosessi), joka laskee KVM-prosessin keston prosessorin odotustilassa. Laskuri ottaa tietoja prosessorista sen spesifikaatiosta ja näkee, onko virtuaalikoneen prosessi hyödyntänyt kaikkia sen tikkuja. Jos kaikki, niin katsomme, että prosessori oli mukana vain virtuaalikoneen prosessissa. Muussa tapauksessa ilmoitamme, että prosessori teki jotain muuta, varastaa ilmestyi.

Varastojen laskentaprosessissa on samat ongelmat kuin normaalissa varastajien laskennassa. Ei tarkoita, että tällaisia ​​ongelmia esiintyisi usein, mutta ne näyttävät masentavilta.

2.2. KVM:n virtualisoinnin tyypit

Yleisesti ottaen virtualisointia on kolmenlaisia, ja KVM tukee niitä kaikkia. Varastamisen esiintymismekanismi voi riippua virtualisoinnin tyypistä.

käännös. Tässä tapauksessa virtuaalikoneen käyttöjärjestelmän työ hypervisorin fyysisten laitteiden kanssa menee suunnilleen näin:

  1. Vieraskäyttöjärjestelmä lähettää komennon vieraslaitteelleen.
  2. Vieraslaiteohjain vastaanottaa komennon, luo pyynnön laitteen BIOSista ja lähettää sen hypervisorille.
  3. Hypervisor-prosessi muuttaa komennon komennon fyysiselle laitteelle, mikä tekee siitä muun muassa turvallisemman.
  4. Fyysisen laitteen ohjain hyväksyy muokatun komennon ja lähettää sen itse fyysiselle laitteelle.
  5. Komentojen suorittamisen tulokset menevät takaisin samaa polkua pitkin.

Käännöksen etuna on, että sen avulla voit emuloida mitä tahansa laitetta, eikä se vaadi erityistä käyttöjärjestelmän ytimen valmistelua. Mutta sinun on maksettava tästä ennen kaikkea nopeudella.

Laitteiston virtualisointi. Tässä tapauksessa laite laitteistotasolla ymmärtää käyttöjärjestelmän komennot. Tämä on nopein ja paras tapa. Mutta valitettavasti kaikki fyysiset laitteet, hypervisorit ja vieraskäyttöjärjestelmät eivät tue sitä. Tällä hetkellä tärkeimmät laitteiston virtualisointia tukevat laitteet ovat prosessorit.

Paravirtualisointi. Yleisin vaihtoehto laitteen virtualisoinnille KVM:ssä ja yleensä yleisin virtualisointitila vieraskäyttöjärjestelmille. Sen erikoisuus on, että työ joidenkin hypervisor-alijärjestelmien kanssa (esimerkiksi verkon tai levypinon kanssa) tai muistisivujen varaaminen tapahtuu hypervisor API:n avulla ilman matalan tason komentojen kääntämistä. Tämän virtualisointimenetelmän haittana on, että vieraskäyttöjärjestelmän ydintä on muutettava, jotta se voi kommunikoida hypervisorin kanssa tämän API:n avulla. Mutta tämä ratkaistaan ​​yleensä asentamalla erityiset ajurit vieraskäyttöjärjestelmään. KVM:ssä tätä API:ta kutsutaan nimellä virtio API.

Paravirtualisoinnilla käännökseen verrattuna polku fyysiseen laitteeseen vähenee merkittävästi lähettämällä komentoja suoraan virtuaalikoneesta isäntäkoneen hypervisor-prosessiin. Tämän avulla voit nopeuttaa kaikkien virtuaalikoneen sisällä olevien ohjeiden suorittamista. KVM:ssä tästä vastaa virtio API, joka toimii vain tietyillä laitteilla, kuten verkko- tai levysovittimella. Tästä syystä virtio-ajurit asennetaan virtuaalikoneiden sisään.

Tämän kiihtyvyyden kääntöpuoli on, että kaikki virtuaalikoneen sisällä toimivat prosessit eivät pysy sen sisällä. Tämä luo erikoistehosteita, jotka voivat aiheuttaa varastamisen. Suosittelen aloittamaan yksityiskohtaisen tutkimuksen tästä aiheesta API virtuaaliselle I/O:lle: virtio.

2.3. "Reilu" aikataulu

Hypervisorin virtuaalikone on itse asiassa säännöllinen prosessi, joka noudattaa Linux-ytimen aikataulutuksen (resurssien jakautumisen prosessien välillä) lakeja, joten katsotaanpa sitä tarkemmin.

Linux käyttää ns. CFS:ää, Completely Fair Scheduleria, josta on tullut oletusaikataulu ytimen versiosta 2.6.23 lähtien. Ymmärtääksesi tämän algoritmin, voit lukea Linux Kernel Architecturesta tai lähteestä. CFS:n ydin on prosessoriajan jakaminen prosessien välillä riippuen niiden suorittamisen kestosta. Mitä enemmän suoritinaikaa prosessi vaatii, sitä vähemmän prosessoriaikaa se saa. Tämä takaa kaikkien prosessien "reilun" suorituksen - jotta yksi prosessi ei vie kaikkia prosessoreita koko ajan, ja myös muita prosesseja voidaan suorittaa.

Joskus tämä paradigma johtaa mielenkiintoisiin esineisiin. Pitkäaikaiset Linux-käyttäjät muistavat varmasti tavallisen tekstieditorin jäätymisen työpöydälle resurssiintensiivisten sovellusten, kuten kääntäjän, käynnistyksen aikana. Tämä tapahtui, koska työpöytäsovellusten ei-resurssiintensiiviset tehtävät kilpailivat resursseja aktiivisesti kuluttavien tehtävien, kuten kääntäjän, kanssa. CFS pitää tätä epäreiluna, joten se pysäyttää ajoittain tekstieditorin ja antaa prosessorin hoitaa kääntäjätehtävät. Tämä korjattiin mekanismilla sched_autogroup, mutta monet muut ominaisuudet prosessoriajan jakautumisesta tehtävien välillä säilyivät. Itse asiassa tämä tarina ei kerro siitä, kuinka huonosti kaikki on CFS:ssä, vaan yritys kiinnittää huomiota siihen, että prosessoriajan "reilu" jakaminen ei ole kaikkein triviaalisin tehtävä.

Toinen tärkeä kohta ajoittimessa on ennaltaehkäisy. Tämä on tarpeen, jotta huumausprosessi voidaan poistaa prosessorista ja antaa muiden toimia. Pakoprosessia kutsutaan kontekstin vaihtamiseksi, prosessorin kontekstin vaihtamiseksi. Samalla tallennetaan koko tehtävän konteksti: pinon tila, rekisterit jne., jonka jälkeen prosessi lähetetään odottamaan ja tilalle tulee toinen. Tämä on kallis operaatio käyttöjärjestelmälle, ja sitä käytetään harvoin, mutta itse asiassa siinä ei ole mitään vikaa. Toistuva kontekstin vaihto voi viitata ongelmaan käyttöjärjestelmässä, mutta yleensä se jatkuu jatkuvasti eikä osoita mitään erityistä.

Näin pitkä tarina on tarpeen yhden tosiasian selittämiseksi: mitä enemmän prosessoriresursseja prosessi yrittää kuluttaa rehellisessä Linux-ajastimessa, sitä nopeammin se pysäytetään, jotta muut prosessit voivat toimia. Onko tämä oikein vai ei, on vaikea kysymys, joka ratkaistaan ​​eri tavalla eri kuormituksissa. Windowsissa ajastin keskittyi viime aikoihin asti työpöytäsovellusten ensisijaiseen käsittelyyn, mikä saattoi aiheuttaa taustaprosessien jumiutumisen. Sun Solariksella oli viisi erilaista aikataulujen luokkaa. Kun virtualisointi käynnistettiin, lisättiin kuudes, reilun osuuden ajoittajakoska edelliset viisi eivät toimineet riittävästi Solaris Zones -virtualisoinnin kanssa. Suosittelen aloittamaan yksityiskohtaisen tutkimuksen tästä aiheesta esimerkiksi kirjoilla Solaris Internals: Solaris 10 ja OpenSolaris Kernel Architecture tai Linux-ytimen ymmärtäminen.

2.4. Kuinka seurata varastamista?

Varastamisen valvonta virtuaalikoneen sisällä, kuten minkä tahansa muun prosessorimittarin, on yksinkertaista: voit käyttää mitä tahansa prosessorin metriikkatyökalua. Pääasia on, että virtuaalikoneen tulee olla Linuxissa. Jostain syystä Windows ei tarjoa tällaisia ​​tietoja käyttäjilleen. 🙁

Varastaa: kuka varastaa suoritinaikaa virtuaalikoneen
Yläkomennon tulos: prosessorin kuormituksen yksityiskohdat oikeanpuoleisessa sarakkeessa - varastaa

Vaikeus syntyy, kun tätä tietoa yritetään saada hypervisorilta. Voit yrittää ennustaa varastamista isäntäkoneella esimerkiksi Load Average (LA) -parametrilla - suoritusjonossa odottavien prosessien lukumäärän keskiarvolla. Tämän parametrin laskentamenetelmä ei ole yksinkertainen, mutta yleensä, jos prosessorin säikeiden lukumäärällä normalisoitu LA on suurempi kuin 1, tämä osoittaa, että Linux-palvelin on ylikuormitettu jollakin.

Mitä kaikki nämä prosessit odottavat? Ilmeinen vastaus on prosessorit. Mutta vastaus ei ole täysin oikea, koska joskus prosessori on vapaa ja LA menee pois mittakaavasta. Muistaa kuinka NFS putoaa ja kuinka LA kasvaa samaan aikaan. Suunnilleen sama voi olla levyn ja muiden syöttö-/tulostuslaitteiden kanssa. Mutta itse asiassa prosessit voivat odottaa minkä tahansa lukon päättymistä, sekä fyysistä, joka liittyy I / O-laitteeseen, että loogista, kuten mutex. Se sisältää myös laitteistotason lukot (sama vastaus levyltä) tai logiikkaa (ns. lukitusprimitiivit, jotka sisältävät joukon entiteettejä, mutex-adaptiivia ja spiniä, semaforeja, ehtomuuttujia, rw-lukkoja, ipc-lukkoja). ..).

Toinen LA:n ominaisuus on, että sitä pidetään käyttöjärjestelmän keskiarvona. Esimerkiksi 100 prosessia kilpailee yhdestä tiedostosta, ja sitten LA=50. Näin suuri arvo näyttää osoittavan, että käyttöjärjestelmä on huono. Mutta muulle vinoon kirjoitetulle koodille tämä voi olla normaali tila, vaikka vain se on huono, eivätkä muut käyttöjärjestelmän prosessit kärsi.

Tämän keskiarvon laskemisen (ja vähintään minuutin) vuoksi minkään LA:n määrittäminen ei ole palkitsevin tehtävä, ja tulokset ovat erittäin epävarmoja tietyissä tapauksissa. Jos yrität selvittää sen, huomaat, että Wikipedian artikkelit ja muut saatavilla olevat resurssit kuvaavat vain yksinkertaisimpia tapauksia ilman syvällistä selitystä prosessista. Lähetän jälleen kaikille kiinnostuneille tänne Brendann Greggille  - seuraa linkkejä. Kuka on laiska englanniksi - käännös hänen suositusta artikkelistaan ​​LA:sta.

3. Erikoistehosteet

Pysähdytään nyt tärkeimpiin kohtaamiimme varastustapauksiin. Kerron sinulle, kuinka ne seuraavat kaikesta yllä olevasta ja kuinka ne korreloivat hypervisorin indikaattoreiden kanssa.

Kierrätys. Yksinkertaisin ja yleisin: hypervisori kierrätetään. Itse asiassa käynnissä on paljon virtuaalikoneita, niissä on korkea prosessorin kulutus, paljon kilpailua, LA:n käyttöaste on suurempi kuin 1 (normalisoitu prosessorin säikeillä). Kaikkien virtualokkien sisällä kaikki hidastuu. Myös hypervisorista välittyvä varastaminen kasvaa, on tarpeen jakaa kuorma uudelleen tai sammuttaa joku. Yleensä kaikki on loogista ja ymmärrettävää.

Paravirtualisaatio verrattuna yksittäisiin tapauksiin. Hypervisorissa on vain yksi virtuaalikone, se kuluttaa siitä pienen osan, mutta antaa suuren I / O-kuorman esimerkiksi levylle. Ja jostain siihen ilmestyy pieni varastus, jopa 10% (kuten useat kokeet osoittavat).

Tapaus on mielenkiintoinen. Steal näkyy täällä vain paravirtualisoitujen ajurien tason lukkojen takia. Virtuaalikoneeseen luodaan keskeytys, jonka ohjain käsittelee ja siirtyy hypervisoriin. Hypervisorin keskeytyskäsittelyn vuoksi tämä näyttää lähetetyltä pyynnöltä virtuaalikoneen, se on valmis suoritettavaksi ja odottaa prosessoria, mutta sille ei anneta prosessoriaikaa. Virtuaalikone luulee, että tämä aika on varastettu.

Tämä tapahtuu sillä hetkellä, kun puskuri lähetetään, se menee hypervisorin ydintilaan, ja alamme odottaa sitä. Vaikka virtuaalikoneen näkökulmasta hänen pitäisi palata välittömästi. Siksi varastuslaskenta-algoritmin mukaan tämä aika katsotaan varastetuksi. Todennäköisesti tässä tilanteessa voi olla muita mekanismeja (esimerkiksi joidenkin sys-kutsujen käsittely), mutta niiden ei pitäisi poiketa paljon.

Ajastin suuria kuormitettuja virtuaalikoneita vastaan. Kun yksi virtuaalikone kärsii varastamista enemmän kuin toiset, tämä johtuu juuri ajoittimesta. Mitä enemmän prosessi kuormittaa prosessoria, sitä nopeammin ajastin potkaisee sen pois, jotta myös loput voivat toimia. Jos virtuaalikone kuluttaa vähän, se tuskin huomaa varastamista: sen prosessi rehellisesti istui ja odotti, sille pitäisi antaa enemmän aikaa. Jos virtuaalikone tuottaa maksimikuormituksen kaikille ytimilleen, se potkitaan useammin ulos prosessorista ja he eivät yritä antaa sille paljon aikaa.

Vielä pahempaa, kun virtuaalikoneen sisällä olevat prosessit yrittävät saada lisää prosessoria, koska he eivät pysty selviytymään tietojen käsittelystä. Sitten hypervisorin käyttöjärjestelmä antaa rehellisen optimoinnin vuoksi yhä vähemmän prosessoriaikaa. Tämä prosessi tapahtuu kuin lumivyöry, ja varastus hyppää taivaalle, vaikka muut virtuaalikoneet tuskin huomaavat sitä. Ja mitä enemmän ytimiä, sitä huonompi kone joutui jakelun alle. Lyhyesti sanottuna paljon ladatut virtuaalikoneet, joissa on monia ydintä, kärsivät eniten.

Matala LA, mutta varastaa. Jos LA on noin 0,7 (eli hypervisor näyttää olevan alikuormitettu), mutta varastamista havaitaan yksittäisten virtuaalikoneiden sisällä:

  • Edellä jo kuvattu vaihtoehto paravirtualisoinnilla. Virtuaalikone voi vastaanottaa varastamista osoittavia mittareita, vaikka hypervisorilla menee hyvin. Kokeilujemme tulosten mukaan tämä varastusvaihtoehto ei ylitä 10 %, eikä sillä pitäisi olla merkittävää vaikutusta sovelluksen suorituskykyyn virtuaalikoneen sisällä.
  • LA-parametria pidetään virheellisenä. Tarkemmin sanottuna se katsotaan jokaisena hetkenä oikeaksi, mutta yhden minuutin keskiarvolla se osoittautuu aliarvioituksi. Jos esimerkiksi yksi virtuaalikone kolmannesta hypervisorista kuluttaa kaikki prosessorinsa tasan puolen minuutin ajan, niin hypervisorin LA minuutissa on 0,15; neljä tällaista virtuaalikonetta työskentelee samanaikaisesti, antaa 0,6. Ja sitä tosiasiaa, että puolen minuutin ajan kummallakin oli villi varastettu 25 % LA:ssa mitattuna, ei voi enää vetää pois.
  • Jälleen ajoittajan takia, joka päätti, että joku söi liikaa, ja antoi tämän jonkun odottaa. Sillä välin vaihdan kontekstia, käsittelen keskeytyksiä ja hoidan muita tärkeitä järjestelmäasioita. Tämän seurauksena jotkut virtuaalikoneet eivät näe mitään ongelmia, kun taas toisten suorituskyky heikkenee vakavasti.

4. Muut vääristymät

On miljoona muuta syytä vääristää virtuaalikoneen prosessoriajan rehellistä palautusta. Esimerkiksi hyperthreading ja NUMA lisäävät laskelmien monimutkaisuutta. Ne sekoittavat täysin ytimen valinnan prosessin suorittamiseen, koska ajoittaja käyttää kertoimia - painoja, jotka kontekstia vaihdettaessa tekevät laskemisesta entistä vaikeampaa.

Teknologioista, kuten turbo boostista tai päinvastoin virransäästötilasta, aiheutuu vääristymiä, jotka käyttöastetta laskettaessa voivat keinotekoisesti lisätä tai vähentää palvelimen taajuutta tai jopa aikakvanttia. Turbo boostin ottaminen käyttöön heikentää yhden prosessorisäikeen suorituskykyä toisen suorituskyvyn lisääntymisen vuoksi. Tällä hetkellä virtuaalikoneeseen ei välity tietoa nykyisestä prosessorin taajuudesta ja se uskoo jonkun varastavan sen aikaa (esimerkiksi se pyysi 2 GHz, mutta sai puolet vähemmän).

Yleensä vääristymiin voi olla monia syitä. Tietyssä järjestelmässä saatat löytää jotain muuta. On parempi aloittaa kirjoista, joihin annoin linkit yllä, ja lukea tilastoja hypervisorista apuohjelmilla, kuten perf, sysdig, systemtap, joista kymmeniä.

5. Päätelmät

  1. Tietty määrä varastamista voi tapahtua paravirtualisoinnin vuoksi, ja sitä voidaan pitää normaalina. Internetissä he kirjoittavat, että tämä arvo voi olla 5-10%. Se riippuu virtuaalikoneen sisällä olevista sovelluksista ja siitä, mitä kuormitusta se antaa fyysisille laitteilleen. Tässä on tärkeää kiinnittää huomiota siihen, miltä sovellukset tuntuvat virtuaalikoneiden sisällä.
  2. Hypervisorin kuormituksen ja varastamisen suhde virtuaalikoneen sisällä ei aina ole yksiselitteisesti yhteydessä toisiinsa, molemmat varastamisen arviot voivat olla virheellisiä tietyissä tilanteissa eri kuormituksilla.
  3. Aikatauluttaja suhtautuu huonosti prosesseihin, jotka vaativat paljon. Hän yrittää antaa vähemmän niille, jotka pyytävät enemmän. Suuret virtuaalikoneet ovat pahoja.
  4. Pieni varastaminen voi olla normi myös ilman paravirtualisointia (ottaen huomioon virtuaalikoneen sisällä oleva kuormitus, naapureiden kuormitusominaisuudet, kuorman jakautuminen säikeiden kesken ja muut tekijät).
  5. Jos haluat selvittää varastamisen tietyssä järjestelmässä, sinun on tutkittava eri vaihtoehtoja, kerättävä mittareita, analysoitava niitä huolellisesti ja mietittävä, kuinka kuormitus jakautuu tasaisesti. Poikkeamat ovat mahdollisia kaikista tapauksista, jotka on vahvistettava kokeellisesti tai katsottava ytimen debuggerista.

Lähde: will.com

Lisää kommentti