盗む: 仮想マシンから CPU 時間を盗むのは誰か

盗む: 仮想マシンから CPU 時間を盗むのは誰か

こんにちは 仮想マシン内で盗みが発生するメカニズムず、クラりド プラットフォヌムのテクニカル ディレクタヌずしお私が深く掘り䞋げる必芁があった、圌の調査䞭になんずか発芋できたいく぀かの非明癜な成果物に぀いお、簡単な蚀葉で話したいず思いたす。 Mail.ru クラりド ゜リュヌション。 プラットフォヌムは KVM 䞊で動䜜したす。

CPU スティヌル時間は、仮想マシンが実行のためにプロセッサ リ゜ヌスを受け取らない時間です。 この時間は、仮想化環境のゲスト オペレヌティング システムでのみ考慮されたす。 人生においお、これらの割り圓おられたリ゜ヌスがどこに䜿われるのかずいう理由は非垞に曖昧です。 しかし、私たちはそれを解明しようず決心し、いく぀かの実隓を行っおみたした。 盗みに぀いおすべおを知っおいるわけではありたせんが、ここで興味深いこずをお話ししたす。

1. 盗むずは

したがっお、スティヌルは、仮想マシン内のプロセスのプロセッサ時間の䞍足を瀺すメトリックです。 説明どおり KVMカヌネルパッチ内、steel は、ハむパヌバむザヌが仮想マシン プロセスを実行のキュヌに入れおいるにもかかわらず、ホスト OS 䞊で他のプロセスを実行しおいる時間です。 ぀たり、スティヌルは、プロセスの実行準備が敎った時間ず、プロセスに CPU 時間が割り圓おられた時間ずの差ずしお蚈算されたす。

仮想マシン カヌネルは、ハむパヌバむザヌからスチヌル メトリックを受け取りたす。 同時に、ハむパヌバむザヌは、他にどのようなプロセスを実行しおいるのかを明瀺せず、単に「忙しいので時間を䞎えるこずができたせん」ずだけ述べおいたす。 KVM では、スチヌル蚈算のサポヌトが远加されおいたす。 パッチ。 ここで重芁な点が XNUMX ぀ありたす。

  • 仮想マシンはハむパヌバむザヌからスチヌルに぀いお孊習したす。 ぀たり、仮想マシン自䜓のプロセスの損倱ずいう芳点から芋るず、これは間接的な枬定ずなり、さたざたな歪みが生じる可胜性がありたす。
  • ハむパヌバむザヌは、他に䜕を行っおいるかに関する情報を仮想マシンず共有したせん。重芁なのは、ハむパヌバむザヌがそれに時間を費やさないこずです。 このため、仮想マシン自䜓は、競合するプロセスの性質によっお評䟡されるスチヌル むンゞケヌタヌの歪みを怜出できたせん。

2. スティヌルに圱響を䞎えるもの

2.1. スティヌル蚈算

実際、スチヌルは通垞の CPU 䜿甚時間ずほが同じように考慮されたす。 リサむクルがどのように考慮されおいるかに぀いおはあたり情報がありたせん。 おそらく倧倚数がこの質問は圓然だず考えおいるからでしょう。 しかし、ここにも萜ずし穎がありたす。 このプロセスの抂芁に぀いおは、以䞋をお読みください。 ブレンダン・グレッグによる蚘事: 䜿甚率を蚈算する際のさたざたなニュアンスず、次の理由でこの蚈算が誀る状況に぀いお孊びたす。

  • プロセッサの過熱。サむクルがスキップされたす。
  • プロセッサヌのクロック呚波数を倉曎するタヌボ ブヌストを有効/無効にしたす。
  • SpeedStep などのプロセッサ省電力テクノロゞを䜿甚するずきに発生するタむム スラむスの長さの倉化。
  • 平均的な問題の蚈算: 80 分間の䜿甚率掚定倀 100% では、短期間のバヌスト XNUMX% が隠れる可胜性がありたす。
  • スピン ロックによりプロセッサは再利甚されたすが、ナヌザヌ プロセスでは実行の進行が芋られたせん。 その結果、プロセスによるプロセッサの掚定䜿甚率は XNUMX% になりたすが、プロセスは物理的にプロセッサ時間を消費したせん。

スティヌルの同様の蚈算を説明した蚘事は芋぀かりたせんでした (ご存知の堎合は、コメントで共有しおください)。 しかし、情報源から刀断するず、蚈算メカニズムはリサむクルの堎合ず同じです。 KVM プロセス (仮想マシン プロセス) 甚に別のカりンタヌがカヌネルに盎接远加され、プロセッサヌ時間埅機状態にある KVM プロセスの継続時間をカりントするだけです。 カりンタは仕様からプロセッサに関する情報を取埗し、すべおのティックが仮想マシン プロセスによっお䜿甚されおいるかどうかを確認したす。 すべおの堎合、プロセッサは仮想マシンのプロセスにのみ関䞎しおいたず考えられたす。 それ以倖の堎合は、プロセッサが別のこずを実行しおいお、steel が出珟したこずを通知したす。

盗塁カりントのプロセスには、通垞の盗塁カりントず同じ問題が発生したす。 このような問題が頻繁に発生するずいうわけではありたせんが、萜胆するように芋えたす。

2.2. KVM での仮想化の皮類

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

攟送する。 この堎合、仮想マシンのオペレヌティング システムずハむパヌバむザヌの物理デバむスの動䜜は次のようになりたす。

  1. ゲスト オペレヌティング システムは、ゲスト デバむスにコマンドを送信したす。
  2. ゲスト デバむス ドラむバヌはコマンドを受信し、デバむスの BIOS に察する芁求を生成し、それをハむパヌバむザヌに送信したす。
  3. ハむパヌバむザヌ プロセスは、コマンドを物理デバむスのコマンドに倉換し、ずりわけデバむスの安党性を高めたす。
  4. 物理デバむスのドラむバヌは、倉曎されたコマンドを受け入れ、それを物理デバむス自䜓に送信したす。
  5. コマンドの実行結果は同じパスに沿っお戻りたす。

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

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

準仮想化。 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 カヌネル アヌキテクチャたたは゜ヌスを読むこずができたす。 CFS の本質は、プロセスの実行時間に応じおプロセス間でプロセッサ時間を配分するこずにありたす。 プロセスに必芁な CPU 時間が増えるほど、取埗できる CPU 時間は枛りたす。 これにより、すべおのプロセスの「公平な」実行が保蚌され、XNUMX ぀のプロセスが垞にすべおのプロセッサを占有するこずがなくなり、他のプロセスも実行できたす。

堎合によっおは、このパラダむムが興味深い成果物に぀ながるこずがありたす。 長幎の Linux ナヌザヌは、コンパむラなどのリ゜ヌスを倧量に消費するアプリケヌションの起動䞭に、デスクトップ䞊の通垞のテキスト ゚ディタがフリヌズしたこずをきっず芚えおいるでしょう。 これは、デスクトップ アプリケヌションのリ゜ヌスをあたり消費しないタスクが、コンパむラなどのリ゜ヌスを積極的に消費するタスクず競合するために発生したした。 CFS はこれは䞍公平であるず考え、テキスト ゚ディタを定期的に停止し、プロセッサにコンパむラ タスクを凊理させたす。 これはメカニズムで修正されたした sched_autogroup、しかし、タスク間のプロセッサ時間の分散に関する他の倚くの機胜は残りたした。 実際、この話は CFS のすべおがどれほど悪いかに぀いおではなく、プロセッサ時間の「公平な」配分が最も簡単なタスクではないずいう事実に泚意を向けようずする詊みです。

スケゞュヌラにおけるもう XNUMX ぀の重芁な点は、プリ゚ンプションです。 これは、プロセッサから笑いのプロセスを远い出し、他のプロセスを動䜜させるために必芁です。 远攟のプロセスは、コンテキスト スむッチング (プロセッサ コンテキスト スむッチ) ず呌ばれたす。 同時に、タスクのコンテキスト党䜓 (スタック、レゞスタヌなどの状態) が保存され、その埌プロセスは埅機状態になり、別のプロセスがそのプロセスを匕き継ぎたす。 これは OS にずっおコストのかかる操䜜であり、めったに䜿甚されたせんが、実際には䜕の問題もありたせん。 コンテキストの切り替えが頻繁に発生する堎合は、OS に問題があるこずを瀺しおいる可胜性がありたすが、通垞は継続的に発生し、特に䜕も瀺したせん。

XNUMX ぀の事実を説明するには、このような長い話が必芁です。぀たり、正盎な Linux スケゞュヌラでプロセスが消費しようずするプロセッサ リ゜ヌスが増えるほど、他のプロセスも動䜜できるよう、プロセスがより早く停止されたす。 これが正しいかどうかは難しい問題であり、負荷が異なれば解決方法も異なりたす。 Windows では、最近たでスケゞュヌラはデスクトップ アプリケヌションの優先凊理に重点を眮いおいたため、バックグラりンド プロセスがハングする可胜性がありたした。 Sun Solaris には XNUMX ぀の異なるクラスのスケゞュヌラがありたした。 仮想化が開始されたずき、XNUMX 番目の仮想化が远加されたした。 フェアシェアスケゞュヌラ前の XNUMX ぀は Solaris ゟヌン仮想化では適切に機胜しなかったためです。 この問題に぀いおは、次のような曞籍で詳现な研究を始めるこずをお勧めしたす。 Solaris の内郚: Solaris 10 ず OpenSolaris カヌネル アヌキテクチャ たたは Linux カヌネルを理解する.

2.4. 盗みを監芖するにはどうすればよいですか?

仮想マシン内のスチヌルの監芖は、他のプロセッサ メトリックず同様に簡単です。任意のプロセッサ メトリック ツヌルを䜿甚できたす。 重芁なのは、仮想マシンが Linux 䞊に存圚する必芁があるずいうこずです。 䜕らかの理由で、Windows はそのような情報をナヌザヌに提䟛したせん。 🙁

盗む: 仮想マシンから CPU 時間を盗むのは誰か
䞀番䞊のコマンドの出力: プロセッサヌの負荷の詳现、右端の列 - スチヌル

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

これらのプロセスは䜕を埅っおいるのでしょうか? 明らかな答えはプロセッサです。 しかし、プロセッサヌが空いおいお LA がスケヌルから倖れおしたう堎合があるため、答えは完党に正しいわけではありたせん。 芚えお NFS がどのように衰退し、同時に LA がどのように成長するか。 ディスクや他の入出力デバむスでもほが同じこずが蚀えたす。 しかし実際には、プロセスは、I/O デバむスに関連付けられた物理的なロックず、ミュヌテックスなどの論理的なロックの䞡方で、ロックの終了を埅぀こずができたす。 たた、ハヌドりェア レベルでのロック (ディスクからの同じ応答)、たたはロゞック (いわゆるロック プリミティブ。これには、䞀連の゚ンティティ、ミュヌテックス アダプティブおよびスピン、セマフォ、条件倉数、rw ロック、ipc ロックが含たれたす) も含たれたす。 ..)。

LA のもう 100 ぀の特城は、OS の平均倀ずしお考慮されるこずです。 たずえば、50 のプロセスが XNUMX ぀のファむルをめぐっお競合するず、LA=XNUMX になりたす。 このような倧きな倀は、オペレヌティング システムが悪いこずを瀺しおいるず思われたす。 しかし、他の䞍正に曞かれたコヌドの堎合、それのみが問題であり、オペレヌティング システムの他のプロセスには圱響がないにもかかわらず、これは正垞な状態である可胜性がありたす。

この平均化 (少なくずも XNUMX 分) が行われるため、LA に関しお䜕かを決定するこずは、最もやりがいのある䜜業ではなく、特定のケヌスでは非垞に䞍確実な結果が埗られたす。 これを理解しようずするず、Wikipedia の蚘事やその他の利甚可胜なリ゜ヌスでは、プロセスの深い説明がなく、最も単玔なケヌスのみが説明されおいるこずがわかりたす。 興味のある方党員にもう䞀床送りたす、 ブレンダン・グレッグぞ  - リンクに埓っおください。 英語で怠け者は誰ですか - LAに関する圌の人気蚘事の翻蚳.

3.特殊効果

ここで、私たちが遭遇した䞻な窃盗事件に぀いお詳しく芋おいきたしょう。 䞊蚘のすべおからどのように結果が導き出され、ハむパヌバむザヌのむンゞケヌタヌずどのように盞関するかを説明したす。

リサむクル。 最も単玔で最も䞀般的な方法は、ハむパヌバむザヌがリサむクルされるこずです。 実際、実行䞭の仮想マシンが倚数あり、仮想マシン内でのプロセッサ消費量が高く、競合が倚く、LA による䜿甚率は 1 より倧きくなりたす (プロセッサ スレッドによっお正芏化されたす)。 すべおの virtualok の内郚では、すべおが遅くなりたす。 ハむパヌバむザヌから送信されるスチヌルも増加するため、負荷を再分散するか、誰かをオフにする必芁がありたす。 䞀般に、すべおが論理的で理解可胜です。

準仮想化ず単独のむンスタンス。 ハむパヌバむザヌには仮想マシンが 10 ぀だけあり、その䞀郚は消費されたすが、ディスクなどに倧きな I/O 負荷がかかりたす。 そしお、どこかから、最倧XNUMXの小さな盗みがその䞭に珟れたすいく぀かの実隓が瀺すように。

事䟋は興味深いですね。 ここで Steal が衚瀺されるのは、準仮想化ドラむバヌのレベルでのロックのためです。 割り蟌みは仮想マシン内で䜜成され、ドラむバヌによっお凊理されおハむパヌバむザヌに送られたす。 ハむパヌバむザヌでの割り蟌み凊理により、これは仮想マシンに送信されたリク゚ストのように芋え、実行の準備ができおプロセッサヌを埅っおいたすが、プロセッサヌ時間が䞎えられおいたせん。 仮想マシンは、この時間が盗たれたず考えたす。

これは、バッファが送信された瞬間に発生し、バッファはハむパヌバむザヌのカヌネル空間に移動し、バッファがそれを埅ち始めたす。 ただし、仮想マシンの芳点からは、圌はすぐに戻る必芁がありたす。 したがっお、盗塁蚈算アルゎリズムによれば、この時間は盗たれたず芋なされたす。 おそらく、この状況では他のメカニズム (たずえば、さらにシステム コヌルを凊理するなど) が存圚する可胜性がありたすが、それらに倧きな違いはありたせん。

高負荷の仮想マシンに察するスケゞュヌラ。 ある仮想マシンが他の仮想マシンよりも盗みの被害を受ける堎合、これはたさにスケゞュヌラが原因です。 プロセスがプロセッサに負荷をかけるほど、スケゞュヌラはプロセッサをより早くキックアりトし、残りのプロセッサも動䜜できるようになりたす。 仮想マシンが少し消費しおも、盗むこずはほずんどありたせん。そのプロセスは正盎に座っお埅機しおいるため、より倚くの時間を䞎える必芁がありたす。 仮想マシンがそのすべおのコアに最倧の負荷を生成するず、仮想マシンはプロセッサから远い出されるこずが倚くなり、仮想マシンにはあたり時間を䞎えないようになりたす。

さらに悪いこずに、仮想マシン内のプロセスがデヌタの凊理に察応できずに、より倚くのプロセッサを取埗しようずするず、そのような事態が発生したす。 その埌、ハむパヌバむザヌ䞊のオペレヌティング システムは、誠実な最適化により、プロセッサヌに䞎える時間がたすたす少なくなりたす。 このプロセスは雪厩のように発生し、空に飛び䞊がりたすが、他の仮想マシンはほずんど気付かない可胜性がありたす。 そしお、コアが倚いほど、ディストリビュヌションに該圓するマシンは悪化したす。 ぀たり、倚くのコアを備えた高負荷の仮想マシンが最も圱響を受けたす。

LAは䜎いが、スティヌルはある。 LA が玄 0,7 (぀たり、ハむパヌバむザヌの負荷が䜎いず思われる) であるが、個々の仮想マシン内でスチヌルが芳察された堎合:

  • 準仮想化に関するオプションはすでに䞊で説明されおいたす。 ハむパヌバむザヌは正垞に動䜜しおいたすが、仮想マシンはスチヌルを瀺すメトリクスを受信できたす。 実隓の結果によるず、このスチヌル オプションは 10% を超えず、仮想マシン内のアプリケヌションのパフォヌマンスに重倧な圱響を䞎えるこずはありたせん。
  • LA パラメヌタは正しくないず考えられたす。 より正確には、それぞれの特定の瞬間では正しいず考えられたすが、0,15 分間の平均では過小評䟡されおいるこずがわかりたす。 たずえば、ハむパヌバむザヌの 0,6 分の 25 に XNUMX 台の仮想マシンがそのすべおのプロセッサをちょうど XNUMX 分消費する堎合、ハむパヌバむザヌの XNUMX 分あたりの LA は XNUMX になりたす。 このような仮想マシン XNUMX 台が同時に動䜜するず、XNUMX になりたす。 そしお、それぞれの詊合でXNUMX分間、ロサンれルスのXNUMXでワむルドスティヌルがあったずいう事実は、もはや匕き出すこずはできたせん。
  • 繰り返したすが、誰かが食べすぎおいるず刀断し、その人を埅たせたスケゞュヌラのせいです。 その間、コンテキストを切り替え、割り蟌みを凊理し、その他の重芁なシステム関連の凊理を行いたす。 その結果、䞀郚の仮想マシンでは問題が発生したせんが、他の仮想マシンでは重倧なパフォヌマンスの䜎䞋が発生したす。

4. その他の歪み

仮想マシンのプロセッサヌ時間の正盎なリタヌンを歪める理由は他にも XNUMX 䞇ありたす。 たずえば、ハむパヌスレッディングず NUMA は蚈算を耇雑にしたす。 スケゞュヌラは係数 (重み) を䜿甚するため、プロセスを実行するためのカヌネルの遞択が完党に混乱したす。これにより、コンテキストを切り替えるずきに蚈算がさらに困難になりたす。

タヌボ ブヌストやその逆の省電力モヌドなどのテクノロゞによる歪みがあり、䜿甚率を蚈算するずきに、サヌバヌ䞊の呚波数や時間量さえ人為的に増枛する可胜性がありたす。 タヌボ ブヌストを有効にするず、あるプロセッサ スレッドのパフォヌマンスが向䞊するため、別のプロセッサ スレッドのパフォヌマンスが䜎䞋したす。 珟時点では、珟圚のプロセッサ呚波数に関する情報は仮想マシンに送信されおいないため、誰かが時間を盗んでいるず考えられたす (たずえば、2 GHz を芁求したが、半分の呚波数を受信したなど)。

䞀般に、歪みにはさたざたな理由が考えられたす。 特定のシステムでは、別のものが芋぀かる可胜性がありたす。 䞊でリンクを瀺した曞籍から始めお、perf、sysdig、systemtap などのナヌティリティを䜿甚しおハむパヌバむザヌから統蚈を読み取るこずをお勧めしたす。 数十.

5 結論

  1. 準仮想化により䞀定量のスチヌルが発生する可胜性がありたすが、これは正垞であるず考えられたす。 むンタヌネット䞊では、この倀は 5  10% になる可胜性があるず曞かれおいたす。 それは、仮想マシン内のアプリケヌションず、仮想マシンが物理デバむスに䞎える負荷によっお異なりたす。 ここで、仮想マシン内でアプリケヌションがどのように感じられるかに泚意を払うこずが重芁です。
  2. ハむパヌバむザヌの負荷ず仮想マシン内のスチヌルの負荷の比率は垞に明確に盞互関連しおいるわけではなく、負荷が異なる特定の状況ではスチヌルの䞡方の掚定倀が誀る可胜性がありたす。
  3. スケゞュヌラは、倚くの芁求を芁求するプロセスに察しお悪い態床をずりたす。 圌は、より倚くを求める人には、より少なく䞎えようずしたす。 巚倧な仮想マシンは悪です。
  4. 準仮想化がなくおも、小芏暡なスチヌルが暙準ずなる可胜性がありたす (仮想マシン内の負荷、隣接マシンの負荷特性、スレッド間の負荷分散、その他の芁因を考慮したす)。
  5. 特定のシステムでのスチヌルを把握したい堎合は、さたざたなオプションを怜蚎し、メトリクスを収集しお泚意深く分析し、負荷を均等に分散する方法を考える必芁がありたす。 どのような堎合でも逞脱が発生する可胜性があるため、実隓的に確認するか、カヌネル デバッガで調べる必芁がありたす。

出所 habr.com

コメントを远加したす