Steal: kes varastab virtuaalmasinatelt protsessorite aega

Steal: kes varastab virtuaalmasinatelt protsessorite aega

Tere! Soovin rääkida lihtsas keeles, kuidas toimub steal'i tekkimine virtuaalmasinates ja mõnest varjatud artefaktist, mille me avastasime selle uurimise käigus, kuhu mul oli vaja süveneda kui pilveteenuse tehniliseks juhiks. Mail.ru Pilve Lahendused. Platvorm töötab KVM-i peal.

CPU steal aeg on aeg, mille jooksul virtuaalmasin ei saa protsessorilt ressursse oma tööks. See aeg arvestatakse ainult külalisoperatsioonisüsteemides virtualiseerimiskeskkondades. Põhjused, kuhu need määratud ressursid kaovad, on sama ebaselged nagu elus. Kuid me otsustasime asja uurida, korraldades terve hulga eksperimente. See ei tähenda, et me nüüd kõike steal'ist teame, aga midagi huvitavat räägime nüüd.

1. Mis on steal

Seega, steal on metrika, mis näitab, et virtuaalmasinas puudub protsessoriaeg protsesside jaoks. Nagu on kirjeldatud KVM-i kernelipatch'is, steal on aeg, mille jooksul hüperviisor täidab muid protsesse host-operatsioonisüsteemis, kuigi ta on virtuaalmasina protsessi täitmise järjekorda pannud. Ehk siis, steal arvestatakse kui vahe aegade vahel, kui protsess on valmis töötama ja kui protsessorile antakse aeg.

Virtuaalmasina kernel saab steal'i mõõtmed hüperviisorilt. Samas ei ütle hüperviisor, milliseid muid protsesse ta täidab, lihtsalt "kuna olen hõivatud, ei saa ma sulle aega anda". KVM-is on steal'i arvestamise tugi lisatud patchidesse. Siin on kaks võtmepunkti:

  • Virtuaalmasin saab steal'i hüperviisorilt. Ehk siis, kaotuste perspektiivist vaadates on see virtuaalmasinas olevate protsesside jaoks kaudne mõõde, mis võib olla erinevate moonutuste all.
  • Hüperviisor ei jaga virtuaalmasinaga teavet selle kohta, millega ta veel hõivatud on — oluline on, et ta ei pühenda sellele aega. Seetõttu ei saa virtuaalmasin ise tuvastada steal'i näitaja moonutusi, mida võiks hinnata konkurentsi protsesside olemuse kaudu.

2. Mis mõjutab steal'i

2.1. Steali arvutamine

Sisuliselt arvutatakse steal ligikaudu samamoodi nagu tavapärane protsessori kasutuse aeg. Teavet selle kohta, kuidas kasutust arvutatakse, ei ole palju. Tõenäoliselt seetõttu, et enamik peab seda küsimust iseenesestmõistetavaks. Kuid siin võivad samuti esineda varjatud probleemid. Selle protsessiga tutvumiseks võib lugeda Brendann Greggi artikkel: saate teada palju nüansse ressursside kasutuse arvutamisel ja olukordadest, kus see arvutus võib olla vale järgmiste põhjuste tõttu:

  • Protsessori ülekuumenemine, mille tõttu käivituvad taktid vahele.
  • Turboinglise sisse- ja väljalülitamine, mille tulemusena muutub protsessori taktsagedus.
  • Ajavaliku muudatus, mis toimub protsessori energiasäästutehnoloogiate, nagu SpeedStep, kasutamise korral.
  • Keskmise arvutamise probleem: 80% kasutuse hindamine ühe minuti jooksul võib varjata lühiajalist puhangut 100%.
  • Tsükliline lukustus (spin lock) toob kaasa olukorra, kus protsessor on kasutuses, kuid kasutaja protsess ei näe oma täitmisel edusamme. Tulemusena on protsessori arvutatud kasutus 100%, kuigi füüsiliselt ei kasuta protsessor protsessiga aega.

Artiklit, mis kirjeldab sarnast arvutust steal'i jaoks, ei leidnud (kui teate — jagage kommentaarides). Kuid lähtekoodide põhjal on arvutamise mehhanism sama, mis kasutuse puhul. Lihtsalt tuumale lisatakse veel üks loendur, mis on otseselt KVM protsessi (virtuaalmasina protsess) jaoks, mis loendab aja, mille jooksul KVM protsess on oodanud protsessori aega. Loendur võtab protsessori kohta teavet selle spetsifikatsioonist ja vaatab, kas kõik selle tikid on virtuaalmasina protsessis kasutatud. Kui kõik, siis arvestame, et protsessor tegeles ainult virtuaalmasina protsessiga. Vastasel juhul teavitame, et protsessor tegeleb millegi muuga, steal on tekkinud.

Steal'i arvutamise protsess on samaaegselt allutatud samadele probleemidele nagu tavapärane kasutuse arvutamine. Mitte, et need probleemid sageli esineksid, kuid näevad välja heidutavalt.

2.2. KVM Virtualiseerimise Tüübid

Üldiselt on olemas kolm virtualiseerimise tüüpi, kõik KVM-i poolt toetatud. Virtualiseerimise tüüp võib mõjutada steal'i tekkemehhanismi.

Otseülekanne. Sel juhul toimub virtuaalmasina operatsioonisüsteemi töö füüsiliste hüperviisori seadmetega enam-vähem nii:

  1. Külastusoperatsioonisüsteem saadab oma külalisseadmest käsu.
  2. Külastusseadme draiver võtab käsu vastu, koostab BIOS-i seadme jaoks päringu ja saadab selle hüperviisorisse.
  3. Hüperviisori protsess tõlgib käsu füüsilise seadme käsuks, muutes selle sealhulgas turvalisemaks.
  4. Füüsilise seadme draiver võtab muudetud käsu ja saadab selle juba füüsilisele seadmele.
  5. Käskude täitmise tulemused tulevad tagasi sama teed pidi.

Tõlke eelis on selles, et see võimaldab emuleerida igasuguseid seadmeid ja ei nõua operatsioonisüsteemi tuuma erilist ettevalmistamist. Kuid selle eest tuleb tasuda peamiselt jõudlusega.

Riistvaraline virtualiseerimine. Sel juhul mõistab seade riistvaratasandil operatsioonisüsteemist saadud käske. See on kõige kiirem ja parim meetod. Kahjuks toetavad seda vaid vähesed füüsilised seadmed, hüperviisorid ja külalisoperatsioonisüsteemid. Praegu on peamised seadmed, mis toetavad riistvaralist virtualiseerimist, protsessorid.

Paravirtualiseerimine (paravirtualization). Kõige levinum variant seadmete virtualiseerimiseks KVM-is ja üldiselt kõige laialdasem virtualiseerimise režiim külalisoperatsioonisüsteemide jaoks. Selle eripära on see, et teatud hüperviisori alamsüsteemide (näiteks võrgu- või kettaväärise) või mälu lehtede jagamine toimub hüperviisori API kaudu, ilma madala taseme käskude tõlkimiseta. Selle virtualiseerimismeetodi puuduseks on vajadus modifitseerida külalisoperatsioonisüsteemi tuuma, et see saaks suhelda hüperviisoriga selle API abil. Kuid tavaliselt lahendatakse see külalisoperatsioonisüsteemi spetsiaalsete draiverite installimisega. KVM-is nimetatakse seda API-d virtio API.

Paravirtualiseerimise puhul on võrreldes tõlgiga tee füüsilisse seadmesse oluliselt lühem, kuna käsud saadetakse otse virtuaalmasinast hüperviisori protsessi hostis. See kiirendab kõigi käskude täitmist virtuaalmasinas. KVM-is vastutab selle eest virtio API, mis töötab ainult teatud seadmete, näiteks võrgu- või kettaadapteriga. Just seetõttu installitakse virtuaalmasinadesse virtio-draiverid.

Selle kiirususe tagajärg on see, et mitte kõik protsessid, mis töötavad virtuaalmasinas, jäävad sinna. See loob teatud eriefekte, mis võivad viia steal'i tekkimiseni. Soovitan selle teema põhjalikuks uurimiseks alustada. Virtuaalse I/O API: virtio.

2.3. "Tasakaalustatud" ajakava

Virtuaalmasin hüpervisori peal on tegelikult tavaline protsess, mis allub ajastamise seadustele (ressursside jaotamine protsesside vahel) Linuxi tuumas, seega vaatleme seda lähemalt.

Linuxis kasutatakse nn CFS-i, Completely Fair Scheduler, alates tuumast 2.6.23, mis on saanud vaikimisi ajakava. Selle algoritmi mõistmiseks võib lugeda Linux Kernel Architecture või allikaid. CFS-i olemus seisneb protsessoriaja jaotamises protsesside vahel sõltuvalt nende täitmise kestusest. Mida rohkem protsessorit aega protsess vajab, seda vähem seda aega ta saab. See tagab, et kõik protsessid täidetakse "ausalt" — et üks protsess ei kasutaks pidevalt kõiki protsessoreid ning et ka teised protsessid saaksid töötada.

Mõnikord viib selline paradigma huvitavate artefaktide tekkeni. Pikalt Linuxit kasutanud inimesed mäletavad kindlasti tavalise tekstiredaktori seiskumist töölaual ressursimahukate rakenduste, näiteks kompilaatorite, käivitamise ajal. See juhtus seetõttu, et mitte ressursimahukad ülesanded töölauarakendustes konkureerisid ressursse aktiivselt tarbivate ülesannetega nagu kompilaator. CFS arvab, et see pole aus, seega peatab see perioodiliselt tekstiredaktori ja annab protsessorile võimaluse töödelda kompilaatori ülesandeid. Seda parandati mehhanismi abil. sched_autogroup, kuid paljusid muid CPU aja jaotamise eripärasid on jäänud alles. Tegelikult ei räägi see jutustus sellest, kui halb CFS on, vaid katse juhtida tähelepanu sellele, et "aus" protsessorite aja jaotamine pole üldse triviaalne ülesanne.

Veel tähtis moment ajakavandis on preemption. See on vajalik, et tõrjuda protsessorilt liialdava ressursikasutusega protsess ja anda võimalus teistele töödelda. Protsessi tõrjumist nimetatakse konteksti vahetamiseks, mis tähendab protsessori konteksti vahetamist. Sel juhul säilitatakse kogu ülesande kontekst: steki seisund, registrid ja muud, pärast mida protsess saadetakse ootama, samas kui tema kohale astub teine. See on operatsioonile kallis ja kasutatakse harva, kuid tegelikult ei ole selles midagi halba. Sage konteksti vahetus võib viidata probleemile operatsioonisüsteemis, kuid tavaliselt toimub see pidevalt ega näita midagi erilist.

Nii pikk jutt on vajalik ühe fakti selgitamiseks: mida rohkem protsessori ressursse püüab õiglaselt ajakava Linuxis kasutada, seda kiiremini ta peatatakse, et teised protsessid saaksid samuti töötada. Kas see on õige või vale, on keeruline küsimus, mille lahendamine varieerub sõltuvalt koormusest. Windowsis oli ajakava seni suunatud peamiselt töölauarakenduste prioriteediks, mistõttu võisid taustprotsessid hanguda. Sun Solarisel oli viis erinevat ajakava klassi. Virtuaal-serverite käivitamisel lisati kuues. Õiglase jagamise ajakava, kuna eelmised viis töötasid Solaris Zones'i virtualiseerimisega ebaausa viisil. Selle teema põhjaliku uurimise soovitan alustada raamatutest nagu Solaris Internals: Solaris 10 ja OpenSolaris Kernel Architecture või Understanding the Linux Kernel.

2.4. Kuidas jälgida steali?

Steali jälgimine virtuaalmasinas, nagu ka mistahes muu protsessori mõõdik, on lihtne: saab kasutada mis tahes protsessorimõõdikute kogumise tööriista. Peamine on, et virtuaalmasin oleks Linuxil. Windows ei paku selle teabe osas oma kasutajatele teadmisi. 🙁

Steal: kes varastab virtuaalmasinatelt protsessorite aega
Top-käskluse väljund: protsessori koormuse detailide vaatamine, kõige paremal veerus - steal

Raskused tekivad, kui proovida neid andmeid saada hüperviisorilt. Võib proovida ennustada steali hostmasinas näiteks Load Average (LA) määramatuse järgi - protsesside keskmise arvu, mis ootab täitmist. Selle näitaja arvutamise meetod ei ole lihtne, kuid üldiselt, kui protsessoriteemaga normaliseeritud LA on suurem kui 1, näitab see, et Linuxi server on millegagi üle koormatud.

Mida kõik need protsessid ootavad? Ilmselge vastus on protsessor. Kuid see vastus ei ole päris õige, sest vahel on protsessor vaba, aga LA on kõrge. Meenutage, kuidas NFS kukub ja kuidas seejuures LA suureneb.Sarnaselt võib juhtuda ka ketta ja teiste sisendi/väljundi seadmetega. Tegelikult võivad protsessid oodata mistahes blokeeringu lõppemist, olgu see fiziline, mis on seotud sisendi/väljundi seadmega, või loogiline, näiteks muteks. Siia alla kuuluvad ka rauatasandi blokeeringud (näiteks vastus kettalt) või loogika (nii-öelda blokeeringu primitiivid, mis sisaldavad hulgaliselt ühtsusi, adaptiivne muteks ja spin, semaforid, seisundimuutujad, rw lukud, ipc lukud…).

Veel üks LA eripära on see, et see loetakse kui keskmine väärtus kogu operatsioonisüsteemis. Näiteks kui 100 protsessi konkureerivad ühe faili üle, siis LA=50. Tundub, et selline suur väärtus viitab sellele, et operatsioonisüsteemil on raske. Kuid halvasti kirjutatud koodi puhul võib see olla normaalne seisund, kus halb on ainult sellele koodile, samas kui teised protsessid operatsioonisüsteemis ei kannata.

Selle keskmistamise tõttu (mida arvestatakse vähemalt minuti jooksul) on LA näitaja alusel millegi määramine mitte just kõige tänuväärsem ülesanne, millel on väga ebamugavad tulemused konkreetsetes olukordades. Kui üritate aru saada, avastate, et Vikipeedias ja teistes kergesti kättesaadavates ressurssides on kirjeldatud vaid kõige lihtsamaid juhtumeid, ilma sügava protsessi seletamata. Kõik, keda huvitab, saatke jälle siia, Brendann Greggi juurde  — edasi linkide kaudu. Kui inglise keel on tülikas — tema populaarse artikli tõlke LA-st.

3. Eriefektid

Nüüd peatume peamistel juhtudel, kus steal esineb ja millega oleme kokku puutunud. Räägin, kuidas need tulenevad kõigest eelöeldust ja kuidas need seostuvad hüperviisori näitajatega.

Taaskasutamine. Kõige lihtsam ja sagedasem: hüperviisor on ületäitunud. Tõepoolest, palju virtuaalmasinaid on sisse lülitatud, kvartalipõhine suur protsessoritarbimine, suur konkurents, LA ületab 1 (protsessorite lõngade normaliseerimise järgi). Kõikides virtuaalmasinates on kõik aeglane. Steal, mis tuleb hüperviisorilt, tõuseb samuti, tuleb koormust ümber jaotada või kedagi välja lülitada. Üldiselt on see kõik loogiline ja arusaadav.

Paravirtualiseerimine versus üksikud instantsid. Hüperehitusel on ainult üks virtuaalmasin, mis tarbib väikest osa, kuid loob suurt koormust sisendi/jõudluse osas, näiteks kettal. Ja kuskilt on selles väike steal, kuni 10 % (nagu on näidanud mitmed eksperimendid).

Huvitav juhtum. Steal tekib siin just hübriidsete draiverite tasemel blokeeringute tõttu. Virtuaalmasinas luuakse katkemine, mida töötleb draiver ja suunatakse hüperehitusele. Katkemise töötlemise tõttu hüperehituses tundub virtuaalmasinale, et see on saadetud otsus, ta on valmis täitmiseks ja ootab protsessorit, kuid protsessoriaega ei anta. Virtuaalmasin arvab, et see aeg on varastatud.

See juhtub vahemälu saatmise ajal, see suundub hüperehituse kernel space'i ja me hakkame seda ootama. Kuigi, virtuaalmasina vaatevinklist, peaks see kohe tagasi tulema. Seega, steal arvutamise algoritmi kohaselt loetakse see aeg varastatuks. Enamasti võivad selles olukorras olla ka muud mehhanismid (näiteks mõne sys call'i töötlemine), kuid need ei tohiks palju erineda.

Ajakava kõrge koormusega virtuaalmasinate vastu. Kui üks virtuaalmasin kannatab rohkem steal'i all kui teised, on see seotud tegelikult ajakavaga. Mida rohkem protsessorit protsess koormab, seda kiiremini ajakava ta välja viskab, et teisedki saaksid töötada. Kui virtuaalmasin tarbib vähe, ei pruugi ta steal'i peaaegu üldse märgata: tema protsess istus ausalt ja ootas, talle on vaja anda rohkem aega. Kui virtuaalmasin genereerib maksimaalset koormust kõigis oma tuumades, visatakse ta sagedamini protsessorilt välja ja püütakse mitte anda palju aega.

Veel hullem on see, kui protsessid virtuaalmasinas püüavad saada rohkem protsessorit, sest nad ei suuda andmeid töödelda. Siis annab hüperehituse operatsioonisüsteem, ausa optimeerimise arvelt, üha vähem protsessoriaega. See protsess toimub üliraskelt ja steal tõuseb taevasse, kuigi teised virtuaalmasinad ei pruugi seda peaaegu märgata. Ja mida rohkem tuumasid, seda hullem on hädas olev masin. Lühidalt öeldes, kõige rohkem kannatavad kõrge koormusega virtuaalmasinad, millel on palju tuumasid.

Madala LA, kuid on steal. Kui LA on umbes 0,7 (st hüperehitus paistab olevat alakoormatud), kuid individuaalsetes virtuaalmasinates täheldatakse steal'i:

  • Nagu juba eelnevalt kirjeldatud, võib hüpervisori paravirtualiseerimise variant teoreetiliselt saada mõõdikuid, mis näitavad steal'i, kuigi hüpervisori enda jaoks on kõik hästi. Meie katsetuste tulemuste põhjal ei ületa selline steal'i näitaja 10%, mis ei tohiks olulisel määral mõjutada rakenduste jõudlust virtuaalses masinas.
  • LA parameeter arvutatakse valesti. Täpsemalt öeldes arvutatakse see igas konkreetses hetkes õigesti, kuid keskmistades minutiks jääb tulemus madalamaks. Näiteks, kui üks virtuaalne masin tarbib hüpervisori protsessoreid täpselt pool minutit, siis LA hüpervisoris on 0,15; neli sellist virtuaalset masinat, mis töötavad samal ajal, annavad 0,6. Kuid see, et pool minutit oli igaühel nendest 25% steal'i näitaja, ei muuda enam midagi.
  • Kordame veel, et skeemi tõttu, mis otsustab, et keegi sööb liiga palju, ja lubab sellel keegi oodata. Ja samal ajal lülitan ma konteksti ümber, töödlen katkestusi ja tegelen muude oluliste süsteemiasjadega. Lõpuks ei näe mõned virtuaalsed masinad mingeid probleeme, samas kui teised kogevad tõsist jõudluse langust.

4. Muud moonutused

On veel miljon põhjust, miks virtuaalmasinas protsessorite aja ausast jaotamisest moonutusi tekib. Näiteks toovad hüpertuuma ja NUMA arvutustes oma keerukuse, segades protsessi täitmiseks tuuma valimist, kuna skeem kasutab koefitsiente - kaalu, mis konteksti vahetamisel muudavad arvutamise veelgi keerulisemaks.

Moonutusi võivad põhjustada ka tehnoloogiad nagu turbo boost või vastupidi, energiasäästurežiim, mis arvutuste käigus võib kunstlikult tõsta või langetada sagedust või isegi serveri ajatud. Turbo boost'i aktiveerimine vähendab ühe protsessori lõime jõudlust tänu teise lõime jõudluse tõusule. Sel hetkel ei edastata virtuaalsele masinale teavet töötava protsessori reaalsest sagedusest, mistõttu ta arvab, et tema aega varastatakse (näiteks, kui ta soovis 2 GHz, kuid sai poole vähem).

Kokkuvõttes võib moonutuste põhjuseid olla palju. Teatud süsteemis võite avastada midagi veel. Alustage parem raamatutest, millele ma eelnevalt viitasin, ja statistika kogumisest hüpervisorist selliste tööriistadega nagu perf, sysdig, systemtap, milliseid on kümneid.

5. Järeldused

  1. Mõni aeg-ajalt esinev steal võib olla seotud paravirtuaalsusega ja seda võib pidada normaalseks. Internetis kirjutatakse, et see väärtus võib olla 5-10%. See sõltub virtuaalmasinas olevatest rakendustest ja sellest, kui suurt koormust nad füüsilistele seadmetele avaldavad. Siin on oluline tähele panna, kuidas käituvad rakendused virtuaalmasinates.
  2. Hüpperviisori koormuse ja virtuaalmasinas oleva steal'i suhe ei ole alati üheselt mõistetav, mõlemad steal'i hindamised võivad olla konkreetsetes olukordades erinevate koormuste korral vale.
  3. Sheduler ei suhtu hästi protsessidesse, mis sageli ressursse küsivad. Ta püüab anda vähem neile, kes paluvad rohkem. Suured virtuaalmasinad on probleem.
  4. Mõni väike steal võib olla normaalne ka ilma paravirtuaalsuseta (arvestades virtuaalmasinas olevat koormust, naaberprotsesside koormuse eripära, koormuse jaotust tõmblukude vahel ja muid tegureid).
  5. Kui soovite välja selgitada steal'i konkreetses süsteemis, tuleb uurida erinevaid variante, koguda mõõdikud, hoolikalt analüüsida ja mõelda, kuidas koormust ühtlaselt jaotada. Ükskõik millistest juhtudest võivad esineda kõrvalekalded, mida tuleb katsetamise teel kinnitada või jälgida kernelide debugeeris.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster