Steal: tko krade CPU vrijeme virtualnim strojevima

Steal: tko krade CPU vrijeme virtualnim strojevima

Zdravo! Želim vam jednostavnim riječima ispričati o mehanici krađe unutar virtualnih strojeva io nekim neočitim artefaktima koje smo uspjeli otkriti tijekom istraživanja, au koje sam morao zaroniti kao tehnički direktor platforme u oblaku Mail.ru Cloud rješenja. Platforma radi na KVM-u.

CPU steal time je vrijeme tijekom kojeg virtualni stroj ne prima procesorske resurse za svoje izvršenje. Ovo se vrijeme računa samo u operativnim sustavima za goste u virtualizacijskim okruženjima. Razlozi kamo odlaze ti najveći alocirani resursi, kao iu životu, vrlo su nejasni. Ali odlučili smo to shvatiti, pa smo čak izveli niz eksperimenata. Nije da sada znamo sve o krađi, ali sada ćemo vam reći nešto zanimljivo.

1. Što je ukrasti

Dakle, steal je metrika koja ukazuje na nedostatak procesorskog vremena za procese unutar virtualnog stroja. Kako je opisano u zakrpi za KVM kernelStealth je vrijeme tijekom kojeg hipervizor izvršava druge procese na glavnom OS-u iako je proces virtualnog stroja stavio u red čekanja za izvršenje. Odnosno, steal se izračunava kao razlika između vremena kada je proces spreman za izvršenje i vremena kada je procesu dodijeljeno procesorsko vrijeme.

Jezgra virtualnog stroja prima metriku krađe od hipervizora. U isto vrijeme, hipervizor ne specificira točno koje još procese pokreće, jednostavno kaže "dok sam zauzet, ne mogu vam dati vremena." Na KVM-u je dodana podrška za izračun krađe zakrpe. Ovdje postoje dvije ključne točke:

  • Virtualni stroj uči o krađi od hipervizora. Odnosno, sa stajališta gubitaka, za procese na samom virtualnom stroju ovo je neizravno mjerenje koje može biti podložno različitim distorzijama.
  • Hipervizor ne dijeli informacije s virtualnim strojem o tome što još radi - glavna stvar je da ne posvećuje vrijeme tome. Zbog toga sam virtualni stroj ne može otkriti iskrivljenja u indikatoru krađe, što bi se moglo procijeniti prirodom konkurentskih procesa.

2. Što utječe na krađu

2.1. Izračun krađe

U biti, steal se izračunava približno isto kao i normalno vrijeme korištenja CPU-a. Nema puno informacija o tome kako se recikliranje razmatra. Vjerojatno zato što većina ljudi ovo pitanje smatra očiglednim. Ali i ovdje postoje zamke. Da biste se upoznali s ovim procesom, možete pročitati članak Brendana Gregga: naučit ćete o mnogim nijansama pri izračunu iskorištenja io situacijama kada će ovaj izračun biti pogrešan iz sljedećih razloga:

  • Procesor se pregrijava, što uzrokuje preskakanje ciklusa.
  • Omogućite/onemogućite turbo pojačanje, koje mijenja frekvenciju takta procesora.
  • Promjena duljine vremenskog odsječka do koje dolazi pri korištenju procesorskih tehnologija za uštedu energije kao što je SpeedStep.
  • Problem s izračunavanjem prosjeka: procjena iskorištenja jedne minute na 80% može sakriti kratkoročni nalet od 100%.
  • Spin lock uzrokuje vraćanje procesora, ali korisnički proces ne vidi nikakav napredak u svom izvršavanju. Kao rezultat toga, izračunata iskorištenost procesora od strane procesa bit će stopostotna, iako proces neće fizički trošiti procesorsko vrijeme.

Nisam pronašao članak koji opisuje sličan izračun za krađu (ako znate, podijelite to u komentarima). No, sudeći prema izvornom kodu, mehanizam izračuna je isti kao i kod recikliranja. Jednostavno, još jedan brojač je dodan u kernel, izravno za KVM proces (virtualni strojni proces), koji broji trajanje KVM procesa koji čeka CPU vrijeme. Brojač uzima podatke o procesoru iz njegove specifikacije i provjerava jesu li sve njegove oznake iskorištene od strane procesa virtualnog stroja. Ako je to sve, onda pretpostavljamo da je procesor bio zauzet samo procesom virtualnog stroja. Inače, obavještavamo da je procesor radio nešto drugo, pojavila se krađa.

Proces brojanja krađe podložan je istim problemima kao i redovito brojanje recikliranja. Nije da se takvi problemi često pojavljuju, ali izgledaju obeshrabrujuće.

2.2. Vrste virtualizacije na KVM-u

Općenito govoreći, postoje tri vrste virtualizacije, a sve ih podržava KVM. Mehanizam nastanka krađe može ovisiti o vrsti virtualizacije.

prijevod. U ovom slučaju, rad operativnog sustava virtualnog stroja s fizičkim hipervizorskim uređajima događa se otprilike ovako:

  1. Operativni sustav za goste šalje naredbu svom uređaju za goste.
  2. Upravljački program gostujućeg uređaja prima naredbu, generira 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 izmijenjenu naredbu i šalje je samom fizičkom uređaju.
  5. Rezultati izvršavanja naredbi vraćaju se istim putem.

Prednost prijevoda je što vam omogućuje emulaciju bilo kojeg uređaja i ne zahtijeva posebnu pripremu jezgre operacijskog sustava. Ali za ovo morate platiti, prije svega, brzinom.

Virtualizacija hardvera. U ovom slučaju uređaj na hardverskoj razini razumije naredbe iz operativnog sustava. Ovo je najbrži i najbolji način. No, nažalost, ne podržavaju ga svi fizički uređaji, hipervizori i gostujući operativni sustavi. Trenutačno su procesori glavni uređaji koji podržavaju hardversku virtualizaciju.

Paravirtualizacija. Najčešća opcija za virtualizaciju uređaja na KVM-u i općenito najčešći način virtualizacije za gostujuće operativne sustave. Njegova je osobitost da se rad s nekim podsustavima hipervizora (na primjer, s mrežom ili diskovnim stogom) ili dodjela memorijskih stranica odvija pomoću API-ja hipervizora, bez prevođenja naredbi niske razine. Nedostatak ove metode virtualizacije je taj što se kernel gostujućeg operacijskog sustava mora modificirati tako da može komunicirati s hipervizorom pomoću ovog API-ja. Ali to se obično rješava instaliranjem posebnih upravljačkih programa na gostujući operativni sustav. U KVM-u ovaj API se zove virtio API.

Uz paravirtualizaciju, u usporedbi s emitiranjem, put do fizičkog uređaja značajno je smanjen slanjem naredbi izravno s virtualnog stroja u proces hipervizora na glavnom računalu. To vam omogućuje da ubrzate izvršavanje svih instrukcija unutar virtualnog stroja. U KVM-u to radi virtio API, koji radi samo za određene uređaje, poput mrežnog ili diskovnog adaptera. Zbog toga se virtio drajveri instaliraju unutar virtualnih strojeva.

Loša strana ovog ubrzanja je što ne ostaju svi procesi koji se izvode unutar virtualnog stroja unutar njega. To stvara neke posebne efekte koji mogu rezultirati pojavom pri krađi. Preporučujem započeti detaljnu studiju o ovom pitanju s API za virtualni I/O: virtio.

2.3. "Pravedno" raspoređivanje

Virtualni stroj na hipervizoru je zapravo običan proces koji poštuje zakone rasporeda (distribucije resursa između procesa) u Linux kernelu, pa ga pogledajmo pobliže.

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 arhitekturu ili izvorni kod. Bit CFS-a je raspodjela procesorskog vremena između procesa ovisno o trajanju njihovog izvođenja. Što više CPU vremena proces zahtijeva, manje CPU vremena dobiva. Time se osigurava da se svi procesi izvršavaju "pošteno" - tako da jedan proces ne zauzima stalno sve procesore, a mogu se izvršavati i drugi procesi.

Ponekad ova paradigma dovodi do zanimljivih artefakata. Dugogodišnji korisnici Linuxa vjerojatno se sjećaju zamrzavanja običnog uređivača teksta na radnoj površini dok su pokretane aplikacije koje zahtijevaju velike resurse kao što je kompajler. To se dogodilo jer su se zadaci koji ne zahtijevaju velike resurse u aplikacijama za stolna računala natjecali sa zadacima koji zahtijevaju velike resurse, kao što je kompajler. CFS smatra da to nije pošteno, pa povremeno zaustavlja uređivač teksta i prepušta procesoru da se nosi sa zadacima prevoditelja. Ovo je ispravljeno pomoću mehanizma sched_autogroup, ali ostale su mnoge druge značajke 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 pozornost na činjenicu da “poštena” raspodjela procesorskog vremena nije najtrivijalniji zadatak.

Još jedna važna točka u rasporedu je prednost. Ovo je neophodno kako bi se proces snickeringa izbacio iz procesora i pustio druge da rade. Proces izbacivanja naziva se prebacivanje konteksta. U ovom slučaju, cijeli kontekst zadatka je sačuvan: stanje steka, registara itd., nakon čega se proces šalje na čekanje, a na njegovo mjesto dolazi drugi. Ovo je skupa operacija za OS i rijetko se koristi, ali nema ničeg inherentno lošeg u tome. Česta promjena konteksta može ukazivati ​​na problem u OS-u, ali obično je kontinuirana i ne ukazuje na ništa posebno.

Potrebna je tako duga priča da se objasni jedna činjenica: što više resursa procesora proces pokušava potrošiti u poštenom Linux planeru, to će brže biti zaustavljen kako bi i drugi procesi mogli raditi. Je li to točno ili ne, složeno je pitanje koje se pod različitim opterećenjima može različito riješiti. U sustavu Windows, planer je donedavno 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 virtualizaciju, dodali smo i šestu, Planer poštene dionice, jer prethodnih pet nije radilo adekvatno s virtualizacijom Solaris Zones. Preporučujem započeti detaljno proučavanje ovog pitanja s knjigama poput Solaris interno: Solaris 10 i OpenSolaris Kernel Architecture ili Razumijevanje jezgre Linuxa.

2.4. Kako pratiti krađu?

Praćenje krađe unutar virtualnog stroja, kao i bilo koje druge metrike procesora, jednostavno je: možete koristiti bilo koji alat za mjerenje procesora. Glavno je da je virtualni stroj na Linuxu. Iz nekog razloga Windows ne daje ove informacije svojim korisnicima. 🙁

Steal: tko krade CPU vrijeme virtualnim strojevima
Izlaz gornje naredbe: detalji opterećenja procesora, u krajnjem desnom stupcu - krađa

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

Što čekaju svi ti procesi? Očigledan odgovor je procesor. Ali odgovor nije sasvim točan, jer ponekad je procesor besplatan, ali LA ide izvan razmjera. Zapamtiti kako NFS pada i kako LA raste. Isto se može dogoditi s diskom i drugim ulazno/izlaznim uređajima. Ali zapravo, procesi mogu čekati kraj bilo kojeg zaključavanja, bilo fizičkog, povezanog s I/O uređajem, ili logičkog, kao što je mutex. Ovo također uključuje zaključavanje na razini hardvera (isti odgovor od diska), ili logike (tzv. locking primitives, što uključuje hrpu entiteta, mutex adaptive i spin, semafore, uvjetne varijable, rw zaključavanja, ipc zaključavanja ...).

Još jedna značajka LA je da se smatra prosjekom operativnog sustava. Na primjer, 100 procesa se natječe za jednu datoteku, a onda LA=50. Čini se da tako velika vrijednost ukazuje da je operativni sustav loš. Ali za drugi krivo napisani kod, ovo može biti normalno stanje, unatoč činjenici da je samo ono loše, a drugi procesi u operativnom sustavu ne trpe.

Zbog ovog usrednjavanja (i to ne manje od minute), određivanje bilo čega pomoću LA indikatora nije najzahvalniji zadatak, s vrlo neizvjesnim rezultatima u određenim slučajevima. Ako pokušate to shvatiti, vidjet ćete da članci na Wikipediji i drugim dostupnim izvorima opisuju samo najjednostavnije slučajeve, bez dubljeg objašnjenja procesa. Svima zainteresiranima šaljem opet ovdje Brendanu Greggu  - slijedite poveznice u nastavku. Tko je previše lijen da govori engleski - prijevod njegovog popularnog članka o LA-u.

3. Specijalni efekti

Sada pogledajmo glavne slučajeve krađe s kojima smo se susreli. Reći ću vam kako oni slijede iz svega navedenog i kako se odnose na indikatore na hipervizoru.

Recikliranje. Najjednostavniji i najčešći: hipervizor je ponovno korišten. Uistinu, ima puno pokrenutih virtualnih strojeva, velika potrošnja procesora unutar njih, velika konkurencija, iskorištenost LA veća je od 1 (normalizirano procesorskim nitima). Sve unutar svih virtualnih strojeva usporava. Krađa koja se prenosi s hipervizora također raste, potrebno je preraspodijeliti opterećenje ili nekoga isključiti. Općenito, sve je logično i razumljivo.

Paravirtualizacija naspram pojedinačnih instanci. Postoji samo jedan virtualni stroj na hipervizoru; on troši mali dio, ali proizvodi veliko I/O opterećenje, na primjer 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 blokade na razini paravirtualiziranih drivera. Prekid se stvara unutar virtualnog stroja, obrađuje ga upravljački program i šalje hipervizoru. Zbog obrade prekida na hipervizoru, za virtualni stroj izgleda kao poslani zahtjev, spreman je za izvršenje i čeka procesor, ali mu se ne daje procesorsko vrijeme. Virtualna djevojka misli da je ovo vrijeme ukradeno.

To se događa u trenutku kada je međuspremnik poslan, odlazi u kernel prostor hipervizora i mi ga počinjemo čekati. Iako bi se, s gledišta virtualnog stroja, trebao odmah vratiti. Stoga se prema algoritmu izračuna krađe ovo vrijeme smatra ukradenim. Najvjerojatnije, u ovoj situaciji mogu postojati drugi mehanizmi (na primjer, obrada nekih drugih sys poziva), ali oni ne bi trebali biti puno drugačiji.

Planer naspram visoko opterećenih virtualnih strojeva. Kada jedan virtualni stroj pati od krađe više od drugih, to je zbog planera. Što više proces opterećuje procesor, planer će ga prije izbaciti kako bi i ostali mogli raditi. Ako virtualni stroj troši malo, teško da će vidjeti krađu: njegov je proces pošteno sjedio i čekao, moramo mu dati više vremena. Ako virtualni stroj proizvodi maksimalno opterećenje na svim svojim jezgrama, često se izbacuje iz procesora i pokušavaju mu ne dati puno vremena.

Još je gore kada procesi unutar virtualnog stroja pokušavaju dobiti više procesora jer se ne mogu nositi s obradom podataka. Tada će operativni sustav na hipervizoru, zbog poštene optimizacije, davati sve manje procesorskog vremena. Taj se proces odvija poput lavine, a krađa skače u nebesa, iako to drugi virtualni strojevi jedva mogu primijetiti. A što je više jezgri, to je lošiji zahvaćeni stroj. Ukratko, najviše pate visokoopterećeni virtualni strojevi s mnogo jezgri.

Nizak LA, ali ima krađe. Ako je LA približno 0,7 (odnosno, čini se da je hipervizor nedovoljno opterećen), ali krađa se opaža unutar pojedinačnih virtualnih strojeva:

  • Opcija s paravirtualizacijom već je opisana gore. Virtualni stroj može primati 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 trebala imati značajan utjecaj na performanse aplikacija unutar virtualnog stroja.
  • Parametar LA je netočno izračunat. Točnije, u svakom pojedinom trenutku izračunat je točno, ali kada se usrednji kroz jednu minutu ispada podcijenjen. Na primjer, ako jedan virtualni stroj po trećini hipervizora troši sve svoje procesore točno pola minute, tada će LA po minuti na hipervizoru biti 0,15; četiri takva virtualna stroja koja rade istovremeno dat će 0,6. A to što je na svakom od njih pola minute bio wild steal na 25% po LA pokazatelju više se ne može izvući.
  • Opet zbog rokovnika koji je zaključio da netko previše jede i pustio da taj netko čeka. U međuvremenu ću promijeniti kontekst, rukovati prekidima i pobrinuti se za druge važne sistemske stvari. Kao rezultat toga, neki virtualni strojevi ne vide nikakve probleme, dok drugi doživljavaju ozbiljno smanjenje performansi.

4. Ostala iskrivljenja

Postoji još milijun razloga za iskrivljavanje pravednog povrata procesorskog vremena na virtualnom stroju. Na primjer, hipernitnost i NUMA unose poteškoće u izračune. Potpuno zbunjuju izbor kernela za izvođenje procesa, jer planer koristi koeficijente - težine, koji dodatno otežavaju izračun kod prebacivanja konteksta.

Postoje poremećaji zbog tehnologija kao što je turbo boost ili, obrnuto, način rada za uštedu energije, koji pri izračunavanju iskorištenja može umjetno povećati ili smanjiti frekvenciju ili čak vremenski odsječak na poslužitelju. Omogućavanje turbo pojačanja smanjuje performanse jedne procesorske niti zbog povećanja performansi druge. Trenutno se informacija o trenutnoj frekvenciji procesora ne prenosi virtualnom stroju i on vjeruje da mu netko krade vrijeme (npr. tražio je 2 GHz, a dobio je pola manje).

Općenito, može postojati mnogo razloga za distorziju. Možda ćete pronaći nešto drugo na određenom sustavu. Bolje je započeti s knjigama na koje sam gore dao poveznice i dohvaćanjem statistike iz hipervizora pomoću uslužnih programa kao što su perf, sysdig, systemtap, od kojih desetke.

5. nalazi

  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 virtualnog stroja io opterećenju koje stavlja na svoje fizičke uređaje. Ovdje je važno obratiti pozornost na to kako se aplikacije osjećaju unutar virtualnih strojeva.
  2. Omjer opterećenja hipervizora i krađe unutar virtualnog stroja nije uvijek jasno povezan; obje procjene krađe mogu biti pogrešne u određenim situacijama pod različitim opterećenjima.
  3. Planer ima loš stav prema procesima koji puno traže. Pokušava dati manje onima koji traže više. Veliki virtualni strojevi su zli.
  4. Mala krađa može biti norma čak i bez paravirtualizacije (uzimajući u obzir opterećenje unutar virtualnog stroja, karakteristike opterećenja susjeda, raspodjelu opterećenja po nitima i druge čimbenike).
  5. Ako želite otkriti krađu u određenom sustavu, morate istražiti razne opcije, prikupiti metrike, pažljivo ih analizirati i razmisliti o tome kako ravnomjerno rasporediti opterećenje. Moguća su odstupanja od bilo kojeg slučaja, što se mora eksperimentalno potvrditi ili pogledati u kernel debuggeru.

Izvor: www.habr.com

Dodajte komentar