質問: オーバーコミット時に仮想マシンにメモリとしてswap-space(swapfile)を使用させることはできますか? vmとkvmで実験を行っています。オーバーコミットメントとスワップスペースの事実を認識しようとしています。最初に、このために作成したシステムセットアップとアソシエート構成を示します。実験。私のホストコンピュータシステムには次のものがあります。 メモリ(dram):16gb スワップスペース(スワップパーティション):32gb ssd:512gb そして私のvmは: メモリ:4gb スワップスペース(スワップパーティション):8gb 仮想ディスク容量:20gb vmのメモリリソースをcgroupインターフェイスで4gbから1gbに制限すると、この状況で overcommitment が発生します。次に、これを wap- space そして vmstat それが機能したかどうかをチェックしました。スワップスペースを使用していないようです。記憶。オーバーコミット状態のときに、なぜ私のvmはスワップスペースを使用しなかったのですか?
回答: あなたが見逃しているのは、「オーバーコミットメント」の意味だと思います。オーバーコミットメントは、システムに制限したリソースよりも多くのリソースを実際に持つために使用するトリックではありません。これは、より多くのリソースがあるように振る舞うテクニックです。基本的な概念は、ほとんどのプログラムが実際に使用するよりも多くのメモリを割り当てるということです。たとえば、32kのramを割り当てて、わずか57バイトのファイルを読み込むことができます。それを読み込んで、実際には1ページのメモリを使用します。ただし、32kが割り当てられていました。この例は90年代のものであり、今日では割り当てが大きくなり、ファイルも大きくなっていますが、重要なのは、余分なメモリはまだ収集されないコミットメントであるということです。私が間違っていなければ、これは故意にそれを行わない一部のプログラムでも発生します。なぜなら、それらはそれを行うライブラリをロードし、それらのライブラリをロードすることさえそれを行うからです-リンカはライブラリに十分なメモリを割り当てますが、ルーチンだけです実際に呼び出されたものは実際にロードされます。それはおそらく共有メモリになるので、影響は最小限に抑えられますが、それはまだそこにあります。発生する過度のコミットメントの量は、呼び出されるプログラムとその使用方法に大きく依存します。プログラムが非常に徹底的に実行される場合、それはおそらくそのライブラリのいくつかをより多く使用するでしょう。 mallocの代わりにcallocを呼び出すプログラムは、割り当てられたスペースのすべてのバイトにcallocが書き込み、osが要求されたコミットメントを実行する必要があるため、そのメモリの実際の部分が使用される場合でも、過度にコミットしているようには見えません。はるかに少なくなります。一部のプログラムは、必要な正確な量のメモリのみを割り当てるように注意を払っていますが、他のプログラムは、データ構造の配置を実用的にするためにオーバーコミットメントをサポートするためにosに依存しています。1gbの使用に制限したサーバー上のアプリケーションが、実際に1 gb相当のページにアクセスしようとした場合、サーバーは、使用できるように構成した8gbのスワップを使用します。しかし、それはオーバーコミットメントには使用されません。実際にある9gbのvm)を超えて割り当てるまで、技術的にはオーバーコミットメントを使用しません。そうは言っても、これはlinuxであり、オーバーコミットを有効にせずにlinuxを最大のメモリ割り当てにプッシュしようとしたときの私の記憶は、linuxが少し早く失敗する傾向があるということです-それは、少量のファイルキャッシュなどのさまざまなもののためにいくらかの予備を保持していました。その経験は10年以上前のものでしたが、それが変わる理由は特にわかりません。ファイルi/oを実行できるメモリがあることが重要です。