Linuxでのメモリオーバーコミットの目的は何ですか?

Linuxでのメモリオーバーコミットの目的は何ですか?

私は知っていますメモリ過剰割り当て私はそれを非常に嫌い、一般的に無効にします。はいいいえ考える設定値システムプロセス(例:実行中のプロセス)に基づくsudoまたはサフィックスただし、一般的なLinuxプロセスは、管理者権限なしで一部のユーザーによって一部のコマンドラインから起動されます。

よく書かれたプログラムは、使用可能なmallocメモリよりも多くのメモリを使用し、使用中にクラッシュする可能性がありますmmapmallocメモリオーバーコミットがないと、mallocORはmmap失敗し、よく書かれたプログラムはその失敗をキャッチします。malloc誤って作成されたプログラム(失敗確認なしで使用)は、失敗の結果を使用するとクラッシュしますmalloc

確かに仮想アドレス空間mmap(拡張malloc)はRAMとは異なります(RAMはカーネルによって管理されているリソースです)。これ;プロセスの仮想アドレス空間が次に初期化されます。実行(2)mmap& によって拡張されるのでsbrk消費しません。まっすぐメモリのみ仮想メモリ)。

RAM使用の最適化は、次の方法で達成できます。クレイジーウェス(2)MADV_DONTNEED(これは実際に必要なときにカーネルを使っていくつかのページをディスクに交換するようにヒントを与えるかもしれません。)過度にコミットしたいプログラムは、マッピング(2)そしてMAP_NORESERVE。メモリオーバーコミットの私の理解は、すべてのメモリマップ(execveまたはを通じてmmap)が暗黙的にMAP_NORESERVE

私の意見は、バグが多くのプログラムに役立つということです。しかし、IMHOは実際の開発者がすべきことです。いつも関連する仮想アドレス空間変更機能の確認と失敗malloc(mmap例:ここ)。私が調査したほとんどのフリーソフトウェアプログラムには、ソースコードにこれらのチェックが含まれています。xmalloc機能....

実際には、合理的で便利な方法でメモリの再利用を要求して使用する実際のプログラム(一般的なLinuxディストリビューションにパッケージされています)はありますか?私はそれらを知らない!

メモリの再利用を無効にすると、どのような欠点がありますか?多くの古いUnix(たとえば、前世紀のSunOS4、SunOS5)にはこの機能がなく、IMHO malloc(そしておそらく一般的なシステム全体のパフォーマンスmalloc)もそれほど悪くありません(それ以降の改善はメモリの過剰割り当てには関係ありません)。

私はメモリ過剰割り当てが怠惰なプログラマの間違いだと思います。

プログラムユーザーは、いくつかのリソース制限を設定できます。制限設定(2)RLIMIT_AS親プロセスによって呼び出されます(たとえば、ulimit組み込み/bin/bash;またはlimit組み込み扱いにくいat、または、、、、crontab...などの最新の同等物または親プロセス(最終pid 1またはその最新プロセスbatchまで)/sbin/initシステム変形)。

ベストアンサー1

過剰コミットの理由は、物理RAMの使用率が低下するのを防ぐためです。プロセスによって割り当てられた仮想メモリの量と実際の物理ページフレームにマッピングされた仮想メモリの量には違いがあります。実際、プロセスが開始された後、RAMはほとんど予約されません。これは要求ページングによるものです。プロセスには仮想メモリレイアウトがありますが、仮想メモリアドレスから物理ページフレームへのマッピングは、メモリを読み書きするまで設定されません。

プログラムは通常、仮想メモリ空​​間全体を使用せず、影響を受けるメモリ領域はプログラム実行時に変更されます。たとえば、実行開始時にのみ実行される初期化コードを含むページフレームのマッピングを削除し、そのページフレームを他のマッピングに使用できます。

データにも同様に適用されます。プログラムが呼び出されると、mallocデータを格納するのに十分な大きさの連続した仮想アドレス空間が予約されます。ただし、物理ページフレームへのマッピングは、そのページが実際に使用されるまで設定されず、もしかして。または、プログラムスタックについて考えてみてください。各プロセスは、スタック専用の仮想メモリのかなり大きな連続領域(通常8 MB)を取得します。プロセスは通常、このスタックスペースの小さな部分のみを使用します。コンパクトでうまく動作するプログラムははるかに少なく使用されます。

Linuxコンピュータには、通常、ライフサイクルのさまざまな段階で実行されるさまざまな異機種プロセスがあります。統計的に言えば、どの時点でも、割り当てられた(または後でプログラムの実行時に割り当てられた)すべての仮想ページに対して一括マッピングは必要ありません。

厳密な非オーバーコミットシナリオでは、仮想ページを割り当てると、仮想アドレスページから物理RAMページフレームへの静的マッピングが生成されます。大量のRAMページフレームは何の目的もなく予約されているため、同時にはるかに少ないプログラムを実行できるシステムになります。

私はメモリを過度に使用することが危険であり、処理が困難なメモリ不足の状況につながる可能性があるという事実を否定しません。正しい妥協点を見つけることがすべてです。

おすすめ記事