クラウド内のアカウンティングRAMについて

リソースの考慮方法の詳細な分析を継続します。



メモリがどのように考慮されるかを説明する前に、まずこのメモリが仮想マシンにどのように割り当てられるか、および一般に「仮想マシンメモリ」と呼ばれるものを見ていきます。





仮想マシンの実メモリ

Selectelクラウドの基盤であるXCPの基盤であるXenハイパーバイザーは、仮想マシンの動作のいくつかの側面を制御します。 アカウンティングの観点から、プロセッサとメモリに関心があります。 ここで説明したプロセッサは、RAMの番です。



Xenの観点からは、ドメイン(仮想マシン)にメモリを割り当てることは、ドメインが指定されたメモリページに書き込む権利を持っていることを意味します。 ドメインによって禁止されているメモリページに書き込もうとすると、例外が発生し、ドメインの動作が停止する可能性が高くなるため、ゲストシステムのカーネルは、許可されたメモリを超えないことを注意深く監視します(プログラムが存在しないメモリページにアクセスしようとした場合もまったく同じです) 、カーネルプログラムがクラッシュするか、エラーハンドラが発生します)。 いずれの場合でも、仮想マシンは使用が許可されたメモリのみを使用できます。 したがって、Xenは常に特定の仮想マシンに割り当てられているメモリのページ数を正確に把握しています。 (はい、メモリアカウンティングの最小階調は「ページ」と呼ばれる4 kbのメモリです)。 これは最も困難な分野の1つであるため、アドレス変換に関連するセクションは省略します。 要するに、仮想メモリをi386に変換するための通常のスキームにさらに2つの記述子テーブルを追加すると、このようなものが得られます。



ドメインが作成されると(つまり、仮想マシンが起動すると)、domain_builderというプログラムが、ドメインに割り当てる必要があるページ数をXenに通知します。 同じ情報がゲストシステムのカーネルに報告されるため、ゲストシステムに割り当てられているメモリ量がわかります。



仮想マシン内でmodd(メモリーオンデマンドデーモン)が起動し、xenstore(ドメイン間の相互作用のxen固有の方法)を介して、管理サービスにドメインのメモリーの状態を通知します。 実際には、これは単なる/ proc / meminfoの内容の記録であり、それ以上ではありません。 サーバーは仮想マシンの設定を確認し、追加または削除する必要があるメモリの量を決定します。 そして、メモリを変更するコマンドを提供します。



そして、ここから楽しみが始まります。 Xenには、 メモリのページを転送するという概念があります 。 これは、文字通り、「あるドメインからメモリページを取得し、別のドメインに転送する」ことを意味します。 したがって、メモリを送受信するコマンドが与えられると、Xenはゲストシステムからメモリを削除するか、そのメモリを割り当てます。 Xenの一般的な(有用な)妄想のために、ドメインから送信されたすべてのページは事前にリセットされます(誤って外部の仮想化ネイバーに貴重なデータを渡さないようにするため)。





メモリには削減の限界があることは明らかです。カーネルと基本プログラム(init、gettyなど)は、ある程度のメモリを必要としています。 その下に行くことはできませんが、近づくのは危険です(少し絞ると、OOMまたはその他の不快な問題が発生する可能性があります)。 これは、かなり高いメモリ下限を説明するものです。



上限があると、すべてがより複雑になります。 ドメインを作成する(仮想マシンを起動する)とき、メモリの上限が設定され、起動マシンは「将来の」ページのために一定量のサービスデータを予約します。 これはそれほど大きな量ではありませんが、依然として存在し、メモリの上限が高いとメモリの消費量が増えます。 したがって、公式の推奨事項では、最小/最大比を8〜10より大きくすることはできません。 理論的には、メモリのホットプラグ操作が完全に安定すると、この制限はなくなりますが、現時点では技術が実験的すぎてお金を使うことができません。



したがって、メモリは設定された制限内で自動的に変更されます。 プログラマーがお客様がMOD設定を変更する機会を終えた後、MODについて再度説明します。



しかし、一般的な好奇心の枠組みの中で、MODがオフになった場合に何が起こるかについてお答えします。 記憶は単純に規制されるのをやめます(それは元のボリュームに固定され、これですべてが落ち着きます)。 メモリアカウンティングはMODとは関係ありません。



メモリアカウンティング

従来のVDS「月あたりのXXXメガバイト」(右の写真の直線)は適切ではないことは明らかです。現在は256メガバイトで、10秒後にはすでに500、または数ギガバイトです。



代わりに、GB * h、つまり1時間あたりのギガバイトという値を考慮します。 実際、私たちの会計の内部単位はkb * ns(キロバイト-ナノ秒)ですが、キロバイト秒の価格は小さすぎるため、価格表にそれを書くことは、「価格1.3」のような数字を恐れる会計士は言うまでもなく、人々を混乱させることです* 10 -19ルーブル "、または、さらに良い"数量:10e + 23 "。したがって、インターフェイスではこの値を妥当な数値(GB * h)にします。 ただし、内部会計はプロセッサで行う方法と似ています。1ペニー以上が実行されるとすぐにメモリのお金が引き出されます。



GB * hは合成値です。 128 MB、8時間、または15分で4 GBの拡張、またはメモリボリュームの変更の組み合わせで、適宜折りたたむことができます。 写真は、メモリのさまざまな用途を示しています。 すべての写真は、天文時間の1時間あたりの間隔を示しています。



次に要約する方法について。 短い時間間隔で、メモリ値を取得し、間隔の期間を掛けると、この間隔の数kb * sを取得します。 これらの値は、マシンがどのホストにあるかに関係なく加算されます。 ちなみに、そこには統計も収集されます(グラフの場合)が、実際には十分なプログラマーがいません(真剣に-プログラマーのために空席があり、あなたを待っています)、これは後でクライアントインターフェイスに表示されます。 実際、これは長方形で近似されたメモリ割り当て曲線の最も単純な数値積分です。 不快な影響を避けるために、最初と最後の値を破棄します。そのため、マシンの寿命全体にわたって2秒間のメモリ使用量を与えると仮定できます。



ディスクキャッシュ、空きメモリ、スワップ



しばしば発生する別の問題は、どのような記憶を考慮するかという問題です。 data / proc / meminfoまたはpsの出力をよく見ると、たくさんの異なる値を見ることができます。 幸いなことに、アドレススペースのサイズを含むこれらの値はすべて、ゲストシステムカーネルの「個人的な発明」にすぎません。 割り当てられたメモリの量(totalmem)があり、仮想マシンに割り当てられたメモリの物理ページ数を示します。



ところで、私は言うのを忘れていました。 Xenにはオーバーセルはありません。 オーバーセルとは何ですか? これは、10台の仮想マシンが「ここに500 MBがあります」と言い、ノード(仮想化を行うサーバー)には2 GBしかありません。 面白いです しかし、これがホストがopenVZの下に住んでいる方法です。 プログラムがRAMの100%を詰まらせることはめったにないので、残りは再び「再販」されます(英語のオーバーセル)。 ほとんどの場合、これで十分ですが、10台のマシンすべてがそれぞれ400MBを使用した場合はどうなりますか? トラブル。 したがって、Xenにはオーバーセルモードがありません。さらに、Xenのメモリを操作するモデルでは、基本的に「約束されているが割り当てられていない」RAMの状況は許可されません。 「共通」メモリページには非常に特殊な状況があります(ドライバで使用され、キロバイト単位でカウントされます)が、アプリケーションメモリページ(ドライバではなく)が異なる仮想マシン間で共有される状況はありません。 仮想マシンに割り当てられたすべてのメモリは、彼女だけに属します。 このメモリが使用されていなくても。



実際には、空きメモリに戻ります。 Linuxカーネルはメモリに対する欲求で知られています-すべての空きメモリはディスクキャッシュによって占有されます。 これについては後ほど説明しますが、ディスク操作(特に読み取り)の回数を大幅に削減できるため、クラウドのディスクキャッシュは非常に便利です。 空きメモリは、過剰なメモリがある非常にアイドル状態のマシンでのみ使用できます。 「完全に空き」メモリがないように、このような動作モードを確保しようとしています。 ただし、仮想マシンがアイドル状態の場合、128 MBのうち60が占有されている状況はかなり可能です。 ドメインに割り当てられたすべてのメモリを考慮に入れます-はい、空きメモリとアイドルメモリは、ドメインによって排他的に割り当てられているため、考慮されます。



スワップファイル、スワップファイルについて少し説明します(より正確には、ほとんどの場合、これはスワップセクションです)。 スワップは、ゲストシステムにとって非常に便利です。これにより、カーネルは仮想メモリのサイズを増やすことができます 。 MODが有効な場合、スワップファイルの唯一の目的は仮想メモリを増やすことです(実際、これは「オーバーセル」であり、ゲストマシンのプロセスのカーネルに適しています)。 さらに、彼は記憶の突然のジャンプに対して保証します。 MODは非常に迅速に反応します(反応時間は1秒未満です)が、特定の条件(たとえば、誰かが大量のメモリを要求した場合)では間に合わない場合があります。 この場合、スワップファイルにより状況が解決され、リクエストが成功し、到着したMODが必要なメモリ量を提供します)。 さらに、プロセスの一部がスワップファイルに押し出される状況は、実行中のマシンでは正常です-これは、メモリ使用量の自然な最適化です。 例えば、CentOS(私の意見では、つまらないものを備えたかなり太く過負荷のシステム)はかなりの数のデーモンを起動しますが、その一部はほとんど使用されません。 このようなデーモンはページファイルにプッシュされ、移動せずに数週間存在します。



あまりお金を節約できないため、ページングファイルを無効にすることはあまりお勧めしませんが、シックアプリケーションからのメモリ要求でいバングが発生したときにMemoryErrorメッセージが表示されるリスクは大幅に増加します。 さらに、多くのプロセスが多くの仮想メモリを自分用に予約していることが判明した場合、反対に、ページファイルのサイズを増やすことをお勧めします(たとえば、2番目のファイルを作成して接続することにより)-これにより、オペレーティングシステムがアドレススペースを管理するための自由度が高まります。



All Articles