空きメモリーや空きメモリーがLinuxでOOMキラーを引き起こしていますか?

空きメモリーや空きメモリーがLinuxでOOMキラーを引き起こしていますか?

私は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よりもメモリが少なくなりますが、マシンfree1はマシン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分割エラーが発生しない可能性があります。

カーネルメモリの回復availablefree

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が、メモリが(ほぼ)いっぱいになると、どちらもシステムのパフォーマンスが低下する可能性があります。アプリケーションでメモリが漏れていないことを確認するのが最善です。

関連情報