Крађа: ко краде ЦПУ време са виртуелних машина

Крађа: ко краде ЦПУ време са виртуелних машина

Здраво! Желим да вам кажем једноставним речима о механици крађе унутар виртуелних машина и о неким неочигледним артефактима које смо успели да откријемо током његовог истраживања, у које сам морао да зароним као технички директор клауд платформе Маил.ру Цлоуд Солутионс. Платформа ради на КВМ-у.

Време крађе ЦПУ-а је време током којег виртуелна машина не прима процесорске ресурсе за своје извршење. Ово време се рачуна само у гостујућим оперативним системима у окружењима виртуелизације. Разлози због којих иду ови највећи додељивани ресурси, као иу животу, веома су нејасни. Али одлучили смо да то схватимо, па чак и извели низ експеримената. Није да сада знамо све о крађи, али сада ћемо вам рећи нешто занимљиво.

1. Шта је красти

Дакле, крађа је метрика која указује на недостатак процесорског времена за процесе унутар виртуелне машине. Како је описано у закрпи КВМ кернелаСтеалтх је време током којег хипервизор извршава друге процесе на хост ОС-у иако је ставио процес виртуелне машине у ред за извршење. То јест, крађа се израчунава као разлика између времена када је процес спреман за извршење и времена када је процесу додељено процесорско време.

Кернел виртуелне машине прима метрику крађе од хипервизора. У исто време, хипервизор не прецизира тачно које друге процесе покреће, већ једноставно каже „док сам заузет, не могу да вам дам времена“. На КВМ-у је додата подршка за израчунавање крађе закрпе. Овде постоје две кључне тачке:

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

2. Шта утиче на крађу

2.1. Прорачун за крађу

У суштини, крађа се израчунава приближно исто као и нормално време коришћења ЦПУ-а. Нема много информација о томе како се рециклирање сматра. Вероватно зато што већина људи ово питање сматра очигледним. Али овде постоје и замке. Да бисте се упознали са овим процесом, можете прочитати чланак Брендана Грега: научићете о многим нијансама приликом израчунавања искоришћења ио ситуацијама када ће овај прорачун бити погрешан из следећих разлога:

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

Нисам пронашао чланак који описује сличан прорачун за крађу (ако знате, поделите га у коментарима). Али, судећи по изворном коду, механизам обрачуна је исти као и за рециклажу. Једноставно, још један бројач се додаје у кернел, директно за КВМ процес (виртуелни машински процес), који броји трајање КВМ процеса који чека ЦПУ време. Бројач узима информације о процесору из његове спецификације и проверава да ли процес виртуелне машине користи све његове ознаке. Ако је то све, онда претпостављамо да је процесор био заузет само процесом виртуелне машине. У супротном обавештавамо да је процесор радио нешто друго, појавила се крађа.

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

2.2. Врсте виртуелизације на КВМ

Уопштено говорећи, постоје три типа виртуелизације, од којих све подржава КВМ. Механизам појаве крађе може зависити од врсте виртуелизације.

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

  1. Гостујући оперативни систем шаље команду свом гостујућем уређају.
  2. Драјвер гостујућег уређаја прима команду, генерише захтев за БИОС уређаја и шаље га хипервизору.
  3. Процес хипервизора преводи команду у команду за физички уређај, чинећи га, између осталог, сигурнијим.
  4. Управљачки програм физичког уређаја прихвата измењену команду и шаље је самом физичком уређају.
  5. Резултати извршавања команди се враћају истим путем.

Предност превода је у томе што вам омогућава да емулирате било који уређај и не захтева посебну припрему кернела оперативног система. Али за ово морате платити, пре свега, брзином.

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

Паравиртуализација. Најчешћа опција за виртуелизацију уређаја на КВМ-у и генерално најчешћи режим виртуелизације за гостујуће оперативне системе. Његова посебност је у томе што се рад са неким хипервизорским подсистемима (на пример, са мрежом или стеком диска) или додељивање меморијских страница одвија помоћу АПИ хипервизора, без превођења команди ниског нивоа. Недостатак овог метода виртуелизације је што језгро гостујућег оперативног система мора бити модификовано тако да може да комуницира са хипервизором користећи овај АПИ. Али ово се обично решава инсталирањем посебних драјвера на гостујући оперативни систем. У КВМ-у се овај АПИ зове виртио АПИ.

Са паравиртуализацијом, у поређењу са емитовањем, пут до физичког уређаја је значајно смањен слањем команди директно са виртуелне машине у процес хипервизора на хосту. Ово вам омогућава да убрзате извршавање свих инструкција унутар виртуелне машине. У КВМ-у то ради виртио АПИ, који ради само за одређене уређаје, као што су мрежни или диск адаптер. Због тога се виртио драјвери инсталирају унутар виртуелних машина.

Лоша страна овог убрзања је у томе што сви процеси који се покрећу унутар виртуелне машине не остају у њој. Ово ствара неке специјалне ефекте који могу да доведу до мријестања при крађи. Препоручујем да започнете детаљно проучавање овог питања са АПИ за виртуелни И/О: виртио.

2.3. "Поштено" заказивање

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

Линук користи такозвани ЦФС, Цомплетели Фаир Сцхедулер, који је постао подразумевани планер од кернела 2.6.23. Да бисте разумели овај алгоритам, можете прочитати архитектуру Линук кернела или изворни код. Суштина ЦФС-а је да распореди процесорско време између процеса у зависности од трајања њиховог извршавања. Што више процесорског времена процес захтева, мање процесорског времена добија. Ово осигурава да се сви процеси извршавају „поштено“ – тако да један процес не заузима стално све процесоре, а да се други процеси такође могу извршавати.

Понекад ова парадигма води до занимљивих артефаката. Дугогодишњи корисници Линук-а вероватно се сећају замрзавања обичног уређивача текста на радној површини док су покренули апликације које захтевају велике ресурсе као што је компајлер. Ово се десило зато што су се задаци у десктоп апликацијама који нису захтевали велики број ресурса такмичили са задацима који захтевају велике количине ресурса, као што је компајлер. ЦФС сматра да је то неправедно, па повремено зауставља уређивач текста и пушта процесор да се бави задацима компајлера. Ово је исправљено помоћу механизма сцхед_аутогроуп, али су остале многе друге карактеристике расподеле процесорског времена између задатака. Заправо, ово није прича о томе како је све лоше у ЦФС-у, већ покушај да се скрене пажња да „праведна” расподела процесорског времена није најтривијалнији задатак.

Још једна важна тачка у планеру је преемптион. Ово је неопходно да би се избацио процес шмркања из процесора и пустио да раде други. Процес избацивања назива се промена контекста. У овом случају, цео контекст задатка је сачуван: стање стека, регистара итд., након чега се процес шаље да чека, а на његово место долази други. Ово је скупа операција за ОС и ретко се користи, али у томе нема ничег лошег. Честа промена контекста може указивати на проблем у ОС-у, али обично је континуирана и не указује на ништа посебно.

Овако дуга прича је потребна да би се објаснила једна чињеница: што више процесорских ресурса процес покушава да потроши у поштеном Линук планеру, то ће брже бити заустављен тако да и други процеси могу да раде. Да ли је то тачно или не, сложено је питање које се може различито решити под различитим оптерећењима. У Виндовс-у је до недавно планер био фокусиран на приоритетну обраду десктоп апликација, што је могло да изазове замрзавање позадинских процеса. Сун Соларис је имао пет различитих класа планера. Када смо покренули виртуелизацију, додали смо шесту, Распоред фер удела, јер претходних пет није функционисало адекватно са виртуелизацијом Соларис Зонес. Препоручујем да започнете детаљно проучавање овог питања са књигама попут Соларис Интерналс: Соларис 10 и ОпенСоларис Кернел Арцхитецтуре или Разумевање Линук кернела.

2.4. Како пратити крађу?

Надгледање крађе унутар виртуелне машине, као и било које друге метрике процесора, је једноставно: можете користити било који алат за метрику процесора. Главна ствар је да је виртуелна машина на Линук-у. Из неког разлога Виндовс не пружа ове информације својим корисницима. 🙁

Крађа: ко краде ЦПУ време са виртуелних машина
Излаз горње команде: детаљи оптерећења процесора, у крајњој десној колони - крађи

Потешкоћа настаје када покушавате да добијете ове информације од хипервизора. Можете покушати да предвидите крађу на главној машини, на пример, користећи параметар Лоад Авераге (ЛА) - просечну вредност броја процеса који чекају у реду за извршавање. Метода за израчунавање овог параметра није једноставна, али генерално, ако је ЛА нормализован бројем процесорских нити већи од 1, то указује да је Линук сервер нечим преоптерећен.

Шта чекају сви ови процеси? Очигледан одговор је процесор. Али одговор није сасвим тачан, јер понекад је процесор слободан, али ЛА прелази скалу. Запамтити како НФС пада и како ЛА расте. Исто се може десити са диском и другим улазно/излазним уређајима. Али у ствари, процеси могу да сачекају крај било ког закључавања, било физичког, повезаног са И/О уређајем, или логичког, као што је мутекс. Ово такође укључује закључавање на нивоу хардвера (исти одговор са диска), или логике (тзв. примитиви за закључавање, који укључује гомилу ентитета, мутекс адаптивне и спин, семафоре, променљиве услова, рв браве, ипц браве ...).

Још једна карактеристика ЛА је да се сматра просеком оперативног система. На пример, 100 процеса се такмиче за једну датотеку, а затим ЛА=50. Чини се да тако велика вредност указује на то да је оперативни систем лош. Али за други криво написани код ово може бити нормално стање, упркос чињеници да је само оно лоше, а остали процеси у оперативном систему не трпе.

Због овог усредњавања (и то за не мање од једног минута), одређивање било чега помоћу ЛА индикатора није најзаслужнији задатак, са врло неизвесним резултатима у конкретним случајевима. Ако покушате да то схватите, видећете да чланци на Википедији и другим доступним ресурсима описују само најједноставније случајеве, без дубљег објашњења процеса. Шаљем свима који су заинтересовани, опет, овде Брендану Грегу  - пратите линкове испод. Ко је превише лењ да говори енглески - превод његовог популарног чланка о ЛА.

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

Погледајмо сада главне случајеве крађе на које смо наишли. Рећи ћу вам како они следе из свега наведеног и како су повезани са индикаторима на хипервизору.

Рециклажа. Најједноставнији и најчешћи: хипервизор је поново употребљен. Заиста, постоји много покренутих виртуелних машина, велика потрошња процесора унутар њих, велика конкуренција, искоришћеност ЛА је више од 1 (нормализовано нитима процесора). Све унутар свих виртуелних машина се успорава. Крађа која се преноси са хипервизора такође расте, потребно је прерасподелити оптерећење или некога искључити. Генерално, све је логично и разумљиво.

Паравиртуализација наспрам појединачних инстанци. Постоји само једна виртуелна машина на хипервизору; она троши мали део ње, али производи велико И/О оптерећење, на пример на диску. И однекуд се у њему појављује мала крађа, до 10% (што је показало неколико експеримената).

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

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

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

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

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

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

4. Остала изобличења

Постоји још милион разлога за нарушавање поштеног поврата процесорског времена на виртуелној машини. На пример, хипертхреадинг и НУМА уносе потешкоће у прорачуне. Они потпуно збуњују избор кернела за извршавање процеса, јер планер користи коефицијенте - тежине, што додатно отежава прорачун при промени контекста.

Постоје изобличења због технологија као што су турбо боост или, обрнуто, режим уштеде енергије, који, када се рачуна искоришћеност, може вештачки да повећа или смањи фреквенцију или чак временски пресек на серверу. Омогућавање турбо појачања смањује перформансе једне нити процесора због повећања перформанси друге. У овом тренутку виртуелној машини се не преноси информација о тренутној фреквенцији процесора, а она верује да јој неко краде време (нпр. тражила је 2 ГХз, али је добила упола мање).

Генерално, може бити много разлога за изобличење. Можда ћете пронаћи нешто друго на одређеном систему. Боље је почети са књигама до којих сам дао линкове изнад и преузимањем статистике из хипервизора користећи услужне програме као што су перф, сисдиг, системтап, од којих десетине.

5. Закључци

  1. До неке количине крађе може доћи због паравиртуализације и то се може сматрати нормалним. На интернету пишу да ова вредност може бити 5-10%. Зависи од апликација унутар виртуелне машине и од оптерећења које ставља на своје физичке уређаје. Овде је важно обратити пажњу на то како се апликације осећају унутар виртуелних машина.
  2. Однос оптерећења хипервизора и крађе унутар виртуелне машине није увек јасно међусобно повезан; обе процене крађе могу бити погрешне у одређеним ситуацијама под различитим оптерећењима.
  3. Планер има лош однос према процесима који траже много. Он се труди да да мање онима који траже више. Велике виртуелне машине су зло.
  4. Мало крађе може бити норма чак и без паравиртуализације (узимајући у обзир оптерећење унутар виртуелне машине, карактеристике оптерећења суседа, расподелу оптерећења по нитима и друге факторе).
  5. Ако желите да откријете крађу у одређеном систему, морате истражити различите опције, прикупити метрику, пажљиво их анализирати и размислити о томе како равномерно распоредити оптерећење. Могућа су одступања од било којих случајева, што се мора експериментално потврдити или погледати у програму за отклањање грешака језгра.

Извор: ввв.хабр.цом

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