私はSOCプラットフォームに基づいて組み込みLinuxシステムを開発しています。
同じメモリワークロードを実行する2台のコンピュータがあり、次のメモリ出力を取得します。
マシン1.
total used free shared buff/cache available
Mem: 50616 35304 2516 48 12796 13100
Swap: 0 0 0
マシン 2.
total used free shared buff/cache available
Mem: 57328 45320 2856 56 9152 9572
Swap: 0 0 0
マシン1はマシン2よりもメモリが少なくなりますが、マシンfree
1はマシン2よりもメモリが多いですavailable
。この場合、OOM Killerを実行するリスクが高いシステムは何ですか?
メモリ調整の提案はありますか?
overcommit_memory設定で更新されました(少しずれたトピック)
Fritzの答えに基づいて、他のシステムでは他の変更なしに2overcommit_memory
に変更することに焦点を当てました。
# cat /proc/sys/vm/overcommit_ratio
50
#
# free
total used free shared buff/cache available
Mem: 84244 25256 35196 92 23792 56772
Swap: 0 0 0
# echo 2 > /proc/sys/vm/overcommit_memory
#
# ls
-/bin/sh: can't fork: Cannot allocate memory
比率は50ですが、cannot allocate memory
メモリオーバーコミットが無効になっている場合を示します。
echo 100 > /proc/sys/vm/overcommit_ratio
それでもecho 2 > /proc/sys/vm/overcommit_memory
エラーが発生し、システムを再起動する必要がありました。
したがって、私のテストでは、メモリオーバーコミットを変更してもpre-defined
分割エラーが発生しない可能性があります。
カーネルメモリの回復available
とfree
。
Linuxメモリの過剰割り当てについて議論するために、別の質問を開くことができます。
答え1
free
メモリは完全に使用されず、available
必要に応じてカーネルによってすぐに解放される可能性があります。これには、ディスクからの読み込みを防ぎ、システムを高速化するためのファイルシステムキャッシュなどの機能が含まれています。詳しく見ると、金額がavailable
似ていることがわかりますbuff/cache
。
したがって、カーネルしなければならないavailable
メモリがすべて消費されない場合、OOM Killerは呼び出されません。
Andrewがコメントで指摘したように、安全なオプションは次のとおりです。カーネルでメモリ過剰割り当てを無効にする。これにより、プログラムが現在使用可能なメモリよりも多くのメモリを要求したときに呼び出しが成功するのではなくmalloc
返されます。NULL
つまり、実際に使用可能なメモリよりも多くのメモリが割り当てられないため、OOM キラーが呼び出されないことを願っています。
# Assuming swap is disabled because it is an embedded system:
echo 100 > /proc/sys/vm/overcommit_ratio # Commit max 100% of physical RAM (+ Swap, which is off)
echo 2 > /proc/sys/vm/overcommit_memory # Disable overcommit heuristics
ただし、これを行うには、(a)プログラムが使用したいよりも多くのメモリを要求せずに(b)malloc
すべての呼び出しの戻り値を確認し、特定の操作を実行する必要があります。賢い彼らが戻るときNULL
。それ以外の場合は、OOMキラーと同じ動作に直面します(プロセスはランダムに終了します)。この場合、segfaults / nullの逆参照が原因で発生します。
現在直面している特定のシナリオに関する情報がないと、調整に関する追加の提案を提供することは困難です。しかし、オーバーコミットによって物理メモリが枯渇すると、カーネルは以下を除いて何もできません。交換、プロセスを殺すまたは慌てる。有効にすることができますzram
または zswap
(したがってRAMに「交換」)または追加しますswapfile
が、メモリが(ほぼ)いっぱいになると、どちらもシステムのパフォーマンスが低下する可能性があります。アプリケーションでメモリが漏れていないことを確認するのが最善です。