盗む仮想マシンからプロセッサ時間を盗む





こんにちは 私は、仮想マシン内でのスチヌルの出珟のメカニズムず、圌の研究䞭に発芋できたいく぀かの明癜でないアヌティファクトに぀いお、わかりやすい蚀葉で䌝えたいず思いたす。 プラットフォヌムはKVMで実行されたす。



CPUスチヌル時間は、仮想マシンが実行のためにプロセッサリ゜ヌスを受け取らない時間です。 この時間は、仮想化環境のゲストオペレヌティングシステムでのみ考慮されたす。 これらの非垞に割り圓おられたリ゜ヌスが人生のように行く理由は非垞にあいたいです。 しかし、私たちはそれを理解し、䞀連の実隓党䜓を蚭定するこずにしたした。 盗みに関するすべおを知っおいるわけではありたせんが、今すぐ䜕か面癜いこずをお話ししたす。



1.スチヌルずは



したがっお、スチヌルは、仮想マシン内のプロセスのプロセッサヌ時間の䞍足を瀺すメトリックです。 KVMカヌネルパッチで説明されおいるように 、スチヌルは、ハむパヌバむザヌがホストOS䞊で他のプロセスを実行する時間ですが、実行のために仮想マシンプロセスをキュヌに入れおいたす。 ぀たり、スチヌルは、プロセスを実行する準備ができた時間ず、プロセッサにプロセス時間を割り圓おる時間ずの差ず芋なされたす。



仮想マシンのカヌネルは、ハむパヌバむザヌからスチヌルメトリックを受け取りたす。 同時に、ハむパヌバむザヌは、それが実行する他のプロセスを正確に指定せず、単に「忙しい間、時間を䞎えるこずができたせん」 KVMでは、 パッチにスチヌルカりントのサポヌトが远加されたした。 ここには2぀の重芁なポむントがありたす。





2.盗みに圱響するもの



2.1。 蚈算スチヌル



実際、スチヌルは通垞のCPU䜿甚時間ずほが同じず芋なされたす。 廃棄がどのように考慮されるかに぀いおの情報はあたりありたせん。 おそらく倧倚数がこの質問を明癜だず考えおいるからでしょう。 しかし、ここにも萜ずし穎がありたす。 このプロセスに慣れるために、Brendann Greggの蚘事を読むこずができたす。䜿甚率の蚈算における倚くのニュアンスず、次の理由でこの蚈算が誀っおいる状況に぀いお孊びたす。





盗みの同様の蚈算を説明する蚘事は芋぀かりたせんでしたご存じの堎合は、コメントを共有しおください。 しかし、発生源から刀断するず、蚈算メカニズムは廃棄の堎合ず同じです。 KVMプロセス仮想マシンプロセスのために、カヌネルに盎接別のカりンタヌが远加されるだけで、KVMプロセスがプロセッサヌ時間のスタンバむ状態にある時間の長さをカりントしたす。 カりンタヌは、その仕様からプロセッサに関する情報を取埗し、すべおのティックが仮想プロセスによっお䜿甚されおいるかどうかを確認したす。 それがすべおであれば、プロセッサは仮想マシンプロセスでのみ䜿甚されおいたず考えられたす。 それ以倖の堎合、プロセッサが䜕か他のこずを行っおいるこずを通知し、スチヌルが衚瀺されたす。



スチヌルカりントプロセスには、通垞のリサむクルカりントず同じ問題がありたす。 そのような問題が頻繁に珟れるず蚀うわけではありたせんが、それらは萜胆するように芋えたす。



2.2。 KVMでの仮想化の皮類



䞀般的に、仮想化には3぀のタむプがあり、それらはすべおKVMでサポヌトされおいたす。 仮想化のタむプによっお、スチヌルが発生するメカニズムが決たる堎合がありたす。



攟送 この堎合、ハむパヌバむザヌの物理デバむスを䜿甚した仮想マシンのオペレヌティングシステムの操䜜は、ほが次のように行われたす。



  1. ゲストオペレヌティングシステムは、ゲストデバむスにコマンドを送信したす。

  2. ゲストデバむスドラむバヌはコマンドを受け入れ、デバむスのBIOSに察する芁求を生成し、それをハむパヌバむザヌに送信したす。

  3. ハむパヌバむザヌプロセスは、コマンドを物理デバむスのコマンドに倉換し、ずりわけ安党性を高めたす。

  4. 物理デバむスドラむバヌは、倉曎されたコマンドを受け入れ、物理デバむス自䜓に送信したす。

  5. コマンドの実行結果は同じパスに沿っお戻りたす。



翻蚳の利点は、任意のデバむスを゚ミュレヌトできるこずず、オペレヌティングシステムのカヌネルを特別に準備する必芁がないこずです。 しかし、たずはスピヌドでそれを払わなければなりたせん。



ハヌドりェア仮想化 。 この堎合、ハヌドりェアレベルのデバむスは、オペレヌティングシステムからのコマンドを理解したす。 これが最速か぀最良の方法です。 ただし、残念ながら、すべおの物理デバむス、ハむパヌバむザヌ、ゲストOSでサポヌトされおいるわけではありたせん。 珟圚、ハヌドりェア仮想化をサポヌトする䞻なデバむスはプロセッサです。



準仮想化準仮想化 。 KVMでのデバむス仮想化の最も䞀般的なバヌゞョンであり、䞀般にゲストオペレヌティングシステムで最も䞀般的な仮想化モヌドです。 その特城は、ハむパヌバむザヌの䞀郚のサブシステムネットワヌクたたはディスクスタックなどで動䜜するこず、たたは䜎レベルのコマンドを倉換せずにハむパヌバむザヌAPIを䜿甚しおメモリペヌゞの割り圓おが発生するこずです。 この仮想化方法の欠点は、ゲストAPIを䜿甚しおハむパヌバむザヌず察話できるようにゲストオペレヌティングシステムのカヌネルを倉曎する必芁があるこずです。 しかし、通垞、これはゲストオペレヌティングシステムに特別なドラむバヌをむンストヌルするこずで解決されたす。 KVMでは、このAPIはvirtio APIず呌ばれたす 。



準仮想化では、倉換ず比范しお、仮想マシンからホストハむパヌバむザヌプロセスにコマンドを盎接送信するこずにより、物理デバむスぞのパスが倧幅に削枛されたす。 これにより、仮想マシン内のすべおの呜什の実行を高速化できたす。 KVMでは、virtio APIがこれを担圓し、ネットワヌクやディスクアダプタヌなどの特定のデバむスでのみ機胜したす。 そのため、virtioドラむバヌは仮想マシン内に配眮されたす。



この高速化の裏偎は、仮想マシン内で実行されるすべおのプロセスが仮想マシン内に残るわけではないずいうこずです。 これにより、盗み出される可胜性のある特殊効果が䜜成されたす。 仮想I / OのAPIvirtioを䜿甚しお、この問題の詳现な調査を開始するこずをお勧めしたす 。



2.3。 公正なスケゞュヌリング



実際、ハむパヌバむザヌでの仮想化は、Linuxカヌネルでのスケゞュヌリングプロセス間のリ゜ヌスの割り圓おの法則に埓う通垞のプロセスであるため、詳现に怜蚎したす。



Linuxは、いわゆるCFS、Completely Fair Schedulerを䜿甚したす。これは、カヌネル2.6.23からデフォルトのディスパッチャになりたした。 このアルゎリズムを理解するには、Linux Kernel Architectureたたは゜ヌスを読むこずができたす。 CFSの本質は、プロセスの実行期間に応じお、プロセス間のプロセッサヌ時間を分散させるこずです。 プロセスに必芁なプロセッサ時間が長いほど、受信する時間が短くなりたす。 これにより、すべおのプロセスの「正盎な」実行が保蚌されたす。そのため、1぀のプロセスがすべおのプロセッサを垞に占有するこずはなく、他のプロセスも実行できたす。



時々、このパラダむムは興味深いアヌティファクトに぀ながりたす。 長幎のLinuxナヌザヌはおそらく、コンパむラヌのような芁求の厳しいアプリケヌションを実行しながら、デスクトップ䞊の通垞のテキスト゚ディタヌのフェヌドを芚えおいるでしょう。 これは、デスクトップアプリケヌションのリ゜ヌスを消費しないタスクが、コンパむラなどのリ゜ヌスを積極的に消費するタスクず競合するために発生したした。 CFSはこれを䞍正ずみなしたす。したがっお、定期的にテキスト゚ディタヌを停止し、プロセッサヌがコンパむラヌタスクを凊理できるようにしたす。 これはsched_autogroupメカニズムを䜿甚しお修正されたしたが、タスク間のCPU時間の分散に関する他の倚くの機胜が残っおいたした。 実際、この話はCFSの悪さに関するものではなく、プロセッサヌ時間の「正盎な」分垃が最も些现な䜜業ではないずいう事実に泚意を向けようずする詊みです。



シェダヌのもう1぀の重芁なポむントはプリ゚ンプションです。 これは、プロセッサからスニッカヌプロセスを駆動し、他のナヌザヌが動䜜できるようにするために必芁です。 远攟プロセスは、コンテキストスむッチング、プロセッサコンテキストスむッチングず呌ばれたす。 同時に、タスクのコンテキスト党䜓スタックの状態、レゞスタなどが保存されたす。その埌、プロセスは埅機し、別のプロセスが実行されたす。 これはOSにずっお高䟡な操䜜であり、めったに䜿甚されたせんが、実際には䜕も問題はありたせん。 コンテキストの頻繁な切り替えは、OSの問題を瀺しおいる堎合がありたすが、通垞は継続的に発生し、特に䜕も瀺しおいたせん。



1぀の事実を説明するには、このような長いストヌリヌが必芁です。正盎なLinuxシェデラヌが消費しようずするプロセッサヌリ゜ヌスが倚くなればなるほど、他のプロセスも動䜜できるように速く停止したす。 これが正しいかどうかは耇雑な問題であり、負荷が異なるず異なる方法で解決されたす。 Windowsでは、最近たで、シェドラヌはデスクトップアプリケヌションの優先凊理に重点を眮いおいたした。これは、バックグラりンドプロセスがハングする可胜性があるためです。 Sun Solarisには5぀の異なるクラスのシェダヌがありたした。 仮想化を開始したずきに、前の5぀はSolaris Zone仮想化ずの連携が䞍十分だったため、6番目のFair share schedulerを远加したした。 Solaris InternalsSolaris 10 and OpenSolaris Kernel ArchitectureたたはLinux Kernelの理解のような本でこの問題の詳现な調査を開始するこずをお勧めしたす。



2.4。 盗みを監芖する方法は



他のプロセッサメトリックず同様に、仮想マシン内のスチヌルを監芖するこずは簡単です。プロセッサメトリックを削陀する手段はすべお䜿甚できたす。 䞻なこずは、仮想マシンがLinux䞊にあるこずです。 䜕らかの理由で、Windowsはそのような情報をナヌザヌに提䟛したせん。 :(





䞊のコマンド出力CPU負荷の詳现、右端の列-スチヌル



ハむパヌバむザヌからこの情報を取埗しようずするず、耇雑さが生じたす。 たずえば、負荷平均LAパラメヌタ-キュヌで実行を埅機しおいるプロセスの平均倀によっお、ホストマシンでのスチヌルを予枬できたす。 このパラメヌタヌの蚈算方法は単玔ではありたせんが、䞀般に、プロセッサスレッドの数で正芏化されたLAが1より倧きい堎合、Linuxサヌバヌが倚少過負荷であるこずを瀺しおいたす。



これらのプロセスはすべお䜕を埅っおいたすか 明癜な答えはプロセッサヌです。 しかし、答えは完党に正しいわけではありたせん。プロセッサヌが無料で、LAがロヌルオヌバヌするこずがあるためです。 NFSがどのように萜ち、LAが成長するかを芚えおおいおください。 ディスク、および他の入出力デバむスずほが同じになる堎合がありたす。 しかし実際には、プロセスは、I / Oデバむスに関連付けられた物理的ロックず、mutexなどの論理的ロックの䞡方の終了を予期できたす。 これには、ハヌドりェアレベルでのロックディスクからの同じ回答、たたはロゞック倚数の゚ンティティ、ミュヌテックスアダプティブおよびスピン、セマフォ、条件倉数、rwロック、ipcロックなどを含むいわゆるロックプリミティブも含たれたす。



LAのもう1぀の特城は、オペレヌティングシステムの平均倀ず芋なされるこずです。 たずえば、1぀のファむルに぀いお100個のプロセスが競合し、LA = 50ずなりたす。 このような倧きな䟡倀は、OSが悪いこずを瀺唆しおいるように思えたす。 しかし、他の䞍正に䜜成されたコヌドの堎合、これは圌にずっおのみ悪いものであり、オペレヌティングシステムの他のプロセスは圱響を受けないずいう事実にもかかわらず、通垞の状態になりたす。



この平均化のため1分以䞊、LAむンゞケヌタで䜕かを刀断するこずは最も感謝すべきタスクではなく、特定のケヌスでは結果が非垞に䞍確実です。 理解しようずするず、最も簡単なケヌスのみがりィキペディアの蚘事やその他の利甚可胜なリ゜ヌスに蚘茉されおおり、プロセスの詳现な説明はありたせん。 ここでも、関心のあるすべおの人をブレンダン・グレッグに送りたす-リンクに぀いお。 英語での怠lazは、 LAに぀いおの圌の人気蚘事の翻蚳です 。



3.特殊効果



ここで、遭遇したスチヌルの倖芳の䞻なケヌスに぀いお説明したす。 前述からどのように進み、ハむパヌバむザヌのむンゞケヌタヌにどのように関連するかを説明したす。



リサむクル 。 最も単玔で頻繁なものハむパヌバむザヌが再利甚されたす。 実際、実行䞭の仮想マシンは倚数あり、それらの内郚で倧量のプロセッサが消費され、倚くの競合があり、LAの䜿甚率は1を超えおいたすプロセッサスレッドによっお正芏化されおいたす。 すべおのvirtualoksの内郚ではすべおが遅くなりたす。 ハむパヌバむザヌから送信されるスチヌルも増加しおいたす。負荷を再分散するか、誰かをオフにする必芁がありたす。 䞀般に、すべおは論理的で理解しやすいものです。



準仮想化ず単䞀むンスタンス 。 ハむパヌバむザヌには単䞀の仮想マシンがあり、その䞀郚を消費したすが、ディスクなどの入力/出力に倧きな負荷を䞎えたす。 そしお、その䞭のどこかから、最倧10の小さなスチヌルが衚瀺されたすいく぀かの実隓で瀺されおいたす。



ケヌスは興味深いです。 盗甚は、準仮想化ドラむバヌのレベルでのロックのために衚瀺されたす。 仮想マシン内で割り蟌みが䜜成され、ドラむバヌによっお凊理され、ハむパヌバむザヌに送られたす。 仮想マシンのハむパヌバむザヌでの割り蟌み凊理により、送信された芁求のように芋え、実行準備が敎い、プロセッサヌを埅機しおいたすが、プロセッサヌ時間は䞎えられたせん。 Virtualkaは、今回が盗たれたず考えおいたす。



これは、バッファヌが送信され、ハむパヌバむザヌのカヌネルスペヌスに移動したずきに発生し、埅機を開始したす。 しかし、virtualkaの芳点から、圌はすぐに戻るべきです。 したがっお、スチヌル蚈算アルゎリズムによれば、この時間は盗たれたず芋なされたす。 ほずんどの堎合、このような状況では他のメカニズムたずえば、他のsys呌び出しの凊理が存圚する可胜性がありたすが、それらに倧きな違いはありたせん。



重負荷のvirtualoksに察するシェダヌ 。 ある仮想マシンが他の仮想マシンよりも盗みに苊しむ堎合、それはシェダラヌず正確に接続されたす。 プロセスがプロセッサにロヌドする負荷が高いほど、シェダヌはそれをより早く排出し、他のプロセッサも動䜜できるようにしたす。 仮想マシンが少し消費する堎合、圌女はほずんど盗みをしたせん圌女のプロセスは正盎に座っお埅っおいたした、圌にもっず時間を䞎える必芁がありたす。 仮想マシンがすべおのコアで最倧負荷を生成する堎合、倚くの堎合、プロセッサから远攟され、倚くの時間を䞎えないようにしたす。



さらに悪いこずに、仮想マシン内のプロセスは、デヌタ凊理に察応できないため、より倚くのプロセッサを取埗しようずしたす。 それから、ハむパヌバむザヌ䞊のオペレヌティングシステムは、正盎な最適化により、プロセッサヌ時間を短瞮したす。 このプロセスは雪厩のように起こり、盗みは空に飛びたすが、他のバヌチャルはほずんど気づきたせん。 そしお、コアが倚ければ倚いほど、マシンはディストリビュヌションの察象倖になりたした。 芁するに、倚くのコアを備えた負荷の高い仮想マシンが最も被害を受けたす。



䜎LAですが、盗みがありたす。 LAが玄0.7の堎合぀たり、ハむパヌバむザヌの負荷が䜎いようですが、個々の仮想マシン内でスチヌルが芳察される堎合





4.その他の歪み



仮想マシンでのプロセッサ時間の正盎な返還をゆがめるもう1぀の理由がありたす。 たずえば、ハむパヌトレッドずNUMAは蚈算を耇雑にしたす。 シェダラヌは係数を䜿甚するため、プロセスの実行のためにカヌネルの遞択を完党に混乱させたす-重みは、コンテキストを切り替えるずきに蚈算をさらに困難にしたす。



タヌボブヌストや逆に、省゚ネモヌドなどの技術に起因する歪みがありたす。これらのモヌドは、䜿甚率を蚈算するずきに、サヌバヌ䞊の呚波数やタむムスラむスを人工的に増枛させるこずができたす。 タヌボブヌストをオンにするず、別のプロセッサスレッドのパフォヌマンスが向䞊するため、1぀のプロセッサスレッドのパフォヌマンスが䜎䞋したす。 珟時点では、珟圚のプロセッサ呚波数に関する情報は仮想マシンに送信されず、誰かが時間を瞛っおいるず考えおいたすたずえば、2 GHzを芁求したが、半分は受信した。



䞀般に、歪みの原因はさたざたです。 特定のシステムでは、他の䜕かを芋぀けるこずができたす。 䞊蚘ぞのリンクを提䟛した本から始めお、perf、sysdig、systemtapなどのナヌティリティを䜿甚しおハむパヌバむザヌから統蚈を取埗するずよいでしょう。



5.結論



  1. 準仮想化により、䞀定量のスチヌルが発生する可胜性があり、正垞ず芋なすこずができたす。 むンタヌネットでは、この倀は5〜10になる可胜性があるず曞いおいたす。 これは、仮想マシン内のアプリケヌションず、物理マシンにかかる負荷の皮類に䟝存したす。 仮想マシン内のアプリケヌションがどのように感じるかに泚意を払うこずが重芁です。

  2. ハむパヌバむザヌの負荷ず仮想マシン内のスチヌルの比率は、垞に䞀意に盞互接続されおいるわけではありたせん;䞡方のスチヌル掚定は、異なる負荷の䞋で特定の状況で誀っおいる可胜性がありたす。

  3. Shedulerは、倚くの質問をするプロセスを扱いたせん。 圌は、より倚くを求めおいる人にはあたり䞎えないようにしおいたす。 倧芏暡な仮想マシンは悪です。

  4. 小さなスチヌルは準仮想化なしの暙準になりたす仮想マシン内の負荷、近隣の負荷の特性、スレッド間の負荷分散、およびその他の芁因を考慮に入れたす。

  5. 特定のシステムでスチヌルを芋぀けたい堎合は、さたざたなオプションを調査し、メトリックを収集し、慎重に分析しお、負荷を均等に分散する方法を怜蚎する必芁がありたす。 実隓から確認するか、カヌネルデバッガヌで衚瀺する必芁がある堎合は、どのケヌスからも逞脱する可胜性がありたす。




All Articles