私はコンピューティングクラスタを開発しており、単一のプロセスに提供できる最大RAM容量を決定したいと思います。 16GB RAMを搭載したシステムでは、メモリ不足キラーを呼び出す前に15680MB(overcommit_memory = 2、overcommit_ratio = 0)を割り当て(およびタッチ)できることが答えです。
一般的なLinuxディストリビューションではこれはある程度妥当に見えますが、私自身の最小カーネル(v 3.16)をコンパイルし、私のテストアプリケーションはsbin / init(メモリに何もないIE)で実行されます。
比較のためにRAMが512MBしかないシステムをシミュレートすると、44MBのオーバーヘッドで468MBを割り当てることができます。これは非常に合理的です。
それでは、16GBシステムにカーネルメモリがたくさんあるのはなぜですか?
カーネル文書を読むと、一定の割合のメモリが「安全性」のためにカーネル用に予約されているようです。これは/proc/sys/vm/で調整できます。しかし、admin_reserve_kbytesとuser_reserve_kbytesを変更しても、OOM Killerが呼び出される時点には何の影響もありません。
インストールされているRAMの量に比例して増加する他のものはありますか?
答え1
かなり古い(2006)論文では、いくつかのカーネルオーバーヘッドをメモリサイズの関数として説明しています。http://halobates.de/memorywaste.pdf
から:
ページ構造(ページ割り当て追跡):1.37%
ページテーブル:0.5%
一方、私の16GBテストマシンは合計4.3%のオーバーヘッドを示しました。
したがって、約2%はまだ説明されていません。したがって、質問はまだ完全に答えられておらず、答えは非常に古いカーネルに基づいています。しかし、これがこれまでこの質問に最も近い答えでした。
答え2
あなたの質問に対する短い答えは次のとおりです。できるだけ、一度プロセスに使用できるものを提供するだけです。別の方法は空きメモリを予約することですが、これは無駄です。 16GBシステムは今日12GBを使用できないため、明日は20GBを使用できます。現在使用されていないメモリは、永久に失われるI / Oや他のタスクを保存する可能性があります。後でメモリを保存することはできません。
「しかし、後で使用できるように今メモリを空にしなければならない」と考えているなら、この言葉にならない考えを心から消してみてください。今お使いいただけますそして後で使用してください。ここでは妥協はありません。実際、今使っているなら、後で何もしなくても使えます。今すぐ使用しない場合は、後で使用するためにいくつかの作業を行う必要があります。したがって、今すぐ使用すると、後で使用する可能性が高くなります。
メモリはプロセスでしか使用できないか、カーネルオーバーヘッドという誤解を持っているようです。これは本当ではありません。一般的なシステムでは、実際のメモリの大部分は利用可能ではなく、プロセスで使用されたり、カーネルオーバーヘッドによって消費されたりしません。
たとえば、システムに十分なメモリがあるとし、実行してからtop
終了します。システムには2つのオプションがあります。top
プログラムをRAMに保持したり、プログラムを含むページを削除したりできます。次の2つのオプションを見てみましょう。
RAMを確保するには努力が必要です。さらに悪いことは、RAMを使用するにはこの努力を放棄する必要があるということです。そして再度実行すると、top
プログラムをディスクからロードする必要がありますが、これは非常に遅いです。
ページをRAMに保存してtop
再度実行すると、ディスクからロードするのに問題はありません。これは大きな勝利です。メモリを別の目的に使用する必要がある場合は、メモリを使用し、空きプールからメモリを削除する手間をかけることなく、その目的に直接変換できます。
したがって、RAM ページは実行可能ファイルの保存に使用され続けます。この使用法はtop
実行中ではないため、どのプロセスにも関連付けられません。しかし、潜在的に有用なデータが含まれているので、無料ではありません。そしてこれはオーバーヘッドではありません。メモリが他のタスクを実行するのに役立つ場合は、必要に応じて実行可能ファイルをディスクからページングできるため、内容を削除できます。
実際、一般的な負荷がかかる一般的なシステムでは、ほとんどのメモリに将来的に役立つ可能性がある情報が含まれていますが、メモリが他の目的に必要な場合は破棄される可能性があります。
あなたがそれを見ているなら/proc/meminfo
、おそらくあなたが見なければならない数字は次のとおりですMemAvailable
。これは、空きメモリーが必要な場合に、単に廃棄できる情報を含むメモリーと空きメモリーを組み合わせます。
答え3
答えは、カーネルの起動時にサーバーが使用できるメモリの量によって異なります。メモリ拡張を使用する場合、これは拡張可能な最大値に基づいています。
Linuxカーネル4.15の場合:
- 4GB RAMは4.8%で予約されています。
- 8GB RAM: 3.2%
- 16GB RAM: 2.3%
- 32GB RAM: 1.9%
- 64GB RAM: 1.7%
それでは、16GBシステムにカーネルメモリがたくさんあるのはなぜですか?
相対的に言えばいいえ。数字が正しいと仮定すると、512 MBには8.6%、16 GBには2.3%が予約されていることがわかります。
カーネルでなぜこれらのスケールが選択されたのかわかりませんが、dmesgで分析内容を見ることができます。
[ 0.000000] Memory: 65920612K/67108324K available (12300K kernel code, 2473K rwdata, 4272K rodata, 2408K init, 2416K bss, 1187712K reserved, 0K cma-reserved)