Украде: кој го краде времето на процесорот од виртуелните машини

Украде: кој го краде времето на процесорот од виртуелните машини

Здраво! Сакам да кажам со едноставни термини за механиката на појавата на кражба во виртуелните машини и за некои неочигледни артефакти што успеавме да ги дознаеме за време на неговото истражување, во кое морав да се нурне како технички директор на платформа за облак Mail.ru Cloud Solutions. Платформата работи на KVM.

Времето за крадење на процесорот е времето во кое виртуелната машина не добива процесорски ресурси за негово извршување. Овој пат се смета само кај гостинските оперативни системи во средини за виртуелизација. Причините за тоа каде одат овие доделени ресурси, како и во животот, се многу нејасни. Но, решивме да го сфатиме тоа, дури и поставивме голем број експерименти. Не е дека сега знаеме сè за кражбата, но сега ќе ви кажеме нешто интересно.

1. Што е крадење

Значи, крадењето е метрика што укажува на недостаток на време на процесорот за процеси во виртуелна машина. Како што е опишано во закрпата на кернелот KVM, steal е времето кое хипервизорот ги извршува другите процеси на оперативниот систем на домаќинот, иако го поставил процесот на виртуелната машина во ред за извршување. Односно, крадењето се пресметува како разлика помеѓу времето кога процесот е подготвен да работи и времето кога на процесот му е доделено време на процесорот.

Јадрото на виртуелната машина ја прима метриката за крадење од хипервизорот. Во исто време, хипервизорот не наведува кои други процеси ги извршува, само „додека сум зафатен, не можам да ви дадам време“. На KVM, се додава поддршка за пресметка на крадење закрпи. Тука има две клучни точки:

  • Виртуелната машина дознава за кражба од хипервизорот. Тоа е, од гледна точка на загуби, за процесите на самата виртуелна машина, ова е индиректно мерење, кое може да биде предмет на различни нарушувања.
  • Хипервизорот не споделува информации со виртуелната машина за тоа што друго прави - главната работа е што не му посветува време. Поради ова, самата виртуелна машина не може да открие нарушувања во индикаторот за крадење, што може да се процени според природата на конкурентните процеси.

2. Што влијае на крадењето

2.1. Украде пресметка

Всушност, крадењето се смета на ист начин како и вообичаеното време на користење на процесорот. Нема многу информации за тоа како се разгледува рециклирањето. Веројатно затоа што мнозинството го смета ова прашање очигледно. Но, и тука има замки. За преглед на овој процес, прочитајте статија од Брендан Грег: ќе научите за еден куп нијанси при пресметување на искористеноста и за ситуациите кога оваа пресметка ќе биде погрешна поради следните причини:

  • Прегревање на процесорот, при што се прескокнуваат циклуси.
  • Овозможете/оневозможете турбо засилување, што ја менува фреквенцијата на часовникот на процесорот.
  • Промена во должината на временскиот дел што се случува кога се користат технологии за заштеда на енергија на процесорот, како што е SpeedStep.
  • Пресметка на просечниот проблем: едноминутната проценка на искористеноста од 80% може да скрие краткорочен излив од 100%.
  • Заклучувањето на центрифугата предизвикува враќање на процесорот, но корисничкиот процес не гледа напредок во неговото извршување. Како резултат на тоа, проценетата искористеност на процесорот од процесот ќе биде XNUMX%, иако процесот нема физички да троши време на процесорот.

Не најдов статија во која се опишува слична пресметка за кражба (ако знаете, споделете ја во коментарите). Но, судејќи според изворите, механизмот за пресметка е ист како и за рециклирање. Едноставно во кернелот се додава уште еден бројач, директно за процесот KVM (процес на виртуелна машина), кој го брои времетраењето на процесот на KVM во состојба на чекање на процесорот. Бројачот зема информации за процесорот од неговата спецификација и гледа дали сите негови крлежи се искористени во процесот на виртуелната машина. Ако сè, тогаш сметаме дека процесорот бил ангажиран само во процесот на виртуелната машина. Инаку, информираме дека процесорот правел нешто друго, се појави краде.

Процесот на броење кражби е предмет на истите проблеми како и вообичаеното броење на украдени. Да не кажам дека ваквите проблеми се појавуваат често, но изгледаат обесхрабрувачки.

2.2. Видови виртуелизација на KVM

Општо земено, постојат три типа на виртуелизација и сите се поддржани од KVM. Механизмот на појава на крадење може да зависи од типот на виртуелизација.

Емитува. Во овој случај, работата на оперативниот систем на виртуелната машина со физичките уреди на хипервизорот оди вака:

  1. Гостинскиот оперативен систем испраќа команда до својот гостин уред.
  2. Возачот на уредот за гости ја прима командата, генерира барање за BIOS-от на уредот и го испраќа до хипервизорот.
  3. Процесот на хипервизорот преведува команда во команда за физички уред, што го прави, меѓу другото, побезбеден.
  4. Возачот на физичкиот уред ја прифаќа изменетата команда и ја испраќа до самиот физички уред.
  5. Резултатите од извршувањето на командите се враќаат по истата патека.

Предноста на преводот е тоа што ви овозможува да имитирате кој било уред и не бара посебна подготовка на кернелот на оперативниот систем. Но, за ова треба да платите, пред сè, со брзина.

Виртуелизација на хардверот. Во овој случај, уредот на хардверско ниво ги разбира командите од оперативниот систем. Ова е најбрзиот и најдобриот начин. Но, за жал, не е поддржан од сите физички уреди, хипервизори и гостински оперативни системи. Во моментов, главните уреди кои поддржуваат хардверска виртуелизација се процесорите.

Паравиртуелизација. Најчестата опција за виртуелизација на уреди на KVM и воопшто најчестиот режим на виртуелизација за гостински оперативни системи. Неговата особеност е што работата со некои хипервизорски потсистеми (на пример, со мрежата или магацинот на дискот) или распределбата на мемориските страници се случува со помош на API на хипервизорот, без превод на команди на ниско ниво. Недостаток на овој метод на виртуелизација е што кернелот на гостинскиот оперативен систем треба да се измени за да може да комуницира со хипервизорот користејќи го ова API. Но, ова обично се решава со инсталирање специјални драјвери на гостинскиот оперативен систем. Во KVM ова API се нарекува Вирто АПИ.

Со паравиртуелизација, во споредба со преводот, патеката до физичкиот уред е значително намалена со испраќање на команди директно од виртуелната машина до процесот на хипервизорот на домаќинот. Ова ви овозможува да го забрзате извршувањето на сите инструкции во виртуелната машина. Во KVM, virtio API е одговорен за ова, кој работи само за одредени уреди, како што е мрежен или адаптер за диск. Затоа виртио драјверите се инсталирани во виртуелните машини.

Задната страна на ова забрзување е тоа што не сите процеси што се извршуваат во виртуелната машина остануваат внатре во неа. Ова создава некои специјални ефекти што може да предизвикаат појава на кражба. Препорачувам да започнете детално проучување на ова прашање со API за виртуелен I/O: virtio.

2.3. „Фер“ распоред

Виртуелната машина на хипервизорот е, всушност, редовен процес кој ги почитува законите за распоред (распределба на ресурсите помеѓу процесите) во кернелот на Линукс, па ајде да го разгледаме подетално.

Linux го користи таканаречениот CFS, Completely Fair Scheduler, кој стана стандарден распоредувач од кернелот 2.6.23. За да го разберете овој алгоритам, можете да ја прочитате Архитектурата на кернелот на Linux или изворот. Суштината на CFS лежи во распределбата на времето на процесорот помеѓу процесите во зависност од времетраењето на нивното извршување. Колку повеќе време на процесорот бара еден процес, толку помалку време на процесорот добива. Ова гарантира „фер“ извршување на сите процеси - така што еден процес не ги окупира сите процесори цело време, а може да се извршат и други процеси.

Понекогаш оваа парадигма води до интересни артефакти. Долгогодишните корисници на Линукс сигурно ќе се сеќаваат на замрзнувањето на обичен уредувач на текст на работната површина за време на лансирањето на апликации кои бараат ресурси, како што е компајлерот. Ова се случи затоа што задачите на десктоп апликациите кои не се интензивни за ресурси се натпреваруваа со задачите кои активно трошат ресурси, како што е компајлерот. CFS смета дека ова е неправедно, па периодично го запира уредувачот на текст и му дозволува на процесорот да се справи со задачите на компајлерот. Ова беше поправено со механизмот sched_autogroup, но останаа многу други карактеристики на распределбата на времето на процесорот помеѓу задачите. Всушност, оваа приказна не е за тоа колку е сè лошо во CFS, туку обид да се привлече вниманието на фактот дека „фер“ распределбата на времето на процесорот не е најбанална задача.

Друга важна точка во распоредувачот е превентивата. Ова е неопходно за да се исфрли процесот на snickering од процесорот и да се остават другите да работат. Процесот на егзил се нарекува префрлување на контекст, прекинувач за контекст на процесорот. Во исто време, целиот контекст на задачата е зачуван: состојбата на стекот, регистрите итн., По што процесот се испраќа да чека, а друг го зазема неговото место. Ова е скапа операција за ОС и ретко се користи, но всушност нема ништо лошо во тоа. Честото префрлување на контекстот може да укаже на проблем во оперативниот систем, но обично тоа продолжува постојано и не покажува ништо посебно.

Толку долга приказна е потребна за да се објасни еден факт: колку повеќе процесорски ресурси се обидува да потроши еден процес во чесен распоредувач на Линукс, толку побрзо ќе биде запрен за да можат да работат и другите процеси. Дали е ова правилно или не е тешко прашање, кое се решава различно под различни оптоварувања. Во Windows, до неодамна, распоредувачот беше фокусиран на приоритетна обработка на десктоп апликациите, што може да предизвика закачување на процесите во заднина. Sun Solaris имаше пет различни класи на распоредувачи. Кога беше лансирана виртуелизацијата, додадена е шеста, распоредувач на фер споделувањебидејќи претходните пет не работеа адекватно со виртуелизацијата на Solaris Zones. Препорачувам да започнете детално проучување на ова прашање со книги како Соларис внатрешни работи: Solaris 10 и OpenSolaris Kernel Architecture или Разбирање на кернелот на Линукс.

2.4. Како да се следи кражбата?

Следењето на крадењето во виртуелната машина, како и секоја друга метрика на процесорот, е едноставно: можете да користите која било метричка алатка на процесорот. Главната работа е дека виртуелната машина треба да биде на Linux. Поради некоја причина, Windows не им дава такви информации на своите корисници. 🙁

Украде: кој го краде времето на процесорот од виртуелните машини
Излезот на горната команда: детализирање на оптоварувањето на процесорот, во најдесната колона - украде

Тешкотијата се јавува кога се обидувате да ги добиете овие информации од хипервизорот. Може да се обидете да предвидите крадење на машината домаќин, на пример, со параметарот Load Average (LA) - просечната вредност на бројот на процеси кои чекаат во редот за извршување. Методот за пресметување на овој параметар не е едноставен, но генерално, ако LA нормализиран со бројот на нишки на процесорот е поголем од 1, тоа покажува дека серверот Линукс е преоптоварен со нешто.

Што чекаат сите овие процеси? Очигледниот одговор се процесорите. Но, одговорот не е сосема точен, затоа што понекогаш процесорот е бесплатен, а LA оди надвор од скалата. Запомнете како NFS паѓа и како LA расте во исто време. Приближно истото може да биде и со дискот и со други влезно/излезни уреди. Но, всушност, процесите можат да го чекаат крајот на која било брава, и физичка, поврзана со I/O уредот и логична, како што е мутекс. Вклучува и брави на хардверско ниво (ист одговор од дискот) или логика (т.н. примитиви за заклучување, кои вклучуваат куп ентитети, mutex адаптивни и спин, семафори, променливи на состојба, rw брави, ipc брави . ..).

Друга карактеристика на LA е тоа што се смета за просечна вредност за оперативниот систем. На пример, 100 процеси се натпреваруваат за една датотека, а потоа LA=50. Толку голема вредност, се чини, укажува дека оперативниот систем е лош. Но, за други криво напишани кодови, ова може да биде нормална состојба, и покрај фактот што само тој е лош, а другите процеси во оперативниот систем не страдаат.

Поради овој просек (и не помалку од една минута), одредувањето што било во однос на LA не е најисплатливата задача, со многу неизвесни резултати во конкретни случаи. Ако се обидете да го сфатите, ќе откриете дека написите на Википедија и другите достапни ресурси ги опишуваат само наједноставните случаи, без длабоко објаснување на процесот. Ги испраќам сите заинтересирани, повторно, тука до Брендан Грег  - следете ги линковите. Кој е мрзлив на англиски - превод на неговата популарна статија за ЛА.

3. Специјални ефекти

Сега да се задржиме на главните случаи на кражба што ги сретнавме. Ќе ви кажам како тие следат од сето погоре и како тие се во корелација со индикаторите на хипервизорот.

Рециклирање. Наједноставниот и најчестиот: хипервизорот се рециклира. Навистина, има многу виртуелни машини кои работат, висока потрошувачка на процесор во нив, голема конкуренција, искористеноста од LA е поголема од 1 (нормализирана со нишки на процесорот). Внатре во сите виртуелок се успорува. Расте и кражбата што се пренесува од хипервизорот, неопходно е да се прераспредели товарот или да се исклучи некој. Во принцип, сè е логично и разбирливо.

Паравиртуелизација наспроти осамени случаи. Има само една виртуелна машина на хипервизорот, таа троши мал дел од неа, но дава големо оптоварување I/O, на пример, на диск. И од некаде во него се појавува мала кражба, до 10% (како што покажуваат неколку експерименти).

Случајот е интересен. Крадењето се појавува овде само поради бравите на ниво на паравиртуелизирани возачи. Се создава прекин во внатрешноста на виртуелната машина, обработен од возачот и оди до хипервизорот. Поради прекин на обработката на хипервизорот, ова изгледа како испратено барање до виртуелната машина, подготвено е за извршување и го чека процесорот, но не му е дадено време на процесорот. Виртуелната машина мисли дека овој пат е украден.

Ова се случува во моментот кога баферот е испратен, тој оди во просторот на јадрото на хипервизорот и ние почнуваме да го чекаме. Иако, од гледна точка на виртуелната машина, тој треба веднаш да се врати. Затоа, според алгоритмот за пресметка на краде, овој пат се смета за украден. Најверојатно, може да има други механизми во оваа ситуација (на пример, обработка на уште некои повици на системот), но тие не треба да се разликуваат многу.

Распоредувач против високо оптоварени виртуелни машини. Кога една виртуелна машина страда од крадење повеќе од другите, тоа се должи токму на распоредувачот. Колку повеќе процесот го вчитува процесорот, толку побрзо распоредувачот ќе го исфрли за да може и остатокот да работи. Ако виртуелната машина троши малку, тешко дека ќе види крадење: нејзиниот процес искрено седеше и чекаше, треба да и се даде повеќе време. Ако виртуелната машина произведува максимално оптоварување на сите нејзини јадра, таа почесто се исфрла од процесорот и тие се обидуваат да не и дадат многу време.

Уште полошо, кога процесите внатре во виртуелната машина се обидуваат да добијат повеќе процесор, бидејќи не можат да се справат со обработката на податоците. Тогаш оперативниот систем на хипервизорот, поради искрената оптимизација, ќе му дава се помалку време на процесорот. Овој процес се случува како лавина и крадењето скока кон небото, иако другите виртуелни машини тешко можат да го забележат тоа. И колку повеќе јадра, толку е полоша машината што падна под дистрибуција. Накратко, најмногу страдаат високо оптоварените виртуелни машини со многу јадра.

Низок ЛА, но има краде. Ако LA е околу 0,7 (односно, се чини дека хипервизорот е недоволно оптоварен), но крадењето е забележано во поединечни виртуелни машини:

  • Опцијата веќе опишана погоре со паравиртуелизација. Виртуелната машина може да прима метрика што укажува на крадење, иако хипервизорот работи добро. Според резултатите од нашите експерименти, оваа опција за крадење не надминува 10% и не треба да има значително влијание врз перформансите на апликацијата во виртуелната машина.
  • Параметарот LA се смета за неточен. Поточно, во секој конкретен момент се смета за точен, но кога ќе се просечно над една минута, излегува дека е потценет. На пример, ако една виртуелна машина на третина од хипервизорот ги троши сите нејзини процесори точно половина минута, тогаш LA во минута на хипервизорот ќе биде 0,15; четири такви виртуелни машини кои работат истовремено ќе дадат 0,6. А тоа што по половина минута на секој од нив имаше дива кражба на 25% во однос на ЛА, веќе не може да се извлече.
  • Пак поради распоредувачот кој решил дека некој јаде премногу, а овој нека чека. Во меѓувреме, ќе го сменам контекстот, ќе се справувам со прекините и ќе се грижам за други важни системски работи. Како резултат на тоа, некои виртуелни машини не гледаат никакви проблеми, додека други доживуваат сериозна деградација на перформансите.

4. Други нарушувања

Има уште милион причини за нарушување на искреното враќање на времето на процесорот на виртуелната машина. На пример, hyperthreading и NUMA додаваат сложеност на пресметките. Тие целосно го збунуваат изборот на кернелот за извршување на процесот, бидејќи распоредувачот користи коефициенти - тежини, кои при префрлање на контекстот уште повеќе ја отежнуваат пресметката.

Има изобличувања поради технологии како турбо засилување или, обратно, режим на заштеда на енергија, кој при пресметувањето на искористеноста може вештачки да ја зголеми или намали фреквенцијата или дури и временскиот квант на серверот. Овозможувањето турбо засилување ги намалува перформансите на една нишка на процесорот поради зголемувањето на перформансите на друга. Во овој момент, информациите за моменталната фреквенција на процесорот не се пренесуваат на виртуелната машина и таа верува дека некој ѝ го краде времето (на пример, побарал 2 GHz, но добил половина).

Во принцип, може да има многу причини за изобличувања. На одреден систем, може да најдете нешто друго. Подобро е да започнете со книгите на кои им дадов линкови погоре и да читате статистика од хипервизорот со комунални услуги како perf, sysdig, systemtap, од кои десетици.

5. Заклучоци

  1. Одредена количина на кражба може да се случи поради паравиртуелизација и може да се смета за нормална. На Интернет пишуваат дека оваа вредност може да биде 5-10%. Зависи од апликациите во виртуелната машина и од тоа какво оптоварување им дава на нејзините физички уреди. Тука е важно да се обрне внимание на тоа како се чувствуваат апликациите во виртуелните машини.
  2. Односот на оптоварувањето на хипервизорот и крадењето во виртуелната машина не е секогаш недвосмислено меѓусебно поврзан, и двете проценки за кражба може да бидат погрешни во специфични ситуации при различни оптоварувања.
  3. Распоредувачот има лош став кон процесите кои бараат многу. Тој се обидува да им даде помалку на оние кои бараат повеќе. Големите виртуелни машини се зли.
  4. Мало крадење може да биде норма дури и без паравиртуелизација (земајќи го предвид оптоварувањето во виртуелната машина, карактеристиките на оптоварувањето на соседите, распределбата на оптоварувањето меѓу нишките и други фактори).
  5. Ако сакате да откриете крадење на одреден систем, треба да истражите различни опции, да соберете метрика, внимателно да ги анализирате и да размислите како рамномерно да го распределите товарот. Можни се отстапувања од какви било случаи, кои мора да се потврдат експериментално или да се погледнат во дебагерот на јадрото.

Извор: www.habr.com

Додадете коментар