{"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\/pl\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya","title":{"rendered":"Steal: kto kradnie czas procesora w wirtualnych maszynach","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Steal: kto kradnie czas procesora w wirtualnych maszynach\" src=\"\/wp-content\/uploads\/2019\/04\/23cac5d3cc3295dc6f1014e9fda36b89.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCze\u015b\u0107! Chcia\u0142bym prostym j\u0119zykiem opowiedzie\u0107 o mechanice powstawania steal wewn\u0105trz maszyn wirtualnych oraz o niekt\u00f3rych nieoczywistych artefaktach, kt\u00f3re uda\u0142o nam si\u0119 ustali\u0107 podczas jego badania, w kt\u00f3re musia\u0142em si\u0119 zag\u0142\u0119bi\u0107 jako dyrektor techniczny platformy chmurowej. <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.ru Cloud Solutions<\/a><\/noindex>. Platforma dzia\u0142a na KVM.<\/p>\n<p>Czas steal CPU to czas, w kt\u00f3rym maszyna wirtualna nie otrzymuje zasob\u00f3w procesora do swojej realizacji. Czas ten jest liczony tylko w systemach operacyjnych go\u015bcia w \u015brodowiskach wirtualizacji. Powody, dla kt\u00f3rych te przydzielone zasoby znikaj\u0105, s\u0105 do\u015b\u0107 niejasne. Ale postanowili\u015bmy to zbada\u0107, nawet przeprowadzili\u015bmy szereg eksperyment\u00f3w. Nie to, \u017ce teraz wszystko wiemy o steal, ale kilka interesuj\u0105cych rzeczy ch\u0119tnie teraz opowiemy.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Co to jest steal<\/h2>\n<p>\nTak wi\u0119c, steal to metryka wskazuj\u0105ca na brak czasu procesora dla proces\u00f3w wewn\u0105trz maszyny wirtualnej. Jak opisano <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/stable\/linux.git\/patch\/?id=c9aaa8957f203bd6df83b002fb40b98390bed078\">w \u0142atce j\u0105dra KVM<\/a><\/noindex>, steal to czas, w kt\u00f3rym hypervisor wykonuje inne procesy na systemie operacyjnym hosta, chocia\u017c postawi\u0142 proces maszyny wirtualnej w kolejce do wykonania. Zatem, steal jest liczony jako r\u00f3\u017cnica mi\u0119dzy czasem, kiedy proces jest gotowy do wykonania, a czasem, kiedy procesowi przydzielono czas procesora.<\/p>\n<p>Metryk\u0119 steal j\u0105dro maszyny wirtualnej otrzymuje od hypervisora. Przy tym hypervisor nie precyzuje, jakie dok\u0142adnie inne procesy wykonuje, po prostu \"jestem zaj\u0119ty, nie mog\u0119 ci po\u015bwi\u0119ci\u0107 czasu\". W KVM wsparcie dla liczenia steal dodano w <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/449657\/\">\u0142atkach.<\/a><\/noindex>Dwa kluczowe punkty tutaj to: <\/p>\n<ul>\n<li>Maszyna wirtualna dowiaduje si\u0119 o steal od hypervisora. To znaczy, z punktu widzenia strat, dla proces\u00f3w na samej wirtualce jest to pomiar po\u015bredni, kt\u00f3ry mo\u017ce by\u0107 podatny na r\u00f3\u017cne zniekszta\u0142cenia.\n<\/li>\n<li>Hypervisor nie dzieli si\u0119 z wirtualk\u0105 informacj\u0105 o tym, czym innym jest zaj\u0119ty \u2014 najwa\u017cniejsze, \u017ce nie po\u015bwi\u0119ca jej czasu. Z tego powodu sama wirtualka nie mo\u017ce wykry\u0107 zniekszta\u0142ce\u0144 w wska\u017aniku steal, kt\u00f3re mo\u017cna by oceni\u0107 na podstawie charakteru konkuruj\u0105cych proces\u00f3w.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>2. Co wp\u0142ywa na steal<\/h2>\n<p><\/p>\n<h3>2.1. Obliczanie steal<\/h3>\n<p>\nW istocie, steal oblicza si\u0119 mniej wi\u0119cej tak, jak zwyk\u0142y czas wykorzystania procesora. Informacji o tym, jak oblicza si\u0119 wykorzystanie, jest niewiele. Mo\u017ce dlatego, \u017ce wi\u0119kszo\u015b\u0107 uwa\u017ca to za oczywiste. Ale tutaj te\u017c mog\u0105 by\u0107 pu\u0142apki. Aby zaznajomi\u0107 si\u0119 z tym procesem, mo\u017cna poczyta\u0107. <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/blog\/2017-05-09\/cpu-utilization-is-wrong.html\">artyku\u0142 Brendanna Gregga<\/a><\/noindex>: dowiesz si\u0119 o wielu szczeg\u00f3\u0142ach przy obliczaniu wykorzystania oraz o sytuacjach, w kt\u00f3rych to obliczenie mo\u017ce by\u0107 b\u0142\u0119dne z nast\u0119puj\u0105cych powod\u00f3w:<\/p>\n<ul>\n<li>Przegrzanie procesora, w wyniku kt\u00f3rego s\u0105 pomijane takty.\n<\/li>\n<li>W\u0142\u0105czanie\/wy\u0142\u0105czanie turbo boosta, co zmienia cz\u0119stotliwo\u015b\u0107 taktowania procesora.\n<\/li>\n<li>Zmiana d\u0142ugo\u015bci kwantu czasowego, wyst\u0119puj\u0105ca przy u\u017cyciu technologii oszcz\u0119dzania energii procesora, na przyk\u0142ad SpeedStep.\n<\/li>\n<li>Problem z obliczeniem \u015bredniej: ocenienie wykorzystania na poziomie 80% przez jedn\u0105 minut\u0119 mo\u017ce ukry\u0107 kr\u00f3tkotrwa\u0142y wzrost do 100%.\n<\/li>\n<li>Cykliczne blokowanie (spin lock) powoduje, \u017ce procesor jest wykorzystywany, ale proces u\u017cytkownika nie widzi post\u0119pu w swoim wykonaniu. W rezultacie, obliczone wykorzystanie procesora przez proces b\u0119dzie wynosi\u0107 100%, chocia\u017c fizyczny czas procesora nie b\u0119dzie u\u017cywany przez proces.\n<\/li>\n<\/ul>\n<p>\nNie znalaz\u0142em artyku\u0142u, kt\u00f3ry opisuje podobne obliczenia dla steal (je\u015bli wiecie \u2014 podzielcie si\u0119 w komentarzach). Ale wed\u0142ug \u017ar\u00f3de\u0142, mechanizm oblicze\u0144 jest taki sam jak dla wykorzystania. Po prostu w j\u0105drze dodawany jest dodatkowy licznik, bezpo\u015brednio dla procesu KVM (procesu maszyny wirtualnej), kt\u00f3ry zlicza czas, jaki proces KVM sp\u0119dza w oczekiwaniu na czas procesora. Licznik zbiera informacje o procesorze z jego specyfikacji i sprawdza, czy wszystkie jego tyki by\u0142y wykorzystywane przez proces wirtualny. Je\u015bli tak, to uznajemy, \u017ce procesor zajmowa\u0142 si\u0119 tylko procesem maszyny wirtualnej. W przeciwnym razie informujemy, \u017ce procesor zajmowa\u0142 si\u0119 czym\u015b innym, wyst\u0105pi\u0142 steal. <\/p>\n<p>Proces obliczania steal podlega tym samym problemom, co zwyk\u0142e obliczanie wykorzystania. Nie mo\u017cna powiedzie\u0107, \u017ce takie problemy wyst\u0119puj\u0105 cz\u0119sto, ale wygl\u0105daj\u0105 demotywuj\u0105co.<\/p>\n<h3>2.2. Typy wirtualizacji na KVM<\/h3>\n<p>\nOg\u00f3lnie rzecz bior\u0105c, istniej\u0105 trzy typy wirtualizacji, kt\u00f3re s\u0105 obs\u0142ugiwane przez KVM. Typ wirtualizacji mo\u017ce wp\u0142ywa\u0107 na mechanizm powstawania steal.<\/p>\n<p><b>Transmisja<\/b>. W tym przypadku praca systemu operacyjnego maszyny wirtualnej z fizycznymi urz\u0105dzeniami hiperwizora przebiega mniej wi\u0119cej tak:<\/p>\n<ol>\n<li>Go\u015bcinny system operacyjny wysy\u0142a swojemu urz\u0105dzeniu go\u015bciowemu polecenie.\n<\/li>\n<li>Sterownik urz\u0105dzenia go\u015bciowego przyjmuje polecenie, formu\u0142uje zapytanie do BIOS-u urz\u0105dzenia i wysy\u0142a je do hiperwizora.\n<\/li>\n<li>Proces hyperwizora przetwarza polecenie na polecenie dla urz\u0105dzenia fizycznego, czyni\u0105c je, mi\u0119dzy innymi, bardziej bezpiecznym.\n<\/li>\n<li>Sterownik urz\u0105dzenia fizycznego przyjmuje zmodyfikowane polecenie i przesy\u0142a je ju\u017c do samego urz\u0105dzenia fizycznego.\n<\/li>\n<li>Wyniki wykonania polece\u0144 wracaj\u0105 t\u0105 sam\u0105 drog\u0105. \n<\/li>\n<\/ol>\n<p>\nZalet\u0105 translacji jest to, \u017ce pozwala emulowa\u0107 dowolne urz\u0105dzenie i nie wymaga specjalnej konfiguracji j\u0105dra systemu operacyjnego. Jednak za to trzeba p\u0142aci\u0107, przede wszystkim, wydajno\u015bci\u0105. <\/p>\n<p><b>Wirtualizacja sprz\u0119towa<\/b>. W tym przypadku urz\u0105dzenie na poziomie sprz\u0119tu rozumie polecenia z systemu operacyjnego. Jest to najszybszy i najlepszy spos\u00f3b. Niestety, nie jest on wspierany przez wszystkie urz\u0105dzenia fizyczne, hipernadzorcze i systemy operacyjne go\u015bci. Obecnie g\u0142\u00f3wne urz\u0105dzenia, kt\u00f3re wspieraj\u0105 wirtualizacj\u0119 sprz\u0119tow\u0105, to procesory.<\/p>\n<p><b>Pseudowirtualizacja (paravirtualization)<\/b>. Najbardziej rozpowszechniona forma wirtualizacji urz\u0105dze\u0144 w KVM i w og\u00f3le najcz\u0119\u015bciej stosowany tryb wirtualizacji dla system\u00f3w operacyjnych go\u015bci. Jego cech\u0105 jest to, \u017ce interakcja z niekt\u00f3rymi podsystemami hipernadzorcy (na przyk\u0142ad ze stosem sieciowym lub dyskowym) lub alokacja stron pami\u0119ci odbywa si\u0119 za pomoc\u0105 API hipernadzorcy, bez translacji niskopoziomowych polece\u0144. Wad\u0105 tej metody wirtualizacji jest konieczno\u015b\u0107 modyfikacji j\u0105dra systemu operacyjnego go\u015bcia, aby mog\u0142o ono interagowa\u0107 z hipernadzorc\u0105 za pomoc\u0105 tego API. Jednak zazwyczaj problem ten rozwi\u0105zuje si\u0119 poprzez instalacj\u0119 specjalnych sterownik\u00f3w na systemie operacyjnym go\u015bcia. W KVM to API nazywa si\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.ibm.com\/developerworks\/library\/l-virtio\/index.html\">API virtio<\/a><\/noindex>.<\/p>\n<p>W przypadku pseudowirtualizacji w por\u00f3wnaniu do translacji, droga do urz\u0105dzenia fizycznego znacznie si\u0119 skraca dzi\u0119ki bezpo\u015bredniemu przesy\u0142aniu polece\u0144 z wirtualnej maszyny do procesu hipernadzorcy na ho\u015bcie. Pozwala to przyspieszy\u0107 wykonanie wszystkich instrukcji wewn\u0105trz wirtualnej maszyny. W KVM odpowiada za to API virtio, kt\u00f3re dzia\u0142a tylko dla okre\u015blonych urz\u0105dze\u0144, takich jak adapter sieciowy lub dyskowy. Dlatego w wirtualnych maszynach instalowane s\u0105 sterowniki virtio. <\/p>\n<p>Odwr\u00f3con\u0105 stron\u0105 takiego przyspieszenia jest to, \u017ce nie wszystkie procesy, kt\u00f3re s\u0105 wykonywane wewn\u0105trz maszyny wirtualnej, pozostaj\u0105 w niej. Tworzy to pewne efekty uboczne, kt\u00f3re mog\u0105 prowadzi\u0107 do pojawienia si\u0119 na steal. Szczeg\u00f3\u0142owe zbadanie tej kwestii polecam rozpocz\u0105\u0107 od <noindex><a rel=\"nofollow\" href=\"https:\/\/lwn.net\/Articles\/239238\/\">Interfejs API dla wirtualnego I\/O: virtio<\/a><\/noindex>.<\/p>\n<h3>2.3. \u201eSprawiedliwe\u201d planowanie<\/h3>\n<p>\nMaszyna wirtualna na hypervisorze jest w rzeczywisto\u015bci zwyk\u0142ym procesem, kt\u00f3ry podlega zasadom planowania (przydzielania zasob\u00f3w mi\u0119dzy procesami) w j\u0105drze Linux, dlatego rozwa\u017cmy to bardziej szczeg\u00f3\u0142owo. <\/p>\n<p>W systemie Linux u\u017cywa si\u0119 tzw. CFS, Completely Fair Scheduler, kt\u00f3ry od j\u0105dra 2.6.23 sta\u0142 si\u0119 domy\u015blnym mened\u017cerem. Aby zrozumie\u0107 ten algorytm, mo\u017cna przeczyta\u0107 Linux Kernel Architecture lub \u017ar\u00f3d\u0142a. Istota CFS polega na przydzielaniu czasu procesora mi\u0119dzy procesami w zale\u017cno\u015bci od d\u0142ugo\u015bci ich wykonywania. Im wi\u0119cej czasu procesora wymaga proces, tym mniej go otrzymuje. Gwarantuje to \u201esprawiedliwe\u201d wykonanie wszystkich proces\u00f3w \u2014 aby jeden proces nie zajmowa\u0142 wszystkich procesor\u00f3w na sta\u0142e, i inne procesy r\u00f3wnie\u017c mog\u0142y by\u0107 wykonywane. <\/p>\n<p>Czasami taka paradygma prowadzi do interesuj\u0105cych artefakt\u00f3w. Wieloletni u\u017cytkownicy Linuxa z pewno\u015bci\u0105 pami\u0119taj\u0105 zawieszanie zwyk\u0142ego edytora tekstu na pulpicie podczas uruchamiania zasoboch\u0142onnych aplikacji, takich jak kompilatory. Dzia\u0142o si\u0119 tak, poniewa\u017c zadania mniej wymagaj\u0105ce zasob\u00f3w z aplikacji desktopowych konkurowa\u0142y z zadaniami intensywnie wykorzystuj\u0105cymi zasoby, takimi jak kompilator. CFS uznaje, \u017ce to jest niesprawiedliwe, dlatego okresowo zatrzymuje edytor tekstu i daje procesorowi czas na przetworzenie zada\u0144 kompilatora. Naprawiono to za pomoc\u0105 mechanizmu <noindex><a rel=\"nofollow\" href=\"https:\/\/marc.info\/?l=linux-kernel&amp;m=128978361700898\">sched_autogroup<\/a><\/noindex>, ale pozosta\u0142o wiele innych specyfiki przydzielania czasu procesora mi\u0119dzy zadaniami. W\u0142a\u015bciwie, to opowie\u015b\u0107 nie o tym, jak \u017ale jest w CFS, ale pr\u00f3ba zwr\u00f3cenia uwagi na to, \u017ce \u201esprawiedliwy\u201d podzia\u0142 czasu procesora nie jest trywialnym zadaniem.<\/p>\n<p>Kolejnym wa\u017cnym punktem w schedulerze jest preemption. Jest to potrzebne, aby usun\u0105\u0107 zbyt obci\u0105\u017cony proces z procesora i da\u0107 szans\u0119 innym. Proces usuwania nazywa si\u0119 prze\u0142\u0105czaniem kontekstu, czyli context switching. Przy tym zachowywany jest ca\u0142y kontekst zadania: stan stosu, rejestry i inne, po czym proces jest wysy\u0142any w stan oczekiwania, a na jego miejsce wchodzi inny. Jest to kosztowna operacja dla systemu operacyjnego i u\u017cywana jest rzadko, ale nie ma w niej nic z\u0142ego. Cz\u0119ste prze\u0142\u0105czanie kontekstu mo\u017ce sygnalizowa\u0107 problem w systemie operacyjnym, ale zazwyczaj odbywa si\u0119 ono w spos\u00f3b ci\u0105g\u0142y i nie wskazuje na nic szczeg\u00f3lnego.<\/p>\n<p>Tak d\u0142ugi opis jest potrzebny, aby wyja\u015bni\u0107 jeden fakt: im wi\u0119cej zasob\u00f3w CPU stara si\u0119 wykorzysta\u0107 proces w uczciwym schedulerze Linux, tym szybciej zostanie zatrzymany, aby inne procesy mog\u0142y tak\u017ce pracowa\u0107. Czy to jest dobre, czy nie \u2014 to skomplikowane pytanie, na kt\u00f3re odpowied\u017a r\u00f3\u017cni si\u0119 w zale\u017cno\u015bci od obci\u0105\u017cenia. W systemie Windows do niedawna scheduler by\u0142 zaprojektowany z my\u015bl\u0105 o priorytetowym przetwarzaniu aplikacji desktopowych, przez co mog\u0142y zawiesza\u0107 si\u0119 procesy w tle. W Sun Solaris by\u0142o pi\u0119\u0107 r\u00f3\u017cnych klas scheduler\u00f3w. Gdy uruchomiono wirtualizacj\u0119, dodano sz\u00f3sty, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.opennet.ru\/man.shtml?topic=FSS&amp;category=7&amp;russian=4\">scheduler sprawiedliwego podzia\u0142u<\/a><\/noindex>, poniewa\u017c wcze\u015bniejsze pi\u0119\u0107 dzia\u0142a\u0142o z wirtualizacj\u0105 Solaris Zones w spos\u00f3b niew\u0142a\u015bciwy. Szczeg\u00f3\u0142owe zbadanie tego zagadnienia polecam rozpocz\u0105\u0107 od ksi\u0105\u017cek takich jak <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> lub <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. Jak monitorowa\u0107 steal?<\/h3>\n<p>\nMonitorowanie steal wewn\u0105trz maszyny wirtualnej, jak i ka\u017cdej innej metryki procesora, jest proste: mo\u017cna korzysta\u0107 z dowolnego narz\u0119dzia do zbierania metryk CPU. Wa\u017cne, aby wirtualka by\u0142a na Linuxie. Windows jako\u015b nie udost\u0119pnia takiej informacji swoim u\u017cytkownikom. \ud83d\ude41<\/p>\n<p><img decoding=\"async\" alt=\"Steal: kto kradnie czas procesora w wirtualnych maszynach\" src=\"\/wp-content\/uploads\/2019\/04\/3c7cd04f73fd6a74b86af81382090b69.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Wynik polecenia top: szczeg\u00f3\u0142owy podzia\u0142 obci\u0105\u017cenia CPU, w skrajnej prawej kolumnie \u2014 steal<\/i><\/p>\n<p>Problemy pojawiaj\u0105 si\u0119 przy pr\u00f3bie uzyskania tych informacji z hipernadzorcy. Mo\u017cna spr\u00f3bowa\u0107 przewidzie\u0107 steal na maszynie hosta, na przyk\u0142ad, na podstawie parametru Load Average (LA) \u2014 u\u015brednionej warto\u015bci liczby proces\u00f3w oczekuj\u0105cych w kolejce na wykonanie. Metoda obliczania tego parametru nie jest \u0142atwa, ale og\u00f3lnie, je\u015bli znormalizowane w stosunku do liczby w\u0105tk\u00f3w CPU LA wynosi wi\u0119cej ni\u017c 1, to oznacza, \u017ce serwer z Linuxem jest w jaki\u015b spos\u00f3b przeci\u0105\u017cony. <\/p>\n<p>Czego wi\u0119c oczekuj\u0105 te wszystkie procesy? Odpowied\u017a jest oczywista \u2014 procesora. Ale odpowied\u017a nie jest do ko\u0144ca poprawna, poniewa\u017c czasami procesor jest wolny, a LA szaleje. Przypomnijcie sobie, <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/911976\/redhat-nfs-cluster-high-load-average-suddenly\">jak od\u0142\u0105cza si\u0119 NFS i jak w tym czasie ro\u015bnie LA<\/a><\/noindex>. To mo\u017ce by\u0107 podobne r\u00f3wnie\u017c w przypadku dysku lub innych urz\u0105dze\u0144 wej\u015bcia\/wyj\u015bcia. W rzeczywisto\u015bci procesy mog\u0105 oczekiwa\u0107 zako\u0144czenia r\u00f3\u017cnych blokad, zar\u00f3wno fizycznych zwi\u0105zanych z urz\u0105dzeniami wej\u015bcia\/wyj\u015bcia, jak i logicznych, na przyk\u0142ad mutex\u00f3w. W to wchodz\u0105 r\u00f3wnie\u017c blokady na poziomie sprz\u0119towym (zwi\u0105zane z odpowiedzi\u0105 od dysku) lub logicznym (tzw. prymitywy blokuj\u0105ce, do kt\u00f3rych zaliczaj\u0105 si\u0119 r\u00f3\u017cne byty, adaptive mutex, spin, semafory, zmienne warunkowe, rw locks, ipc locks\u2026).<\/p>\n<p>Inn\u0105 cech\u0105 LA jest to, \u017ce jest obliczane jako \u015brednia warto\u015b\u0107 dla systemu operacyjnego. Na przyk\u0142ad, 100 proces\u00f3w konkuruje o jeden plik, w\u00f3wczas LA=50. Taka wysoka warto\u015b\u0107, wydaje si\u0119, m\u00f3wi, \u017ce system operacyjny ma problemy. Ale dla jednego \u017ale napisanego kodu mo\u017ce to by\u0107 normalny stan, chocia\u017c dla niego jest \u017ale, a inne procesy w systemie operacyjnym nie cierpi\u0105. <\/p>\n<p>Z powodu tej u\u015brednionej warto\u015bci (i to przez co najmniej minut\u0119), okre\u015blenie czegokolwiek na podstawie wska\u017anika LA \u2014 jest do\u015b\u0107 nieprzyjemnym zadaniem, z bardzo nieokre\u015blonymi wynikami w konkretnych przypadkach. Je\u015bli spr\u00f3bujesz to zrozumie\u0107, odkryjesz, \u017ce w artyku\u0142ach na Wikipedii i innych dost\u0119pnych \u017ar\u00f3d\u0142ach opisane s\u0105 tylko najprostsze przypadki, bez g\u0142\u0119bszego wyja\u015bnienia procesu. Wszystkich zainteresowanych odsy\u0142am, znowu, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/blog\/2017-08-08\/linux-load-averages.html\">tutaj, do Brendanna Gregga<\/a><\/noindex> \u00a0\u2014 dalej w linkach. Kto ma lenistwo do angielskiego \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/335326\/\">t\u0142umaczenie jego popularnego artyku\u0142u o LA<\/a><\/noindex>.<\/p>\n<h2>3. Efekty specjalne<\/h2>\n<p>\nTeraz skupmy si\u0119 na g\u0142\u00f3wnych przypadkach wyst\u0119powania steal, z kt\u00f3rymi si\u0119 spotykali\u015bmy. Opowiem, jak wynikaj\u0105 one z powy\u017cszego i jak odnosz\u0105 si\u0119 do wska\u017anik\u00f3w na hypervisorze.<\/p>\n<p><b>Recykling<\/b>. Najprostsze i najcz\u0119stsze: hypervisor jest prze\u0142adowany. Rzeczywi\u015bcie, wiele uruchomionych wirtualek, du\u017ce zu\u017cycie procesora w ich wn\u0119trzu, du\u017ca konkurencja, utylizacja po LA powy\u017cej 1 (w odniesieniu do w\u0105tk\u00f3w procesora). Wewn\u0105trz wszystkich wirtualek wszystko zamula. Steal, przekazywany z hypervisora, r\u00f3wnie\u017c ro\u015bnie, nale\u017cy rozdzieli\u0107 obci\u0105\u017cenie lub kogo\u015b wy\u0142\u0105czy\u0107. Og\u00f3lnie rzecz bior\u0105c, wszystko jasne i zrozumia\u0142e.<\/p>\n<p><b>Parawirtualizacja kontra samotne instancje<\/b>. Na hipervizorze znajduje si\u0119 jedna jedyna maszyna wirtualna, kt\u00f3ra zu\u017cywa niewielk\u0105 cz\u0119\u015b\u0107 jego zasob\u00f3w, ale generuje du\u017c\u0105 obci\u0105\u017cenie wej\u015bcia\/wyj\u015bcia, na przyk\u0142ad na dysku. I w niej zjawia si\u0119 niewielki steal, do 10% (jak pokazuj\u0105 przeprowadzone eksperymenty).<\/p>\n<p>Interesuj\u0105cy przypadek. Steal pojawia si\u0119 tutaj z powodu blokad na poziomie p\u00f3\u0142wirtualizowanych sterownik\u00f3w. Wewn\u0105trz maszyny wirtualnej generowane jest przerwanie, kt\u00f3re jest obs\u0142ugiwane przez sterownik i trafia do hipervizora. Z powodu przetwarzania przerwania w hipervizorze dla maszyny wirtualnej wygl\u0105da to jak wys\u0142ane \u017c\u0105danie, jest gotowa do wykonania i czeka na procesor, ale nie otrzymuje czasu procesora. Maszyna wirtualna my\u015bli, \u017ce ten czas zosta\u0142 skradziony. <\/p>\n<p>Dzieje si\u0119 to w momencie wysy\u0142ania bufora, kt\u00f3ry trafia do przestrzeni j\u0105dra hipervizora, i zaczynamy go oczekiwa\u0107. Chocia\u017c z punktu widzenia maszyny wirtualnej powinien on natychmiast wr\u00f3ci\u0107. W zwi\u0105zku z tym, wed\u0142ug algorytmu obliczania steal, ten czas jest uznawany za skradziony. Prawdopodobnie w tej sytuacji mog\u0105 wyst\u0119powa\u0107 inne mechanizmy (na przyk\u0142ad obs\u0142uga innych wywo\u0142a\u0144 systemowych), ale nie powinny one znacznie si\u0119 r\u00f3\u017cni\u0107.<\/p>\n<p><b>Harmonogram przeciwko wysokozadaniowym maszynom wirtualnym<\/b>. Kiedy jedna maszyna wirtualna do\u015bwiadcza wi\u0119kszego steala ni\u017c inne, jest to spowodowane harmonogramem. Im silniej proces obci\u0105\u017ca procesor, tym szybciej harmonogram go usunie, aby inne mog\u0142y r\u00f3wnie\u017c pracowa\u0107. Je\u015bli maszyna wirtualna zu\u017cywa niewiele, prawie nie zauwa\u017cy steala: jej proces uczciwie siedzia\u0142 i czeka\u0142, wi\u0119c powinno mu si\u0119 da\u0107 wi\u0119cej czasu. Je\u015bli maszyna wirtualna generuje maksymalne obci\u0105\u017cenie na wszystkich swoich rdzeniach, jest cz\u0119\u015bciej usuwana z procesora i stara si\u0119 nie dawa\u0107 jej du\u017co czasu. <\/p>\n<p>Jeszcze gorzej, gdy procesy wewn\u0105trz maszyny wirtualnej pr\u00f3buj\u0105 zdoby\u0107 wi\u0119cej czasu procesora, poniewa\u017c nie radz\u0105 sobie z przetwarzaniem danych. Wtedy system operacyjny na hipervizorze, dzi\u0119ki uczciwej optymalizacji, b\u0119dzie przyznawa\u0142 coraz mniej czasu procesora. Ten proces zachodzi lawinowo, a steal ro\u015bnie do nieba, podczas gdy inne maszyny wirtualne mog\u0105 go prawie nie zauwa\u017ca\u0107. Im wi\u0119cej rdzeni, tym gorzej dla maszyny, kt\u00f3ra jest w trudnej sytuacji. Kr\u00f3tko m\u00f3wi\u0105c, najbardziej cierpi\u0105 wysokoobci\u0105\u017cone maszyny wirtualne z wieloma rdzeniami.<\/p>\n<p><b>Niski LA, ale jest steal<\/b>. Je\u017celi LA wynosi oko\u0142o 0,7 (to znaczy, hipervizor wydaje si\u0119 by\u0107 niedo\u0142adowany), ale w poszczeg\u00f3lnych maszynach wirtualnych obserwuje si\u0119 steal:<\/p>\n<ul>\n<li>Ju\u017c opisany powy\u017cej model z parawirtualizacj\u0105. Wirtualna maszyna mo\u017ce otrzymywa\u0107 metryki wskazuj\u0105ce na steal, chocia\u017c hypervisor dzia\u0142a prawid\u0142owo. Na podstawie naszych eksperyment\u00f3w, taki poziom steal nie przekracza 10% i nie powinien mie\u0107 istotnego wp\u0142ywu na wydajno\u015b\u0107 aplikacji dzia\u0142aj\u0105cych w wirtualnej maszynie.\n<\/li>\n<li>Parametr LA jest b\u0142\u0119dnie obliczany. Dok\u0142adniej, w ka\u017cdym konkretnym momencie jest liczony prawid\u0142owo, ale przy u\u015brednieniu za minut\u0119 wychodzi zani\u017cony. Na przyk\u0142ad, je\u015bli jedna wirtualna maszyna na jedn\u0105 trzeci\u0105 hypervisora wykorzystuje wszystkie swoje procesory dok\u0142adnie przez p\u00f3\u0142 minuty, to LA za minut\u0119 na hypervisorze wyniesie 0,15; cztery takie wirtualne maszyny dzia\u0142aj\u0105ce jednocze\u015bnie dadz\u0105 0,6. A to, \u017ce przez p\u00f3\u0142 minuty ka\u017cda z nich mia\u0142a ogromny steal na poziomie 25% w zakresie LA, nie zostanie ju\u017c uwzgl\u0119dnione.\n<\/li>\n<li>Zn\u00f3w, z powodu schedulera, kt\u00f3ry zdecydowa\u0142, \u017ce kto\u015b zbyt wiele konsumuje i niech ten kto\u015b poczeka. A ja w tym czasie prze\u0142\u0105cz\u0119 kontekst, obs\u0142u\u017c\u0119 przerwania i zajm\u0119 si\u0119 innymi wa\u017cnymi kwestiami systemowymi. W rezultacie niekt\u00f3re wirtualne maszyny nie widz\u0105 \u017cadnych problem\u00f3w, a inne do\u015bwiadczaj\u0105 powa\u017cnej degradacji wydajno\u015bci.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>4. Inne zniekszta\u0142cenia<\/h2>\n<p>\nJest jeszcze milion powod\u00f3w do zniekszta\u0142ce\u0144 uczciwego przydzia\u0142u czasu procesora w wirtualnej maszynie. Na przyk\u0142ad, problemy w obliczeniach wprowadzaj\u0105 hyper-threading i NUMA. Ostatecznie myl\u0105 one wyb\u00f3r rdzenia do wykonania procesu, poniewa\u017c scheduler wykorzystuje wsp\u00f3\u0142czynniki - wagi, kt\u00f3re przy prze\u0142\u0105czaniu kontekstu sprawiaj\u0105, \u017ce obliczenia s\u0105 jeszcze trudniejsze.<\/p>\n<p>Mog\u0105 wyst\u0119powa\u0107 zniekszta\u0142cenia z powodu technologii takich jak turbo boost lub odwrotnie, trybu oszcz\u0119dzania energii, kt\u00f3re przy obliczaniu wykorzystania mog\u0105 sztucznie zwi\u0119ksza\u0107 lub zmniejsza\u0107 cz\u0119stotliwo\u015b\u0107 lub nawet kwant czasu na serwerze. W\u0142\u0105czenie turbo boost zmniejsza wydajno\u015b\u0107 jednego w\u0105tku procesora z powodu zwi\u0119kszenia wydajno\u015bci innego. W tym momencie informacja o aktualnej cz\u0119stotliwo\u015bci procesora nie jest przekazywana wirtualnej maszynie, kt\u00f3ra s\u0105dzi, \u017ce jej czas jest kradziony (na przyk\u0142ad, \u017c\u0105da\u0142a 2 GHz, a otrzyma\u0142a po\u0142ow\u0119 mniej). <\/p>\n<p>W sumie, mo\u017ce by\u0107 wiele przyczyn zniekszta\u0142ce\u0144. W konkretnym systemie mo\u017cesz odkry\u0107 co\u015b jeszcze. Zacznij najlepiej od ksi\u0105\u017cek, do kt\u00f3rych poda\u0142em linki powy\u017cej, oraz zbierania statystyk z hypervisor\u00f3w za pomoc\u0105 narz\u0119dzi takich jak perf, sysdig, systemtap, kt\u00f3rych <noindex><a rel=\"nofollow\" href=\"https:\/\/jvns.ca\/blog\/2017\/07\/05\/linux-tracing-systems\/\">jest dziesi\u0105tki<\/a><\/noindex>.<\/p>\n<h2>5. Wnioski<\/h2>\n<p><\/p>\n<ol>\n<li>Pewna ilo\u015b\u0107 steal mo\u017ce wyst\u0119powa\u0107 z powodu parawirtualizacji i mo\u017cna uzna\u0107 to za normalne. W internecie pisz\u0105, \u017ce ta warto\u015b\u0107 mo\u017ce wynosi\u0107 5-10%. Zale\u017cy to od aplikacji w wirtualce oraz od tego, jak\u0105 generuj\u0105 obci\u0105\u017cenie na swoich fizycznych urz\u0105dzeniach. Wa\u017cne jest, aby zwr\u00f3ci\u0107 uwag\u0119 na to, jak aplikacje funkcjonuj\u0105 w wirtualkach.\n<\/li>\n<li>Stosunek obci\u0105\u017cenia na hypervisorze i steal w wirtualce nie zawsze jest jednoznacznie powi\u0105zany, obie oceny steal mog\u0105 by\u0107 b\u0142\u0119dne w konkretnych sytuacjach przy r\u00f3\u017cnych obci\u0105\u017ceniach.\n<\/li>\n<li>Scheduler \u017ale traktuje procesy, kt\u00f3re du\u017co \u017c\u0105daj\u0105. Stara si\u0119 dawa\u0107 mniej tym, kt\u00f3rzy prosz\u0105 wi\u0119cej. Du\u017ce wirtualki to z\u0142o.\n<\/li>\n<li>Niewielki steal mo\u017ce by\u0107 norm\u0105 r\u00f3wnie\u017c bez parawirtualizacji (bior\u0105c pod uwag\u0119 obci\u0105\u017cenie w wirtualce, szczeg\u00f3lno\u015bci obci\u0105\u017cenia s\u0105siad\u00f3w, rozk\u0142ad obci\u0105\u017cenia na w\u0105tki i inne czynniki).\n<\/li>\n<li>Je\u015bli chcesz ustali\u0107 steal w konkretnej systemie, musisz bada\u0107 r\u00f3\u017cne mo\u017cliwo\u015bci, zbiera\u0107 metryki, dok\u0142adnie je analizowa\u0107 i przemy\u015ble\u0107, jak r\u00f3wnomiernie rozdziela\u0107 obci\u0105\u017cenie. Od wszelkich przypadk\u00f3w mog\u0105 wyst\u0119powa\u0107 odchylenia, kt\u00f3re nale\u017cy potwierdza\u0107 eksperymentalnie lub sprawdza\u0107 w debuggerze j\u0105dra.\n<\/li>\n<\/ol>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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: kto kradnie czas procesora w wirtualkach | ProHoster","description":"Cze\u015b\u0107!","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/steal-kto-kradyot-u-virtualok-protsessornoe-vremya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/32331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=32331"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32331\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24147"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}