Krađa: ko krade CPU vreme sa virtuelnih mašina

Krađa: ko krade CPU vreme sa virtuelnih mašina

Zdravo! Želim vam jednostavnim riječima ispričati o mehanici krađe unutar virtualnih mašina i o nekim neočiglednim artefaktima koje smo uspjeli otkriti tokom njegovog istraživanja, u koje sam morao zaroniti kao tehnički direktor cloud platforme Mail.ru Cloud rješenja. Platforma radi na KVM-u.

Vrijeme krađe CPU-a je vrijeme tokom kojeg virtuelna mašina ne prima procesorske resurse za svoje izvršavanje. Ovo vrijeme se računa samo u gostujućim operativnim sistemima u virtualizacijskim okruženjima. Razlozi za to kuda idu ti najveći dodijeljeni resursi, kao iu životu, vrlo su nejasni. Ali odlučili smo to shvatiti, pa čak i izveli niz eksperimenata. Nije da sada znamo sve o krađi, ali sada ćemo vam reći nešto zanimljivo.

1. Šta je krađa

Dakle, krađa je metrika koja ukazuje na nedostatak procesorskog vremena za procese unutar virtuelne mašine. Kako je opisano u zakrpi KVM kernelaStealth je vrijeme tokom kojeg hipervizor izvršava druge procese na host OS-u iako je stavio proces virtuelne mašine u red za izvršenje. To jest, krađa se izračunava kao razlika između vremena kada je proces spreman za izvršenje i vremena kada je procesu dodijeljeno procesorsko vrijeme.

Kernel virtuelne mašine prima metriku krađe od hipervizora. Istovremeno, hipervizor ne precizira tačno koje druge procese pokreće, već jednostavno kaže „dok sam zauzet, ne mogu vam dati vremena“. Na KVM-u je dodata podrška za izračunavanje krađe zakrpe. Ovdje postoje dvije ključne tačke:

  • Virtuelna mašina uči o krađi od hipervizora. Odnosno, sa stanovišta gubitaka, za procese na samoj virtuelnoj mašini ovo je indirektno merenje koje može biti podložno raznim distorzijama.
  • Hipervizor ne dijeli informacije s virtuelnom mašinom o tome šta još radi - glavna stvar je da tome ne posvećuje vrijeme. Zbog toga sama virtuelna mašina ne može detektovati izobličenja u indikatoru krađe, što se može proceniti po prirodi konkurentskih procesa.

2. Šta utiče na krađu

2.1. Obračun za krađu

U suštini, krađa se izračunava približno isto kao i normalno vrijeme korištenja CPU-a. Nema mnogo informacija o tome kako se recikliranje smatra. Vjerovatno zato što većina ljudi ovo pitanje smatra očiglednim. Ali tu postoje i zamke. Da biste se upoznali s ovim procesom, možete pročitati članak Brendana Grega: naučit ćete o puno nijansi prilikom izračunavanja iskorištenosti io situacijama kada će ovaj proračun biti pogrešan iz sljedećih razloga:

  • Procesor se pregreva, što dovodi do preskakanja ciklusa.
  • Omogućite/onemogućite turbo pojačanje, koje mijenja frekvenciju takta procesora.
  • Promjena dužine vremenskog odsječka koja se javlja kada se koriste tehnologije za uštedu energije procesora kao što je SpeedStep.
  • Problem sa izračunavanjem prosjeka: procjena iskorištenosti jednog minuta na 80% može sakriti kratkoročni nalet od 100%.
  • Zaključavanje okretanja uzrokuje vraćanje procesora, ali korisnički proces ne vidi nikakav napredak u njegovom izvršavanju. Kao rezultat toga, izračunato iskorištenje procesora od strane procesa će biti sto posto, iako proces fizički neće trošiti procesorsko vrijeme.

Nisam pronašao članak koji opisuje sličan izračun za krađu (ako znate, podijelite ga u komentarima). Ali, sudeći po izvornom kodu, mehanizam izračuna je isti kao i za reciklažu. Jednostavno, još jedan brojač se dodaje u kernel, direktno za KVM proces (virtuelni mašinski proces), koji broji trajanje KVM procesa koji čeka na CPU vreme. Brojač uzima informacije o procesoru iz njegove specifikacije i provjerava da li proces virtuelne mašine koristi sve njegove oznake. Ako je to sve, onda pretpostavljamo da je procesor bio zauzet samo procesom virtuelne mašine. U suprotnom, obavještavamo da je procesor radio nešto drugo, pojavila se krađa.

Proces brojanja ukrade je podložan istim problemima kao i redovno brojanje recikliranja. Da ne kažem da se takvi problemi često pojavljuju, ali izgledaju obeshrabrujuće.

2.2. Vrste virtuelizacije na KVM-u

Uopšteno govoreći, postoje tri vrste virtuelizacije, od kojih sve podržava KVM. Mehanizam pojave krađe može zavisiti od vrste virtuelizacije.

Broadcast. U ovom slučaju, rad operativnog sistema virtuelne mašine sa fizičkim hipervizorskim uređajima se dešava otprilike ovako:

  1. Gostujući operativni sistem šalje naredbu svom gostujućem uređaju.
  2. Drajver gostujućeg uređaja prima naredbu, generiše zahtjev za BIOS uređaja i šalje ga hipervizoru.
  3. Proces hipervizora prevodi naredbu u naredbu za fizički uređaj, čineći ga, između ostalog, sigurnijim.
  4. Upravljački program fizičkog uređaja prihvaća modificiranu naredbu i šalje je samom fizičkom uređaju.
  5. Rezultati izvršavanja naredbi se vraćaju istim putem.

Prednost prevođenja je u tome što vam omogućava emulaciju bilo kojeg uređaja i ne zahtijeva posebnu pripremu kernela operativnog sistema. Ali za ovo morate platiti, prije svega, brzinom.

Virtuelizacija hardvera. U ovom slučaju, uređaj na hardverskom nivou razumije komande iz operativnog sistema. Ovo je najbrži i najbolji način. Ali, nažalost, ne podržavaju ga svi fizički uređaji, hipervizori i gostujući operativni sistemi. Trenutno, glavni uređaji koji podržavaju virtuelizaciju hardvera su procesori.

Paravirtualizacija. Najčešća opcija za virtuelizaciju uređaja na KVM-u i generalno najčešći način virtuelizacije za gostujuće operativne sisteme. Njegova posebnost je u tome što se rad sa nekim hipervizorskim podsistemima (na primjer, sa mrežom ili stogom diska) ili dodjeljivanje memorijskih stranica odvija pomoću hipervizorskog API-ja, bez prevođenja naredbi niskog nivoa. Nedostatak ove metode virtuelizacije je što jezgro gostujućeg operativnog sistema mora biti modifikovano tako da može komunicirati sa hipervizorom koristeći ovaj API. Ali to se obično rješava instaliranjem posebnih drajvera na gostujući operativni sistem. U KVM-u se ovaj API zove virtio API.

Sa paravirtualizacijom, u poređenju sa emitovanjem, put do fizičkog uređaja je značajno smanjen slanjem komandi direktno sa virtuelne mašine u proces hipervizora na hostu. Ovo vam omogućava da ubrzate izvršavanje svih instrukcija unutar virtuelne mašine. U KVM-u to radi virtio API, koji radi samo za određene uređaje, kao što je mrežni ili disk adapter. Zbog toga su virtio drajveri instalirani unutar virtuelnih mašina.

Loša strana ovog ubrzanja je da svi procesi koji se pokreću unutar virtuelne mašine ne ostaju unutar nje. Ovo stvara neke specijalne efekte koji mogu rezultirati mrijestom pri krađi. Preporučujem da započnete detaljno proučavanje ovog pitanja sa API za virtuelni I/O: virtio.

2.3. "Pošteno" zakazivanje

Virtuelna mašina na hipervizoru je, u stvari, običan proces koji poštuje zakone raspoređivanja (distribucije resursa između procesa) u jezgru Linuxa, pa hajde da ga pobliže pogledamo.

Linux koristi takozvani CFS, Completely Fair Scheduler, koji je postao zadani planer od kernela 2.6.23. Da biste razumjeli ovaj algoritam, možete pročitati Linux Kernel Architecture ili izvorni kod. Suština CFS-a je da rasporedi procesorsko vrijeme između procesa u zavisnosti od trajanja njihovog izvršavanja. Što više CPU vremena proces zahtijeva, manje CPU vremena dobija. Ovo osigurava da se svi procesi izvršavaju "pošteno" - tako da jedan proces ne zauzima stalno sve procesore, a da se drugi procesi također mogu izvršavati.

Ponekad ova paradigma vodi do zanimljivih artefakata. Dugogodišnji korisnici Linuxa vjerovatno se sjećaju zamrzavanja običnog uređivača teksta na desktopu dok su pokrenuli aplikacije koje zahtijevaju velike resurse kao što je kompajler. To se dogodilo zato što su se zadaci u desktop aplikacijama koji nisu zahtijevali resurse takmičili sa zadacima koji zahtijevaju velike resurse, kao što je kompajler. CFS misli da je to nepravedno, pa povremeno zaustavlja uređivač teksta i pušta procesor da se bavi zadacima kompajlera. Ovo je ispravljeno pomoću mehanizma sched_autogroup, ali su ostale mnoge druge karakteristike raspodjele procesorskog vremena između zadataka. Zapravo, ovo nije priča o tome kako je sve loše u CFS-u, već pokušaj da se skrene pažnja na činjenicu da “pravedna” raspodjela procesorskog vremena nije najtrivijalniji zadatak.

Još jedna važna tačka u planeru je preemption. Ovo je neophodno da bi se izbacio proces šmrkanja iz procesora i pustio da rade drugi. Proces izbacivanja naziva se prebacivanje konteksta. U ovom slučaju je sačuvan cijeli kontekst zadatka: stanje steka, registara itd., nakon čega se proces šalje da čeka, a na njegovo mjesto dolazi drugi. Ovo je skupa operacija za OS i rijetko se koristi, ali u tome nema ništa loše. Često mijenjanje konteksta može ukazivati ​​na problem u OS-u, ali obično je kontinuirano i ne ukazuje na ništa posebno.

Ovako duga priča je potrebna da bi se objasnila jedna činjenica: što više procesorskih resursa proces pokušava da potroši u poštenom Linux planeru, to će brže biti zaustavljen tako da i drugi procesi mogu da rade. Da li je to tačno ili ne, složeno je pitanje koje se može različito riješiti pod različitim opterećenjima. U Windows-u je do nedavno planer bio fokusiran na prioritetnu obradu desktop aplikacija, što je moglo uzrokovati zamrzavanje pozadinskih procesa. Sun Solaris je imao pet različitih klasa planera. Kada smo pokrenuli virtuelizaciju, dodali smo i šestu, Raspored fer dionica, jer prethodnih pet nije radilo adekvatno sa virtualizacijom Solaris zona. Preporučujem da započnete detaljno proučavanje ovog pitanja s knjigama poput Solaris Internals: Solaris 10 i OpenSolaris Kernel Architecture ili Razumijevanje Linux kernela.

2.4. Kako pratiti krađu?

Nadgledanje krađe unutar virtuelne mašine, kao i bilo koje druge metrike procesora, je jednostavno: možete koristiti bilo koji alat za metriku procesora. Glavna stvar je da je virtuelna mašina na Linuxu. Iz nekog razloga Windows ne pruža ove informacije svojim korisnicima. 🙁

Krađa: ko krade CPU vreme sa virtuelnih mašina
Izlaz gornje komande: detalji opterećenja procesora, u krajnjem desnom stupcu - krađa

Poteškoće nastaju kada se pokušavaju dobiti ove informacije od hipervizora. Možete pokušati predvidjeti krađu na glavnoj mašini, na primjer, koristeći parametar Load Average (LA) - prosječnu vrijednost broja procesa koji čekaju u redu za izvršavanje. Metoda za izračunavanje ovog parametra nije jednostavna, ali općenito, ako je LA normaliziran brojem procesorskih niti veći od 1, to ukazuje da je Linux poslužitelj nečim preopterećen.

Šta čekaju svi ovi procesi? Očigledan odgovor je procesor. Ali odgovor nije sasvim tačan, jer ponekad je procesor slobodan, ali LA prelazi skalu. Zapamti kako NFS pada i kako LA raste. Isto se može dogoditi s diskom i drugim ulazno/izlaznim uređajima. Ali u stvari, procesi mogu čekati kraj svakog zaključavanja, bilo fizičkog, povezanog s I/O uređajem, ili logičkog, kao što je mutex. Ovo takođe uključuje zaključavanje na nivou hardvera (isti odgovor sa diska) ili logike (tzv. primitivi zaključavanja, koji uključuje gomilu entiteta, mutex adaptive i spin, semafore, varijable uslova, rw brave, ipc brave ...).

Još jedna karakteristika LA je da se smatra prosjekom operativnog sistema. Na primjer, 100 procesa se takmiče za jedan fajl, a zatim LA=50. Čini se da tako velika vrijednost ukazuje na to da je operativni sistem loš. Ali za drugi krivo napisani kod ovo može biti normalno stanje, uprkos činjenici da je samo ono loše, a ostali procesi u operativnom sistemu ne trpe.

Zbog ovog usrednjavanja (i to ne manje od jednog minuta), određivanje bilo čega pomoću LA indikatora nije najzaslužniji zadatak, s vrlo neizvjesnim rezultatima u specifičnim slučajevima. Ako pokušate to shvatiti, otkrit ćete da članci na Wikipediji i drugim dostupnim resursima opisuju samo najjednostavnije slučajeve, bez dubljeg objašnjenja procesa. Šaljem svima koji su zainteresovani, opet, ovdje za Brendana Gregga  - pratite linkove ispod. Ko je previše lijen da priča engleski - prevod njegovog popularnog članka o LA.

3. Specijalni efekti

Pogledajmo sada glavne slučajeve krađe na koje smo naišli. Reći ću vam kako oni slijede iz svega navedenog i kako su povezani s indikatorima na hipervizoru.

Reciklaža. Najjednostavniji i najčešći: hipervizor je ponovo korišten. Zaista, postoji mnogo pokrenutih virtuelnih mašina, velika potrošnja procesora unutar njih, velika konkurencija, iskorišćenost LA je više od 1 (normalizovano nitima procesora). Sve unutar svih virtuelnih mašina se usporava. Krađa koja se prenosi sa hipervizora također raste, potrebno je preraspodijeliti opterećenje ili nekoga isključiti. Generalno, sve je logično i razumljivo.

Paravirtualizacija naspram pojedinačnih instanci. Na hipervizoru postoji samo jedna virtuelna mašina; ona troši mali deo, ali proizvodi veliko I/O opterećenje, na primer na disku. I odnekud se u njemu pojavljuje mala krađa, do 10% (kao što je pokazalo nekoliko eksperimenata).

Slučaj je zanimljiv. Steal se ovdje pojavljuje upravo zbog blokiranja na nivou paravirtualiziranih drajvera. U virtuelnoj mašini se kreira prekid, obrađuje ga drajver i šalje hipervizoru. Zbog rukovanja prekidima na hipervizoru, za virtuelnu mašinu izgleda kao poslani zahtev, spreman je za izvršenje i čeka procesor, ali mu nije dato procesorsko vreme. Virtuelna devojka misli da je ovo vreme ukradeno.

To se dešava u trenutku slanja bafera, on ide u kernel prostor hipervizora i počinjemo da ga čekamo. Iako, sa stanovišta virtuelne mašine, trebalo bi da se vrati odmah. Prema tome, prema algoritmu za izračunavanje krađe, ovo vrijeme se smatra ukradenim. Najvjerovatnije u ovoj situaciji mogu postojati i drugi mehanizmi (na primjer, obrada nekih drugih sys poziva), ali oni ne bi trebali biti mnogo drugačiji.

Planer u odnosu na visoko opterećene virtuelne mašine. Kada jedna virtuelna mašina pati od krađe više od drugih, to je zbog planera. Što više proces učitava procesor, to će ga planer prije izbaciti tako da i ostali mogu raditi. Ako virtuelna mašina malo troši, teško da će videti krađu: njen proces je pošteno sedeo i čekao, moramo joj dati više vremena. Ako virtuelna mašina proizvodi maksimalno opterećenje na svim svojim jezgrama, često je izbačena iz procesora i pokušavaju da joj ne daju puno vremena.

Još je gore kada procesi unutar virtuelne mašine pokušavaju da dobiju više procesora jer se ne mogu nositi sa obradom podataka. Tada će operativni sistem na hipervizoru, zbog poštene optimizacije, pružati sve manje procesorskog vremena. Ovaj proces se odvija poput lavine, a krađa skače u nebo, iako druge virtuelne mašine to jedva primećuju. I što je više jezgri, to je gora pogođena mašina. Ukratko, najviše pate visoko opterećene virtuelne mašine sa mnogo jezgara.

Nizak LA, ali ima krađe. Ako je LA približno 0,7 (to jest, izgleda da je hipervizor podopterećen), ali se uočava krađa unutar pojedinačnih virtuelnih mašina:

  • Gore opisana opcija s paravirtualizacijom. Virtuelna mašina može primiti metriku koja ukazuje na krađu, iako je hipervizor u redu. Prema rezultatima naših eksperimenata, ova opcija krađe ne prelazi 10% i ne bi trebalo da ima značajan uticaj na performanse aplikacija unutar virtuelne mašine.
  • LA parametar je pogrešno izračunat. Tačnije, u svakom konkretnom trenutku se tačno izračunava, ali kada se usredsredi u toku jednog minuta ispada da je potcenjen. Na primjer, ako jedna virtualna mašina na trećinu hipervizora troši sve svoje procesore tačno pola minute, tada će LA po minuti na hipervizoru biti 0,15; četiri takve virtuelne mašine koje rade istovremeno daće 0,6. A to što je po pola minute na svakom od njih bilo divlje krađe na 25% prema LA indikatoru više se ne može izvući.
  • Opet zbog rasporeda koji je odlučio da neko previše jede i neka čeka. U međuvremenu ću promijeniti kontekst, upravljati prekidima i pobrinuti se za druge važne sistemske stvari. Kao rezultat toga, neke virtuelne mašine ne vide nikakve probleme, dok druge doživljavaju ozbiljnu degradaciju performansi.

4. Ostala izobličenja

Postoji još milion razloga za narušavanje poštenog povrata procesorskog vremena na virtuelnoj mašini. Na primjer, hyperthreading i NUMA unose poteškoće u proračune. Potpuno zbunjuju izbor kernela za izvršavanje procesa, jer planer koristi koeficijente - težine, što dodatno otežava izračunavanje prilikom prebacivanja konteksta.

Postoje izobličenja zbog tehnologija kao što su turbo boost ili, obrnuto, režim uštede energije, koji, kada se izračunava iskorištenost, može umjetno povećati ili smanjiti frekvenciju ili čak vremenski odsječak na serveru. Omogućavanje turbo pojačanja smanjuje performanse jedne niti procesora zbog povećanja performansi druge. U ovom trenutku virtuelnoj mašini se ne prenosi informacija o trenutnoj frekvenciji procesora, a ona smatra da joj neko krade vreme (npr. tražila je 2 GHz, ali je dobila upola manje).

Općenito, može biti mnogo razloga za izobličenje. Možda ćete pronaći nešto drugo na određenom sistemu. Bolje je početi sa knjigama do kojih sam dao linkove iznad, i preuzimanjem statistike iz hipervizora koristeći uslužne programe kao što su perf, sysdig, systemtap, od kojih desetine.

5. Zaključci

  1. Do određene količine krađe može doći zbog paravirtualizacije i to se može smatrati normalnim. Na internetu pišu da ta vrijednost može biti 5-10%. Ovisi o aplikacijama unutar virtuelne mašine i o opterećenju koje stavlja na svoje fizičke uređaje. Ovdje je važno obratiti pažnju na to kako se aplikacije osjećaju unutar virtuelnih mašina.
  2. Odnos opterećenja hipervizora i krađe unutar virtuelne mašine nije uvek jasno međusobno povezan; obe procene krađe mogu biti pogrešne u specifičnim situacijama pod različitim opterećenjima.
  3. Planer ima loš stav prema procesima koji traže mnogo. On pokušava dati manje onima koji traže više. Velike virtuelne mašine su zlo.
  4. Malo krađe može biti norma čak i bez paravirtualizacije (uzimajući u obzir opterećenje unutar virtuelne mašine, karakteristike opterećenja susjeda, raspodjelu opterećenja po nitima i druge faktore).
  5. Ako želite da shvatite krađu u određenom sistemu, morate istražiti različite opcije, prikupiti metriku, pažljivo ih analizirati i razmisliti o tome kako ravnomjerno rasporediti opterećenje. Moguća su odstupanja od bilo kojih slučajeva, što se mora eksperimentalno potvrditi ili pogledati u programu za otklanjanje grešaka u kernelu.

izvor: www.habr.com

Dodajte komentar