Ұрлау: виртуалды машиналардан процессор уақытын кім ұрлайды

Ұрлау: виртуалды машиналардан процессор уақытын кім ұрлайды

Сәлеметсіз бе! Мен сізге виртуалды машиналар ішіндегі ұрлау механикасы туралы және бұлттық платформаның техникалық директоры ретінде зерттеу барысында біз анықтаған кейбір айқын емес артефактілер туралы қарапайым түрде айтқым келеді. Mail.ru бұлтты шешімдері. Платформа KVM жүйесінде жұмыс істейді.

CPU ұрлау уақыты – виртуалды машина оның орындалуы үшін процессор ресурстарын алмайтын уақыт. Бұл уақыт тек виртуалдандыру ортасындағы қонақ операциялық жүйелерінде есептеледі. Бұл ең көп бөлінген ресурстардың қайда кететінінің себептері, өмірдегідей, өте анық емес. Бірақ біз оны анықтауға шешім қабылдадық, тіпті бірқатар эксперименттер жасадық. Біз қазір ұрлық туралы бәрін білеміз деген сөз емес, бірақ қазір сізге қызықты нәрсе айтамыз.

1. Ұрлық дегеніміз не

Сонымен, ұрлау - виртуалды машина ішіндегі процестер үшін процессор уақытының жетіспеушілігін көрсететін көрсеткіш. Сипатталғандай KVM ядросының патчіндеЖасырын - бұл виртуалды машина процесін орындау үшін кезекке қойғанымен, гипервизор хост ОЖ-де басқа процестерді орындайтын уақыт. Яғни ұрлау процесті орындауға дайын болған уақыт пен процеске процессор уақыты бөлінген уақыт арасындағы айырмашылық ретінде есептеледі.

Виртуалды машина ядросы гипервизордан ұрлау көрсеткішін алады. Сонымен қатар, гипервизор басқа қандай процестерді орындап жатқанын нақты көрсетпейді, ол жай ғана «мен бос емес кезде, мен сізге уақыт бере алмаймын» дейді. KVM жүйесінде ұрлауды есептеуге қолдау қосылды патчтар. Мұнда екі негізгі нүкте бар:

  • Виртуалды машина гипервизордан ұрлау туралы біледі. Яғни, шығындар тұрғысынан виртуалды машинадағы процестер үшін бұл әртүрлі бұрмалануларға ұшырауы мүмкін жанама өлшем.
  • Гипервизор виртуалды машинамен басқа не істеп жатқаны туралы ақпаратты бөліспейді - ең бастысы, ол оған уақыт бөлмейді. Осыған байланысты виртуалды машинаның өзі ұрлау көрсеткішіндегі бұрмалауларды анықтай алмайды, оны бәсекелес процестердің сипатымен бағалауға болады.

2. Ұрлыққа не әсер етеді

2.1. Ұрлау есебі

Негізінде, ұрлау процессордың қалыпты пайдалану уақытымен бірдей есептеледі. Қайта өңдеудің қалай қарастырылатыны туралы көп ақпарат жоқ. Мүмкін, көптеген адамдар бұл сұрақты анық деп санайды. Бірақ бұл жерде де қателіктер бар. Бұл процесспен танысу үшін оқуға болады Брендан Греггтің мақаласы: пайдалануды есептеу кезінде сіз көптеген нюанстар туралы және бұл есептеу келесі себептер бойынша қате болатын жағдайлар туралы білесіз:

  • Процессор қызып кетеді, бұл циклдарды өткізіп жіберуге әкеледі.
  • Процессордың жиілігін өзгертетін турбо күшейтуді қосу/өшіру.
  • SpeedStep сияқты процессордың қуатты үнемдейтін технологияларын пайдалану кезінде орын алатын уақыт кесіндісінің ұзақтығын өзгерту.
  • Орташа мәнді есептеу мәселесі: бір минуттық пайдалануды 80% бағалау 100% қысқа мерзімді жарылысты жасыра алады.
  • Айналдыру құлпы процессорды қалпына келтіруге әкеледі, бірақ пайдаланушы процесі оның орындалуында ешқандай прогрессті көрмейді. Нәтижесінде процесс арқылы есептелген процессорды пайдалану жүз пайызды құрайды, дегенмен процесс процессор уақытын физикалық түрде тұтынбайды.

Мен ұрлауға ұқсас есептеуді сипаттайтын мақаланы таппадым (егер білсеңіз, оны түсініктемелерде бөлісіңіз). Бірақ бастапқы кодқа қарағанда, есептеу механизмі қайта өңдеумен бірдей. Жай ғана ядроға басқа есептегіш тікелей KVM процесі (виртуалды машина процесі) үшін қосылады, ол процессор уақытын күтіп тұрған KVM процесінің ұзақтығын есептейді. Есептегіш процессор туралы ақпаратты оның спецификациясынан алады және оның барлық белгілерінің виртуалды машина процесі пайдаланылғанын тексереді. Егер бәрі солай болса, онда процессор тек виртуалды машина процесімен айналысады деп есептейміз. Әйтпесе, процессор басқа нәрсе істеп жатқанын хабарлаймыз, ұрлық пайда болды.

Ұрлауды санау процесі кәдімгі қайта өңдеуді санау сияқты проблемаларға ұшырайды. Мұндай проблемалар жиі пайда болады деп айтуға болмайды, бірақ олар көңілсіз көрінеді.

2.2. KVM бойынша виртуализация түрлері

Жалпы айтқанда, виртуализацияның үш түрі бар, олардың барлығына KVM қолдау көрсетеді. Ұрлаудың пайда болу механизмі виртуализация түріне байланысты болуы мүмкін.

Broadcast. Бұл жағдайда виртуалды машинаның операциялық жүйесінің физикалық гипервизорлық құрылғылармен жұмыс істеуі келесідей болады:

  1. Қонақ операциялық жүйесі өзінің қонақ құрылғысына пәрмен жібереді.
  2. Қонақ құрылғы драйвері пәрменді алады, құрылғының BIOS-ына сұраныс жасайды және оны гипервизорға жібереді.
  3. Гипервизор процесі пәрменді физикалық құрылғының пәрменіне аударып, оны басқа нәрселермен қатар қауіпсіз етеді.
  4. Физикалық құрылғы драйвері өзгертілген пәрменді қабылдайды және оны физикалық құрылғының өзіне жібереді.
  5. Пәрмендерді орындау нәтижелері сол жолмен кері қайтарылады.

Аударманың артықшылығы - ол кез келген құрылғыны эмуляциялауға мүмкіндік береді және операциялық жүйе ядросын арнайы дайындауды қажет етпейді. Бірақ бұл үшін, ең алдымен, жылдамдықпен төлеу керек.

Аппараттық виртуализация. Бұл жағдайда аппараттық деңгейдегі құрылғы операциялық жүйеден келген командаларды түсінеді. Бұл ең жылдам және ең жақсы әдіс. Бірақ, өкінішке орай, оны барлық физикалық құрылғылар, гипервизорлар және қонақтық операциялық жүйелер қолдамайды. Қазіргі уақытта аппараттық виртуализацияны қолдайтын негізгі құрылғылар процессорлар болып табылады.

Паравиртуализация. KVM-де құрылғыны виртуалдандырудың ең көп таралған нұсқасы және әдетте қонақ операциялық жүйелері үшін ең көп таралған виртуалдандыру режимі. Оның ерекшелігі гипервизордың кейбір ішкі жүйелерімен жұмыс істеу (мысалы, желі немесе диск стекімен) немесе жад беттерін бөлу гипервизордың API көмегімен төменгі деңгейлі командаларды аудармай жүзеге асырылады. Бұл виртуалдандыру әдісінің кемшілігі қонақ операциялық жүйенің ядросы осы API арқылы гипервизормен байланыса алатындай өзгертілуі керек. Бірақ бұл әдетте қонақ операциялық жүйесінде арнайы драйверлерді орнату арқылы шешіледі. KVM-де бұл API деп аталады virtio API.

Паравиртуализациямен, хабар таратумен салыстырғанда, виртуалды машинадан тікелей хосттағы гипервизор процесіне командаларды жіберу арқылы физикалық құрылғыға жол айтарлықтай қысқарады. Бұл виртуалды машинаның ішіндегі барлық нұсқаулардың орындалуын жылдамдатуға мүмкіндік береді. KVM жүйесінде бұл желі немесе диск адаптері сияқты белгілі бір құрылғылар үшін ғана жұмыс істейтін virtio API арқылы жасалады. Сондықтан виртуалды машиналар ішінде виртио драйверлері орнатылады.

Бұл жеделдетудің кемшілігі виртуалды машинаның ішінде жұмыс істейтін барлық процестер оның ішінде қалмайды. Бұл ұрлау кезінде уылдырық шашуға әкелетін кейбір арнайы әсерлерді жасайды. Мен осы мәселені егжей-тегжейлі зерттеуді бастауды ұсынамын Виртуалды енгізу/шығару үшін API: virtio.

2.3. «Әділ» жоспарлау

Гипервизордағы виртуалды машина шын мәнінде Linux ядросындағы жоспарлау (процестер арасында ресурстарды бөлу) заңдарына бағынатын қарапайым процесс, сондықтан оны толығырақ қарастырайық.

Linux 2.6.23 ядросынан бері әдепкі жоспарлаушыға айналған CFS, Толық әділ жоспарлаушы деп аталады. Бұл алгоритмді түсіну үшін Linux ядросының архитектурасын немесе бастапқы кодты оқуға болады. CFS мәні процессордың уақытын олардың орындалу ұзақтығына байланысты процестер арасында бөлу болып табылады. Процесс неғұрлым көп процессорды қажет етсе, соғұрлым ол CPU уақыты азаяды. Бұл барлық процестердің «әділ» орындалуын қамтамасыз етеді - осылайша бір процесс барлық процессорларды үнемі басып қоймайды, ал басқа процестер де орындай алады.

Кейде бұл парадигма қызықты артефактілерге әкеледі. Ұзақ уақыт Linux пайдаланушылары компилятор сияқты ресурсты көп қажет ететін қолданбаларды іске қосу кезінде жұмыс үстеліндегі кәдімгі мәтіндік редактордың қатып қалғанын есте сақтауы мүмкін. Бұл жұмыс үстелі қолданбаларындағы ресурсты көп қажет етпейтін тапсырмалар компилятор сияқты ресурсты көп қажет ететін тапсырмалармен бәсекелескендіктен орын алды. CFS мұны әділетсіз деп санайды, сондықтан ол мәтіндік редакторды мезгіл-мезгіл тоқтатады және процессорға компилятор тапсырмаларын орындауға мүмкіндік береді. Бұл механизм арқылы түзетілді жоспарлы_автотоп, бірақ тапсырмалар арасында процессор уақытын бөлудің көптеген басқа мүмкіндіктері қалды. Шын мәнінде, бұл CFS-де бәрі қаншалықты нашар екендігі туралы әңгіме емес, процессор уақытын «әділ» бөлу ең маңызды мәселе емес екеніне назар аудару әрекеті.

Жоспарлағыштағы тағы бір маңызды сәт - алдын ала ескерту. Бұл процессордан жыпылықтау процесін алып тастау және басқалардың жұмыс істеуіне мүмкіндік беру үшін қажет. Шығару процесі контекстті ауыстыру деп аталады. Бұл жағдайда тапсырманың барлық контексті сақталады: стектің, регистрлердің және т.б. күйі, содан кейін процесс күтуге жіберіледі және оның орнын басқасы алады. Бұл операциялық жүйе үшін қымбат операция және сирек пайдаланылады, бірақ оның ешқандай қатесі жоқ. Мәтінмәнді жиі ауыстыру ОЖ-дағы ақаулықты көрсетуі мүмкін, бірақ әдетте ол үздіксіз болып табылады және нақты ештеңе көрсетпейді.

Осындай ұзақ әңгіме бір фактіні түсіндіру үшін қажет: процесс адал Linux жоспарлаушысында неғұрлым көп процессор ресурстарын тұтынуға тырысса, басқа процестер де жұмыс істей алатындай тезірек тоқтатылады. Бұл дұрыс па, жоқ па - бұл әртүрлі жүктемелерде әртүрлі шешілетін күрделі мәселе. Windows жүйесінде соңғы уақытқа дейін жоспарлаушы жұмыс үстелі қосымшаларын басымдықпен өңдеуге бағытталған, бұл фондық процестердің қатып қалуына әкелуі мүмкін. Sun Solaris жоспарлаушыларының бес түрлі класына ие болды. Виртуализацияны іске қосқан кезде біз алтыншысын қостық, Әділ бөлісу жоспарлаушысы, себебі алдыңғы бесеуі Solaris Zones виртуализациясымен дұрыс жұмыс істемеді. сияқты кітаптардан осы мәселені егжей-тегжейлі зерттеуді бастауды ұсынамын Solaris Internals: Solaris 10 және OpenSolaris ядросының архитектурасы немесе Linux ядросын түсіну.

2.4. Ұрлықты қалай бақылауға болады?

Виртуалды машинаның ішінде ұрлауды бақылау, кез келген басқа процессор көрсеткіші сияқты, қарапайым: кез келген процессор метрикасының құралын пайдалануға болады. Ең бастысы, виртуалды машина Linux жүйесінде. Қандай да бір себептермен Windows бұл ақпаратты пайдаланушыларға бермейді. 🙁

Ұрлау: виртуалды машиналардан процессор уақытын кім ұрлайды
Жоғарғы команданың шығысы: процессордың жүктелуінің мәліметтері, ең оң жақ бағанда - ұрлау

Бұл ақпаратты гипервизордан алуға тырысқанда қиындық туындайды. Негізгі құрылғыда ұрлауды болжауға тырысуға болады, мысалы, Load Average (LA) параметрін - орындау кезегінде күтіп тұрған процестер санының орташа мәнін пайдаланып. Бұл параметрді есептеу әдісі қарапайым емес, бірақ тұтастай алғанда, егер процессор ағындарының саны бойынша қалыпқа келтірілген LA 1-ден көп болса, бұл Linux серверінің бір нәрсемен шамадан тыс жүктелгенін көрсетеді.

Барлық осы процестер нені күтуде? Айқын жауап - процессор. Бірақ жауап мүлдем дұрыс емес, өйткені кейде процессор тегін, бірақ LA масштабтан шығып кетеді. Есте сақта NFS қалай төмендейді және LA қалай өседі. Дәл осындай жағдай дискімен және басқа енгізу/шығару құрылғыларымен болуы мүмкін. Бірақ іс жүзінде процестер енгізу/шығару құрылғысымен байланысты физикалық немесе логикалық, мысалы, мутекс сияқты кез келген құлыптың аяқталуын күте алады. Бұл сондай-ақ аппараттық құрал деңгейінде құлыптауды (дисктен бірдей жауап) немесе логиканы (объектілер тобын, мутекс бейімделуін және айналдыруды, семафорларды, шарт айнымалыларын, rw құлыптарын, ipc құлыптарын қамтитын құлыптау примитивтері деп аталады) қамтиды. ...).

LA тағы бір ерекшелігі операциялық жүйенің орташа көрсеткіші ретінде қарастырылады. Мысалы, бір файл үшін 100 процесс бәсекелеседі, содан кейін LA=50. Мұндай үлкен мән операциялық жүйенің нашар екенін көрсетеді. Бірақ басқа қисық жазылған кодтар үшін бұл тек нашар болғанына және операциялық жүйедегі басқа процестер зардап шекпейтініне қарамастан, бұл қалыпты жағдай болуы мүмкін.

Осы орташа мәнге (және бір минуттан кем емес) байланысты LA индикаторы бойынша кез келген нәрсені анықтау нақты жағдайларда өте белгісіз нәтижелермен ең пайдалы тапсырма емес. Егер сіз оны анықтауға тырыссаңыз, Википедиядағы және басқа да қолжетімді ресурстардағы мақалалар процесті терең түсіндірместен ең қарапайым жағдайларды ғана сипаттайтынын көресіз. Қызығушылық танытқандардың бәрін қайта жіберемін, мұнда Брендан Греггке  - төмендегі сілтемелерді орындаңыз. Кім ағылшынша сөйлеуге жалқау - оның LA туралы танымал мақаласының аудармасы.

3. Арнайы әсерлер

Енді біз кездескен ұрлықтың негізгі жағдайларына тоқталайық. Мен сізге олардың жоғарыда айтылғандардың барлығынан қалай шығатынын және олардың гипервизордағы индикаторларға қалай қатысы барын айтып беремін.

Қайта өңдеу. Ең қарапайым және кең таралған: гипервизор қайта қолданылды. Шынында да, көптеген жұмыс істейтін виртуалды машиналар бар, олардың ішінде жоғары процессорды тұтыну, бәсекелестік көп, LA пайдалану 1-ден көп (процессор ағындары арқылы қалыпқа келтірілген). Барлық виртуалды машиналардағы барлық нәрсе баяулайды. Гипервизордан берілетін ұрлау да өсіп келеді, жүктемені қайта бөлу немесе біреуді өшіру қажет. Жалпы, бәрі қисынды және түсінікті.

Паравиртуализация және жалғыз дана. Гипервизорда бір ғана виртуалды машина бар, ол оның аз бөлігін тұтынады, бірақ үлкен енгізу/шығару жүктемесін шығарады, мысалы, дискіде. Бір жерден кішкентай ұрлық пайда болады, 10% дейін (бірнеше тәжірибе көрсеткендей).

Іс қызық. Ұрлау дәл осы жерде паравиртуализацияланған драйверлер деңгейінде блоктауға байланысты пайда болады. Виртуалды машинаның ішінде үзіліс жасалады, оны драйвер өңдейді және гипервизорға жібереді. Гипервизордағы үзілістерді өңдеуге байланысты виртуалды машина үшін ол жіберілген сұранысқа ұқсайды, ол орындауға дайын және процессорды күтуде, бірақ оған процессор уақыты берілмейді. Виртуалды қыз бұл уақытты ұрлап кетті деп ойлайды.

Бұл буфер жіберілген сәтте орын алады, ол гипервизордың ядролық кеңістігіне түседі және біз оны күте бастаймыз. Дегенмен, виртуалды машина тұрғысынан ол дереу оралуы керек. Сондықтан ұрлауды есептеу алгоритмі бойынша бұл уақыт ұрланған болып саналады. Сірә, бұл жағдайда басқа механизмдер болуы мүмкін (мысалы, кейбір басқа sys қоңырауларын өңдеу), бірақ олар айтарлықтай өзгеше болмауы керек.

Жоспарлағыш жоғары жүктелген виртуалды машиналарға қарсы. Бір виртуалды машина ұрлаудан басқаларға қарағанда көбірек зардап шеккенде, бұл жоспарлаушыға байланысты. Процесс процессорды неғұрлым көп жүктесе, басқалары да жұмыс істей алуы үшін жоспарлаушы оны тезірек шығарады. Виртуалды машина аз тұтынатын болса, ол ұрлауды әрең көреді: оның процесі адал отырды және күтті, біз оған көбірек уақыт беруіміз керек. Егер виртуалды машина өзінің барлық ядроларына максималды жүктемені шығарса, ол жиі процессордан шығарылады және олар оған көп уақыт бермеуге тырысады.

Виртуалды машинаның ішіндегі процестер деректерді өңдеуге төтеп бере алмайтындықтан көбірек процессор алуға тырысқанда одан да жаман. Содан кейін гипервизордағы операциялық жүйе адал оңтайландырудың арқасында процессордың аз және аз уақытын қамтамасыз етеді. Бұл процесс көшкін сияқты жүреді және аспанға секіреді, дегенмен басқа виртуалды машиналар оны әрең байқайды. Ал өзектер неғұрлым көп болса, соғұрлым зардап шеккен машина нашарлайды. Бір сөзбен айтқанда, көптеген ядролары бар жоғары жүктелген виртуалды машиналар ең көп зардап шегеді.

Төмен LA, бірақ ұрлау бар. Егер LA шамамен 0,7 болса (яғни, гипервизор аз жүктелген сияқты), бірақ ұрлау жеке виртуалды машиналарда байқалады:

  • Паравиртуализациясы бар опция жоғарыда сипатталған. Виртуалды машина ұрлауды көрсететін көрсеткіштерді қабылдай алады, дегенмен гипервизор жақсы жұмыс істейді. Біздің эксперименттеріміздің нәтижелеріне сәйкес, бұл ұрлау опциясы 10% аспайды және виртуалды машинаның ішіндегі қолданбалардың жұмысына айтарлықтай әсер етпеуі керек.
  • LA параметрі қате есептелген. Дәлірек айтқанда, әрбір нақты сәтте ол дұрыс есептеледі, бірақ бір минут ішінде орташа алғанда ол төмен бағаланады. Мысалы, гипервизордың үштен бір виртуалды машинасы өзінің барлық процессорларын тура жарты минут бойы тұтынса, гипервизордағы LA минутына 0,15 болады; бір мезгілде жұмыс істейтін төрт осындай виртуалды машина 0,6 береді. Олардың әрқайсысында жарты минут ішінде LA индикаторы бойынша 25% жабайы ұрлық болғаны енді жойылмайды.
  • Тағы да, біреу тым көп жеп жатыр деп шешіп, біреуді күтуге рұқсат берген жоспарлаушының арқасында. Әзірше мен контекстті ауыстырамын, үзілістерді өңдеймін және басқа маңызды жүйелік нәрселермен айналысамын. Нәтижесінде кейбір виртуалды машиналар ешқандай ақауларды көрмейді, ал басқалары өнімділіктің айтарлықтай төмендеуіне ұшырайды.

4. Басқа бұрмаланулар

Виртуалды машинада процессор уақытының әділ қайтарылуын бұрмалаудың тағы миллион себептері бар. Мысалы, hyperthreading және NUMA есептеулерде қиындықтар туғызады. Олар процесті орындау үшін ядроны таңдауды толығымен шатастырады, өйткені жоспарлаушы контекстті ауыстыру кезінде есептеуді одан да қиындататын коэффициенттерді - салмақтарды пайдаланады.

Турбо күшейту немесе керісінше энергияны үнемдеу режимі сияқты технологияларға байланысты бұрмаланулар бар, олар пайдалануды есептеу кезінде сервердегі жиілікті немесе тіпті уақытты жасанды түрде көбейтуі немесе азайтуы мүмкін. Турбо күшейтуді қосу басқасының өнімділігінің артуына байланысты бір процессор ағынының өнімділігін төмендетеді. Қазіргі уақытта процессордың ағымдағы жиілігі туралы ақпарат виртуалды машинаға берілмейді және ол оның уақытын біреу ұрлап жатыр деп есептейді (мысалы, ол 2 ГГц сұрады, бірақ оның жартысын алды).

Жалпы, бұрмаланудың көптеген себептері болуы мүмкін. Белгілі бір жүйеде сіз басқа нәрсені таба аласыз. Жоғарыда мен сілтеме берген кітаптардан және гипервизордан perf, sysdig, systemtap сияқты утилиталарды пайдаланып статистиканы алудан бастаған дұрыс. ондаған.

5. Қорытындылар

  1. Паравиртуализацияға байланысты ұрлықтың кейбір мөлшері болуы мүмкін және оны қалыпты деп санауға болады. Олар интернетте бұл мән 5-10% болуы мүмкін деп жазады. Виртуалды машинаның ішіндегі қолданбаларға және оның физикалық құрылғыларына түсетін жүктемеге байланысты. Мұнда қолданбалардың виртуалды машиналар ішінде қалай сезінетініне назар аудару маңызды.
  2. Гипервизордағы жүктеме мен виртуалды машинаның ішіндегі ұрлаудың арақатынасы әрқашан бір-бірімен анық байланысты емес; ұрлаудың екі бағасы да әртүрлі жүктемелер кезінде нақты жағдайларда қате болуы мүмкін.
  3. Жоспарлаушы көп нәрсені сұрайтын процестерге нашар көзқараста. Көп сұрағанға аз беруге тырысады. Үлкен виртуалды машиналар жаман.
  4. Аздап ұрлау тіпті паравиртуализациясыз (виртуалды машинаның ішіндегі жүктемені, көршілердің жүктемесінің сипаттамаларын, ағындар бойынша жүктемені бөлуді және басқа факторларды ескере отырып) норма болуы мүмкін.
  5. Белгілі бір жүйеде ұрлауды анықтағыңыз келсе, әртүрлі нұсқаларды зерттеп, көрсеткіштерді жинап, оларды мұқият талдап, жүктемені біркелкі бөлу туралы ойлануыңыз керек. Кез келген жағдайдан ауытқулар болуы мүмкін, олар эксперименттік түрде расталуы немесе ядроны жөндеушіде қаралуы керек.

Ақпарат көзі: www.habr.com

пікір қалдыру