{"id":32331,"date":"2019-10-31T21:46:24","date_gmt":"2019-10-31T18:46:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya\/"},"modified":"2019-10-31T21:46:24","modified_gmt":"2019-10-31T18:46:24","slug":"steal-kto-kradyot-u-virtualok-protsessornoe-vremya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya","title":{"rendered":"Fura: cine fur\u0103 timp de procesor de la ma\u0219inile virtuale","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Fura: cine fur\u0103 timp de procesor de la ma\u0219inile virtuale\" src=\"\/wp-content\/uploads\/2019\/04\/23cac5d3cc3295dc6f1014e9fda36b89.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBun\u0103! Vreau s\u0103 explic pe \u00een\u021belesul tuturor mecanica apari\u021biei steal-ului \u00een cadrul ma\u0219inilor virtuale \u0219i unele artefacte nea\u0219teptate pe care am reu\u0219it s\u0103 le descoperim \u00een cercetarea pe care am realizat-o, \u00een care am fost implicat ca director tehnic al platformei cloud. <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Solu\u021bii Cloud Mail.ru<\/a><\/noindex>. Platforma func\u021bioneaz\u0103 pe KVM.<\/p>\n<p>Timpul de steal CPU este perioada \u00een care o ma\u0219in\u0103 virtual\u0103 nu prime\u0219te resurse de procesor pentru execu\u021bia sa. Acest timp este contabilizat doar \u00een sistemele de operare guest din mediile de virtualizare. Cauzele pentru care aceste resurse alocate dispar sunt foarte neclare, la fel ca \u00een via\u021b\u0103. Dar am decis s\u0103 investig\u0103m, chiar am efectuat o serie de experimente. Nu c\u0103 acum \u0219tim totul despre steal, dar avem c\u00e2teva informa\u021bii interesante de \u00eemp\u0103rt\u0103\u0219it.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Ce este steal<\/h2>\n<p>\nDeci, steal este o metric\u0103 care indic\u0103 lipsa timpului de procesor pentru procesele din cadrul ma\u0219inii virtuale. A\u0219a cum este descris <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/stable\/linux.git\/patch\/?id=c9aaa8957f203bd6df83b002fb40b98390bed078\">\u00een patch-ul nucleului KVM<\/a><\/noindex>, steal este timpul \u00een care hypervisor-ul execut\u0103 alte procese pe sistemul de operare host, de\u0219i a pus procesul ma\u0219inii virtuale \u00een coad\u0103 pentru execu\u021bie. Cu alte cuvinte, steal este calculat ca diferen\u021ba dintre momentul \u00een care procesul este gata s\u0103 fie executat \u0219i momentul \u00een care i se aloc\u0103 timpul de procesor.<\/p>\n<p>Metric\u0103 steal este ob\u021binut\u0103 de nucleul ma\u0219inii virtuale de la hypervisor. Cu toate acestea, hypervisor-ul nu precizeaz\u0103 ce alte procese execut\u0103, pur \u0219i simplu \u201ec\u00e2t timp sunt ocupat, nu pot acorda timp \u021bie\u201d. Suportul pentru calcularea steal-ului pe KVM a fost ad\u0103ugat \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/449657\/\">patch-uri<\/a><\/noindex>. Exist\u0103 dou\u0103 aspecte cheie aici: <\/p>\n<ul>\n<li>Ma\u0219ina virtual\u0103 afl\u0103 despre steal de la hypervisor. A\u0219adar, din punct de vedere al pierderilor, pentru procesele din cadrul ma\u0219inii virtuale, acesta este o m\u0103sur\u0103toare indirect\u0103, care poate fi supus\u0103 diferitelor distorsiuni.\n<\/li>\n<li>Hypervisor-ul nu \u00eemp\u0103rt\u0103\u0219e\u0219te cu ma\u0219ina virtual\u0103 informa\u021bii despre ce altceva este ocupat, esen\u021bial este c\u0103 nu \u00eei aloc\u0103 timp. Din aceast\u0103 cauz\u0103, ma\u0219ina virtual\u0103 nu poate identifica distorsiunile din indicatorul steal, care ar putea fi evaluate \u00een func\u021bie de natura proceselor concurente.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Ce influen\u021beaz\u0103 steal<\/h2>\n<p><\/p>\n<h3>2.1. Calcularea steal-ului<\/h3>\n<p>\nPractic, steal-ul este calculat aproximativ la fel ca timpul obi\u0219nuit de utilizare a procesorului. Informa\u021biile despre cum se calculeaz\u0103 utilizarea nu sunt multe. Probabil pentru c\u0103 majoritatea consider\u0103 aceast\u0103 \u00eentrebare evident\u0103. Dar aici pot ap\u0103rea \u0219i capcane. Pentru a \u00een\u021belege acest proces, se poate citi <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/blog\/2017-05-09\/cpu-utilization-is-wrong.html\">articolul Brendann Gregg<\/a><\/noindex>: ve\u021bi afla despre o mul\u021bime de detalii legate de calcularea utiliz\u0103rii \u0219i despre situa\u021biile \u00een care acest calcul poate fi gre\u0219it din urm\u0103toarele motive:<\/p>\n<ul>\n<li>Supra\u00eenc\u0103lzirea procesorului, \u00een care sunt pierdute ciclurile.\n<\/li>\n<li>Activarea\/dezactivarea turbo boost-ului, rezult\u00e2nd o modificare a frecven\u021bei de ceas a procesorului.\n<\/li>\n<li>Schimbarea duratei timpului de procesare, care apare atunci c\u00e2nd se utilizeaz\u0103 tehnologii de economisire a energiei procesorului, cum ar fi SpeedStep.\n<\/li>\n<li>Problema calculului mediu: estimarea utiliz\u0103rii de 80 % \u00eentr-un interval de un minut poate ascunde un v\u00e2rf de 100 %.\n<\/li>\n<li>Lock-ul ciclic (spin lock) face ca procesorul s\u0103 fie utilizat, dar procesul utilizatorului nu vede progrese \u00een execu\u021bia sa. Drept urmare, utilizarea procesorului calculat\u0103 va fi de 100 %, \u00een ciuda faptului c\u0103 timpul fizic de procesare nu va fi consumat de proces.\n<\/li>\n<\/ul>\n<p>\nNu am g\u0103sit articole care s\u0103 descrie un astfel de calcul pentru steal (dac\u0103 \u0219ti\u021bi, v\u0103 rog s\u0103 \u00eemp\u0103rt\u0103\u0219i\u021bi \u00een comentarii). \u00cens\u0103, judec\u00e2nd dup\u0103 surse, mecanismul de calcul este acela\u0219i ca \u0219i pentru utilizare. Pur \u0219i simplu, \u00een nucleu se adaug\u0103 un alt contor, direct pentru procesul KVM (procesul ma\u0219inii virtuale), care m\u0103soar\u0103 durata petrecut\u0103 de procesul KVM \u00een a\u0219teptarea timpului de procesare. Contorul preia informa\u021bii despre procesor din specifica\u021biile sale \u0219i verific\u0103, dac\u0103 toate ciclurile sale au fost utilizate de procesul virtual. Dac\u0103 da, consider\u0103m c\u0103 procesorul a fost dedicat exclusiv procesului ma\u0219inii virtuale. \u00cen caz contrar, inform\u0103m c\u0103 procesorul s-a ocupat cu altceva, a ap\u0103rut steal. <\/p>\n<p>Procesul de calcul al steal-ului este supus acelora\u0219i probleme ca \u0219i calculul obi\u0219nuit al utiliz\u0103rii. Nu se poate spune c\u0103 aceste probleme apar frecvent, dar arat\u0103 descurajator.<\/p>\n<h3>2.2. Tipurile de virtualizare pe KVM<\/h3>\n<p>\n\u00cen general, exist\u0103 trei tipuri de virtualizare, toate fiind suportate de KVM. Tipul de virtualizare poate influen\u021ba mecanismul de apari\u021bie a steal-ului.<\/p>\n<p><b>Transla\u021bie<\/b>. \u00cen acest caz, func\u021bionarea sistemului de operare al ma\u0219inii virtuale cu dispozitivele fizice ale hypervizorului se desf\u0103\u0219oar\u0103 aproximativ a\u0219a:<\/p>\n<ol>\n<li>Sistemul de operare gazd\u0103 trimite o comand\u0103 c\u0103tre dispozitivul s\u0103u gazd\u0103.\n<\/li>\n<li>Driverul dispozitivului gazd\u0103 prime\u0219te comanda, formeaz\u0103 o cerere pentru BIOS-ul dispozitivului \u0219i o trimite c\u0103tre hypervizor.\n<\/li>\n<li>Procesul hipervizorului traduce comenzile \u00een comenzi pentru dispozitivul fizic, asigur\u00e2ndu-le, printre altele, o securitate mai mare.\n<\/li>\n<li>Driverul dispozitivului fizic prime\u0219te comanda modificat\u0103 \u0219i o trimite mai departe c\u0103tre dispozitivul fizic.\n<\/li>\n<li>Rezultatele execu\u021biei comenzilor se \u00eentorc pe acela\u0219i traseu. \n<\/li>\n<\/ol>\n<p>\nAvantajul traducerii este c\u0103 permite emularea oric\u0103rui dispozitiv \u0219i nu necesit\u0103 preg\u0103tirea special\u0103 a nucleului sistemului de operare. Dar pentru aceasta se pl\u0103te\u0219te, \u00een primul r\u00e2nd, cu performan\u021ba. <\/p>\n<p><b>Virtualizarea hardware<\/b>. \u00cen acest caz, dispozitivul la nivel hardware \u00een\u021belege comenzile din sistemul de operare. Acesta este cel mai rapid \u0219i bun mod. Din p\u0103cate, \u00eens\u0103, nu toate dispozitivele fizice, hipervizoarele \u0219i sistemele de operare invitate \u00eel suport\u0103. \u00cen prezent, principalele dispozitive care suport\u0103 virtualizarea hardware sunt procesoarele.<\/p>\n<p><b>Paravirtualizarea<\/b>. Este cea mai r\u0103sp\u00e2ndit\u0103 variant\u0103 de virtualizare a dispozitivelor pe KVM \u0219i, \u00een general, cel mai comun mod de virtualizare pentru sistemele de operare invitate. Particularitatea sa este c\u0103 lucrul cu unele subsisteme ale hipervizorului (de exemplu, cu stiva de re\u021bea sau de disc) sau alocarea paginilor de memorie se realizeaz\u0103 prin intermediul API-ului hipervizorului, f\u0103r\u0103 traducerea comenzilor de nivel inferior. Dezavantajul acestui mod de virtualizare este necesitatea modific\u0103rii nucleului sistemului de operare invitat, astfel \u00eenc\u00e2t acesta s\u0103 poat\u0103 interac\u021biona cu hipervizorul prin acest API. Dar, de obicei, aceasta se rezolv\u0103 prin instalarea de drivere speciale pe sistemul de operare invitat. \u00cen KVM, acest API se nume\u0219te <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ibm.com\/developerworks\/library\/l-virtio\/index.html\">virtio API<\/a><\/noindex>.<\/p>\n<p>Prin paravirtualizare, comparativ cu traducerea, drumul p\u00e2n\u0103 la dispozitivul fizic este semnificativ scurtat datorit\u0103 trimiterii comenzilor direct din ma\u0219ina virtual\u0103 c\u0103tre procesul hipervizorului de pe gazd\u0103. Aceasta permite accelerarea execu\u021biei tuturor instruc\u021biunilor din interiorul ma\u0219inii virtuale. \u00cen KVM, acest lucru este asigurat de API-ul virtio, care func\u021bioneaz\u0103 doar pentru anumite dispozitive, cum ar fi adaptorul de re\u021bea sau cel de disc. De aceea, \u00een interiorul ma\u0219inilor virtuale sunt instalate drivere virtio. <\/p>\n<p>Partea negativ\u0103 a unei astfel de acceler\u0103ri este c\u0103 nu toate procesele care se desf\u0103\u0219oar\u0103 \u00een interiorul ma\u0219inii virtuale r\u0103m\u00e2n acolo. Acest lucru genereaz\u0103 anumite efecte secundare, care pot duce la apari\u021bia unor probleme. O analiz\u0103 detaliat\u0103 a acestei chestiuni recomand s\u0103 \u00eencepe\u021bi cu <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/239238\/\">O API pentru I\/O virtual: virtio<\/a><\/noindex>.<\/p>\n<h3>2.3. Programarea \u201eechitabil\u0103\u201d<\/h3>\n<p>\nO ma\u0219in\u0103 virtual\u0103 pe un hipervizor este, de fapt, un proces obi\u0219nuit care se supune legilor de programare (distribuirea resurselor \u00eentre procese) \u00een nucleul Linux, a\u0219a c\u0103 hai s\u0103 o examin\u0103m mai detaliat. <\/p>\n<p>\u00cen Linux se folose\u0219te a\u0219a-numitul CFS, Completely Fair Scheduler, care, \u00eencep\u00e2nd cu nucleul 2.6.23, a devenit managerul implicit. Pentru a \u00een\u021belege acest algoritm, se pot citi Linux Kernel Architecture sau sursele. Esen\u021ba CFS const\u0103 \u00een distribuirea timpului procesorului \u00eentre procese \u00een func\u021bie de durata execu\u021biei acestora. Cu c\u00e2t un proces necesit\u0103 mai mult timp de procesor, cu at\u00e2t prime\u0219te mai pu\u021bin din acest timp. Acest lucru garanteaz\u0103 o execu\u021bie \u201ecorect\u0103\u201d a tuturor proceselor - astfel \u00eenc\u00e2t un proces s\u0103 nu utilizeze constant toate procesoarele, iar celelalte procese s\u0103 poat\u0103 fi executate. <\/p>\n<p>Uneori, aceast\u0103 paradigm\u0103 duce la artefacte interesante. Utilizatorii de mult timp ai Linux \u00ee\u0219i amintesc cu siguran\u021b\u0103 de \u00eenghe\u021barea editorului de texte obi\u0219nuit pe desktop \u00een timpul lans\u0103rii aplica\u021biilor care consum\u0103 multe resurse, cum ar fi compilatoarele. Aceasta se \u00eent\u00e2mpla deoarece sarcinile care consumau pu\u021bine resurse ale aplica\u021biilor de desktop concurau cu sarcinile care consumau activ resurse, cum ar fi compilatorul. CFS consider\u0103 c\u0103 acest lucru nu este corect, a\u0219a c\u0103 opre\u0219te periodic editorul de texte \u0219i permite procesorului s\u0103 prelucreze sarcinile compilatorului. Aceasta a fost corectat\u0103 cu ajutorul mecanismului <noindex><a rel=\"nofollow\" href=\"https:\/\/marc.info\/?l=linux-kernel&amp;m=128978361700898\">sched_autogroup<\/a><\/noindex>, dar au r\u0103mas multe alte particularit\u0103\u021bi \u00een distribu\u021bia timpului procesorului \u00eentre sarcini. De fapt, aceasta nu este o poveste despre cum este totul r\u0103u \u00een CFS, ci o \u00eencercare de a atrage aten\u021bia asupra faptului c\u0103 distribu\u021bia \u201ecorect\u0103\u201d a timpului procesorului nu este o sarcin\u0103 trivial\u0103.<\/p>\n<p>Un alt aspect important al planificatorului este preemptarea. Acesta este necesar pentru a \u00eenl\u0103tura un proces prea ocupat de pe procesor \u0219i a permite altora s\u0103 lucreze. Procesul de \u00eenl\u0103turare se nume\u0219te comutare de context; \u00een timpul acesteia se p\u0103streaz\u0103 \u00eentregul context al sarcinii: starea stivei, registrele \u0219i altele. Dup\u0103 aceea, procesul este trimis s\u0103 a\u0219tepte, iar altul \u00eei ia locul. Aceasta este o opera\u021bie costisitoare pentru sistemul de operare \u0219i se utilizeaz\u0103 rar, dar \u00een esen\u021b\u0103 nu este nimic gre\u0219it \u00een ea. Comutarea frecvent\u0103 a contextului poate indica o problem\u0103 \u00een sistemul de operare, dar de obicei se desf\u0103\u0219oar\u0103 continuu \u0219i nu semnaleaz\u0103 nimic special.<\/p>\n<p>Aceast\u0103 poveste lung\u0103 este necesar\u0103 pentru a explica un fapt: cu c\u00e2t mai multe resurse ale procesorului \u00eencearc\u0103 s\u0103 consume un proces \u00eentr-un planificator Linux corect, cu at\u00e2t mai repede va fi oprit pentru a permite altor procese s\u0103 lucreze. Faptul c\u0103 este corect sau nu este o \u00eentrebare complicat\u0103, care se rezolv\u0103 diferit sub diverse \u00eenc\u0103rc\u0103ri. P\u00e2n\u0103 de cur\u00e2nd, \u00een Windows planificatorul era orientat spre procesarea privilegiat\u0103 a aplica\u021biilor desktop, ceea ce ducea la blocarea proceselor de fond. \u00cen Sun Solaris erau cinci clase diferite de planificatoare. C\u00e2nd a fost implementat\u0103 virtualizarea, a fost ad\u0103ugat un al \u0219aselea. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.opennet.ru\/man.shtml?topic=FSS&amp;category=7&amp;russian=4\">Planificatorul de distribu\u021bie echitabil\u0103<\/a><\/noindex>, pentru c\u0103 cele cinci anterioare nu func\u021bionau corespunz\u0103tor cu virtualizarea Solaris Zones. O cercetare detaliat\u0103 a acestei teme o recomand s\u0103 \u00eenceap\u0103 cu c\u0103r\u021bi precum <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Solaris-Internals-OpenSolaris-Kernel-Architecture\/dp\/0131482092\/\">Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture<\/a><\/noindex> sau <noindex><a rel=\"nofollow\" href=\"https:\/\/www.amazon.com\/Understanding-Linux-Kernel-Third-Daniel\/dp\/0596005652\/\">Understanding the Linux Kernel<\/a><\/noindex>.<\/p>\n<h3>2.4. Cum monitoriz\u0103m steal?<\/h3>\n<p>\nMonitorizarea steal-ului \u00een interiorul unei ma\u0219ini virtuale, ca \u0219i orice alt\u0103 metric\u0103 de procesor, este simpl\u0103: se poate folosi orice instrument de colectare a metricalor procesorului. Principalul lucru este ca virtualizarea s\u0103 fie pe Linux. \u00cen Windows, din motive necunoscute, aceast\u0103 informa\u021bie nu este disponibil\u0103 pentru utilizatori. \ud83d\ude41<\/p>\n<p><img decoding=\"async\" alt=\"Fura: cine fur\u0103 timp de procesor de la ma\u0219inile virtuale\" src=\"\/wp-content\/uploads\/2019\/04\/3c7cd04f73fd6a74b86af81382090b69.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Ie\u0219irea comenzii top: detalierea \u00eenc\u0103rc\u0103rii procesorului, \u00een ultima coloan\u0103 din dreapta \u2014 steal<\/i><\/p>\n<p>Dificultatea apare c\u00e2nd \u00eencerc\u0103m s\u0103 ob\u021binem aceste informa\u021bii de la hypervisor. Se poate \u00eencerca prezicerea steal-ului pe ma\u0219ina gazd\u0103, de exemplu, prin parametrul Load Average (LA) \u2014 valoarea medie a num\u0103rului de procese care a\u0219teapt\u0103 \u00een coad\u0103 pentru a fi executate. Metoda de calcul al acestui parametru nu este simpl\u0103, dar \u00een general, dac\u0103 LA, normalizat \u00een func\u021bie de num\u0103rul de fire de execu\u021bie al procesorului, este mai mare de 1, aceasta indic\u0103 faptul c\u0103 serverul Linux este supra\u00eenc\u0103rcat cu ceva. <\/p>\n<p>Ce a\u0219teapt\u0103 toate aceste procese? R\u0103spunsul evident este procesorul. Dar r\u0103spunsul nu este complet corect, pentru c\u0103 uneori procesorul este liber, iar LA atinge valori ridicate. Aminti\u021bi-v\u0103, <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/911976\/redhat-nfs-cluster-high-load-average-suddenly\">cum se deconecteaz\u0103 NFS \u0219i cum cre\u0219te atunci LA<\/a><\/noindex>. La fel poate fi \u0219i cu discul, \u0219i cu alte dispozitive de intrare\/ie\u0219ire. \u00cens\u0103, de fapt, procesele pot a\u0219tepta finalizarea oric\u0103rei bloc\u0103ri, fie c\u0103 este fizic\u0103, legat\u0103 de dispozitivul de intrare\/ie\u0219ire, fie logic\u0103, cum ar fi un mutex. Aceasta include \u0219i bloc\u0103rile la nivel hardware (din partea discului), sau logice (a\u0219a-numitele primitive de blocare, care cuprind o mul\u021bime de entit\u0103\u021bi, cum ar fi mutex-uri adaptive \u0219i spin, semafoare, variabile de condi\u021bie, bloc\u0103ri rw, bloc\u0103ri ipc\u2026).<\/p>\n<p>O alt\u0103 caracteristic\u0103 a LA este c\u0103 se consider\u0103 ca o medie la nivelul sistemului de operare. De exemplu, 100 de procese concureaz\u0103 pentru un singur fi\u0219ier, iar atunci LA=50. O astfel de valoare mare, aparent, sugereaz\u0103 c\u0103 sistemul de operare are probleme. Dar pentru un cod prost scris, aceasta poate fi o stare normal\u0103, \u00een timp ce, \u00een mod paradoxal, doar acela are probleme, iar celelalte procese din sistemul de operare nu sunt afectate. <\/p>\n<p>Din cauza acestui mediu (care acoper\u0103 cel pu\u021bin un minut), stabilirea unui anumit lucru pe baza indicatorului LA nu este cea mai pl\u0103cut\u0103 activitate, av\u00e2nd rezultate foarte neclare \u00een diverse cazuri. Dac\u0103 \u00eencerca\u021bi s\u0103 \u00een\u021belege\u021bi, ve\u021bi observa c\u0103 pe articolele de pe Wikipedia \u0219i alte resurse disponibile sunt descrise doar cele mai simple cazuri, f\u0103r\u0103 o explica\u021bie profund\u0103 a procesului. To\u021bi cei interesa\u021bi sunt invita\u021bi, din nou, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/blog\/2017-08-08\/linux-load-averages.html\">aici, la Brendann Gregg<\/a><\/noindex> \u00a0\u2014 mai departe pe linkuri. Pentru cei care g\u0103sesc greu limba englez\u0103 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/335326\/\">traducerea articolului s\u0103u popular despre LA<\/a><\/noindex>.<\/p>\n<h2>3. Efectele speciale<\/h2>\n<p>\nAcum ne vom concentra asupra principalelor cazuri de apari\u021bie a steal, cu care ne-am confruntat. Voi povesti despre cum decurg din toate cele spuse mai sus \u0219i cum se coreleaz\u0103 cu indicatorii de pe hypervisor.<\/p>\n<p><b>Reutilizarea<\/b>. Cel mai simplu \u0219i frecvent: hypervisorul este suprautilizat. Adev\u0103rat, foarte multe ma\u0219ini virtuale sunt pornite, consumul de procesor \u00een interiorul lor este mare, concuren\u021ba este mare, iar utilizarea LA este mai mare de 1 (\u00een normalizarea pe firele de procesor). \u00cen toate ma\u0219inile virtuale, totul este \u00eencetinit. Steal-ul, transmis de hypervisor, de asemenea, cre\u0219te, trebuie s\u0103 redistribui\u021bi sarcina sau s\u0103 opri\u021bi pe cineva. \u00cen general, totul este logic \u0219i clar.<\/p>\n<p><b>Paravirtualizare versus instan\u021be unice<\/b>. Pe hiper-vizor exist\u0103 o singur\u0103 ma\u0219in\u0103 virtual\u0103, care consum\u0103 o parte mic\u0103 din resursele sale, dar genereaz\u0103 o povar\u0103 mare \u00een ceea ce prive\u0219te input\/output, de exemplu prin disc. \u0218i dintr-un motiv oarecare, apare un mic steal, de p\u00e2n\u0103 la 10% (a\u0219a cum arat\u0103 c\u00e2teva experimente realizate).<\/p>\n<p>Un caz interesant. Steal-ul apare tocmai din cauza blocajelor la nivelul driverelor paravirtualizate. \u00cen interiorul ma\u0219inii virtuale se genereaz\u0103 o \u00eentrerupere, care este procesat\u0103 de driver \u0219i apoi trimis\u0103 la hiper-vizor. Din cauza proces\u0103rii \u00eentreruperii la hiper-vizor, pentru ma\u0219ina virtual\u0103, acest lucru apare ca un request trimis, este preg\u0103tit\u0103 de execu\u021bie \u0219i a\u0219teapt\u0103 procesorul, dar nu prime\u0219te timp de procesor. Ma\u0219ina virtual\u0103 crede c\u0103 acest timp a fost furat. <\/p>\n<p>Acest lucru se \u00eent\u00e2mpl\u0103 \u00een momentul trimiterii bufferului, care pleac\u0103 \u00een kernel space-ul hiper-vizorului \u0219i \u00eencepem s\u0103-l a\u0219tept\u0103m. Cu toate acestea, din punctul de vedere al ma\u0219inii virtuale, aceasta ar trebui s\u0103 revin\u0103 imediat. Prin urmare, conform algoritmului de calcul al steal-ului, acest timp este considerat furat. Cel mai probabil, \u00een aceast\u0103 situa\u021bie pot exista \u0219i alte mecanisme (de exemplu, procesarea altor sys calls), dar nu ar trebui s\u0103 fie foarte diferite.<\/p>\n<p><b>Programatorul \u00eempotriva ma\u0219inilor virtuale cu sarcin\u0103 mare<\/b>. C\u00e2nd o ma\u0219in\u0103 virtual\u0103 sufer\u0103 de steal mai mult dec\u00e2t altele, acest lucru este legat de programator. Cu c\u00e2t un proces \u00eencarc\u0103 mai mult procesorul, cu at\u00e2t programatorul \u00eel va expulza mai repede, astfel \u00eenc\u00e2t \u0219i celelalte s\u0103 poat\u0103 lucra. Dac\u0103 ma\u0219ina virtual\u0103 consum\u0103 pu\u021bin, aproape c\u0103 nu va observa steal-ul: procesul s\u0103u a stat lini\u0219tit \u0219i a a\u0219teptat, deci trebuie s\u0103 i se ofere mai mult timp. Dac\u0103 ma\u0219ina virtual\u0103 genereaz\u0103 o sarcin\u0103 maxim\u0103 pe toate nucleele sale, este expulzat\u0103 mai des de pe procesor \u0219i se va \u00eencerca s\u0103 nu i se ofere mult timp. <\/p>\n<p>\u0218i mai r\u0103u este c\u00e2nd procesele din interiorul ma\u0219inii virtuale \u00eencearc\u0103 s\u0103 ob\u021bin\u0103 mai mult timp de procesor, deoarece nu fac fa\u021b\u0103 proces\u0103rii datelor. Atunci sistemul de operare de pe hiper-vizor, printr-o optimizare corect\u0103, va oferi tot mai pu\u021bin timp de procesor. Acest proces se desf\u0103\u0219oar\u0103 \u00een avalan\u0219\u0103, iar steal-ul sare \u00een sus, de\u0219i celelalte ma\u0219ini virtuale ar putea s\u0103 nu-l observe aproape deloc. Cu c\u00e2t sunt mai multe nuclee, cu at\u00e2t mai r\u0103u pentru ma\u0219ina afectat\u0103. Pe scurt, cele mai afectate sunt ma\u0219inile virtuale cu sarcin\u0103 mare \u0219i un num\u0103r mare de nuclee.<\/p>\n<p><b>LA sc\u0103zut, dar exist\u0103 steal<\/b>. Dac\u0103 LA este aproximativ 0,7 (adic\u0103, hiper-vizorul pare sub\u00eenc\u0103rcat), dar \u00een interiorul unor ma\u0219ini virtuale separate se observ\u0103 steal:<\/p>\n<ul>\n<li>Varianta men\u021bionat\u0103 anterior cu paravirtualizare. Ma\u0219ina virtual\u0103 poate primi metrici care indic\u0103 un procent de steal, de\u0219i hypervisorul func\u021bioneaz\u0103 corect. Conform rezultatelor experimentelor noastre, acest tip de steal nu dep\u0103\u0219e\u0219te 10% \u0219i nu ar trebui s\u0103 aib\u0103 un impact semnificativ asupra performan\u021bei aplica\u021biilor din interiorul ma\u0219inii virtuale.\n<\/li>\n<li>Parametrul LA este calculat gre\u0219it. Mai exact, \u00een fiecare moment specific, este calculat corect, dar la o medie pe o minut\u0103, rezultatul este subestimat. De exemplu, dac\u0103 o ma\u0219in\u0103 virtual\u0103 consum\u0103 toate CPU-urile hypervisorului timp de exact o jum\u0103tate de minut, atunci LA pe hypervisor va fi 0,15; patru astfel de ma\u0219ini virtuale, func\u021bion\u00e2nd simultan, vor da 0,6. \u00cens\u0103, faptul c\u0103 fiecare dintre ele a avut un procent de steal de aproximativ 25% pe indicatorul LA timp de o jum\u0103tate de minut nu va mai putea fi recuperat.\n<\/li>\n<li>Din nou, din cauza scheduler-ului, care a decis c\u0103 cineva consum\u0103 prea mult \u0219i ar trebui s\u0103 a\u0219tepte. \u00centre timp, voi comuta contextul, voi procesa \u00eentreruperile \u0219i m\u0103 voi ocupa de alte sarcini importante ale sistemului. Ca urmare, unele ma\u0219ini virtuale nu observ\u0103 probleme, \u00een timp ce altele experimenteaz\u0103 o degradare serioas\u0103 a performan\u021bei.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>4. Alte distorsiuni<\/h2>\n<p>\nExist\u0103 \u00eenc\u0103 o sut\u0103 de motive pentru distorsiuni \u00een returnarea corect\u0103 a timpului de procesare pe ma\u0219ina virtual\u0103. De exemplu, dificult\u0103\u021bile \u00een calcul sunt generate de hyperthreading \u0219i NUMA. Acestea complic\u0103 definitiv alegerea nucleului pentru execu\u021bia procesului, deoarece scheduler-ul folose\u0219te coeficien\u021bi - greut\u0103\u021bi care, la comutarea contextului, fac calculul \u0219i mai complex.<\/p>\n<p>Distorsiunile pot ap\u0103rea \u0219i din cauza tehnologiilor precum turbo boost sau, dimpotriv\u0103, a modului de economisire a energiei, care la calcularea utiliz\u0103rii pot cre\u0219te sau reduce artificial frecven\u021ba sau chiar cuantumul de timp pe server. Activarea turbo boost-ului reduce performan\u021ba unui fir de procesor din cauza cre\u0219terii performan\u021bei altuia. \u00cen acel moment, informa\u021bia despre frecven\u021ba actual\u0103 a procesorului nu este transmis\u0103 ma\u0219inii virtuale, iar aceasta crede c\u0103 timpul ei este furat (de exemplu, a solicitat 2 GHz, dar a primit jum\u0103tate). <\/p>\n<p>\u00cen general, pot exista multe cauze pentru distorsiuni. \u00centr-un sistem specific, pute\u021bi descoperi altceva. Cel mai bine este s\u0103 \u00eencepe\u021bi cu c\u0103r\u021bile c\u0103tre care am oferit linkuri mai sus \u0219i s\u0103 colecta\u021bi statistici de la hypervisor folosind utilitare precum perf, sysdig, systemtap, dintre care <noindex><a rel=\"nofollow\" href=\"https:\/\/jvns.ca\/blog\/2017\/07\/05\/linux-tracing-systems\/\">sunt zeci<\/a><\/noindex>.<\/p>\n<h2>5. Concluzii<\/h2>\n<p><\/p>\n<ol>\n<li>Une anumit\u0103 cantitate de steal poate ap\u0103rea din cauza paravirtualiz\u0103rii \u0219i poate fi considerat\u0103 normal\u0103. Pe internet se scrie c\u0103 aceast\u0103 valoare poate ajunge la 5-10%. Depinde de aplica\u021biile din interiorul ma\u0219inii virtuale \u0219i de \u00eenc\u0103rc\u0103tura pe care o genereaz\u0103 asupra dispozitivelor fizice. Este important s\u0103 se acorde aten\u021bie modului \u00een care se simt aplica\u021biile din interiorul ma\u0219inilor virtuale.\n<\/li>\n<li>Raportul dintre \u00eenc\u0103rc\u0103tura pe hypervisor \u0219i steal-ul din interiorul ma\u0219inii virtuale nu este \u00eentotdeauna direct corelat; ambele evalu\u0103ri ale steal-ului pot fi eronate \u00een anumite situa\u021bii, \u00een func\u021bie de diferitele \u00eenc\u0103rc\u0103turi.\n<\/li>\n<li>Scheduler-ul are o aversiune fa\u021b\u0103 de procesele care cer prea mult. Se str\u0103duie\u0219te s\u0103 ofere mai pu\u021bin celor care cer mai mult. Marii furnizori virtuali sunt o problem\u0103.\n<\/li>\n<li>Un mic steal poate fi normal \u0219i f\u0103r\u0103 paravirtualizare (\u021bin\u00e2nd cont de \u00eenc\u0103rc\u0103tura din interiorul ma\u0219inii virtuale, particularit\u0103\u021bile \u00eenc\u0103rc\u0103rilor vecinilor, distribu\u021bia \u00eenc\u0103rc\u0103turii pe fire \u0219i al\u021bi factori).\n<\/li>\n<li>Dac\u0103 dori\u021bi s\u0103 determina\u021bi steal-ul \u00eentr-un sistem specific, este necesar s\u0103 explora\u021bi diverse op\u021biuni, s\u0103 colecta\u021bi metrice, s\u0103 le analiza\u021bi cu aten\u021bie \u0219i s\u0103 g\u00e2ndi\u021bi cum s\u0103 distribui\u021bi sarcina uniform. Este posibil ca abaterile s\u0103 apar\u0103 \u00een orice scenariu, care trebuie confirmate experimental sau analizate \u00een debugger-ul kernel-ului.\n<\/li>\n<\/ol>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/449316\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0425\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u043e \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f steal \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0438 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0442\u0435\u0445\u0434\u0438\u0440\u0443 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Mail.ru Cloud Solutions. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 KVM. CPU steal time \u2014 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24147,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Steal: \u043a\u0442\u043e \u043a\u0440\u0430\u0434\u0451\u0442 \u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:46:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:46:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Steal: cine fur\u0103 timpul de procesare al ma\u0219inilor virtuale | ProHoster","description":"Bun\u0103!","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Steal: \u043a\u0442\u043e \u043a\u0440\u0430\u0434\u0451\u0442 \u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:46:24+00:00","article:modified_time":"2019-10-31T18:46:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32331","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 10:21:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:00:23","updated":"2026-01-21 10:21:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=32331"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32331\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24147"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=32331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=32331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=32331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}