Linuxを再起動した後、メモリが不足しています。

Linuxを再起動した後、メモリが不足しています。

Intel(R)Atom(TM)CPU D525と1 GBのRAMを搭載したサーバーがあります。サーバーは約7日ごとに自動的にシャットダウンして再起動することがわかりました。

メモリ使用量を確認すると、メモリ使用量が90%に達するとカーネルが再起動することがわかりました。カーネルログ/var/log/messagesファイルを確認すると、カーネルの終了に関する情報はなく、カーネルの起動に関するメッセージのみを見つけることができます。ファイルを確認してみると、/proc/sys/vm/min_free_kbytes値は「3765」です。


使用可能なメモリが非常に低い場合を推測しますが、システムがメモリの回復を開始する量ではありません。これにより、カーネルは何も実行できないため、再起動されます。

私に洞察力を与えることができますか?

答え1

一部の要求ページング仮想メモリシステムでは、オペレーティングシステムは、匿名ページ(つまり、ランタイムデータ、プログラムスタックなどのファイルシステムソースを持たないデータを含むページ)を交換するのに十分なスワップスペースがない場合、割り当てを拒否します。物理メモリを解放するためのページです。この厳密な計算の利点は、各プロセスが割り当てられた数の仮想メモリへのアクセスを保証することです。ただし、これは、使用可能な仮想メモリの量が本質的にスワップスペースのサイズによって制限されることを意味します。

実際には、プログラムは使用するよりも多くのメモリを割り当てることがよくあります。たとえば、Java Virtual Machine(JVM)は起動時に大量の仮想メモリを割り当てますが、すぐには使用しません。 Linuxカーネルのメモリ統計は、プロセスが実際に使用しているメモリ量を追跡してそれを補償しようとします。過度にコミットする仮想メモリの量。つまり、カーネルが割り当てる仮想メモリの量は、システムの物理メモリとスワップ領域を合わせたものよりも大きくなる可能性があります。これにより、物理メモリとスワップ空間をより活用することができますが、使用されているメモリ量が使用可能な物理メモリとスワップ空間の量を超える場合、カーネルはメモリ割り当ての予約を満たすために何らかの方法でメモリリソースを確保する必要があるという欠点があります。

再利用を埋めるためにメモリを回収するカーネルメカニズムを呼び出します。メモリ不足キラー(OOMキラー)。通常、このメカニズムはメモリを大量に消費する「不良」プロセスを終了し、他のプロセスのためにメモリを解放します。ただし、sysctl 設定が 0 でない場合、vm.panic_on_oomシステムメモリが不足するとカーネルにパニックが発生します。

この設定に可能な値は次vm.panic_on_oomのとおりです。

  • 0(既定値) OOM-killer は、メモリ不足の状況が発生すると悪意のあるプロセスを終了します。

  • 1カーネルは通常パニック状態になりますが、プロセスが使用またはmbind(MPOL_BIND)設定されたメモリ割り当て制限に達するとcpusetプロセスは終了します。

  • 2カーネルはメモリ不足時に常にパニック状態になります。

OOM-killer が使用する経験的な方法は、vm.oom_kill_allocating_tasksysctl 設定で変更できます。可能な値は次のとおりです。

  • 0(既定値) OOM-killer はタスクのリストをチェックし、メモリ集約型の悪意のあるタスクを選択して終了します。

  • 1(0 以外) OOM-killer はメモリ不足状態を引き起こすジョブを終了します。

カーネルメモリ統計アルゴリズムはsysctl設定を使用して調整できますvm.overcommit_memory。可能な値は次のとおりです。

  • 0(デフォルト)弱い検査による経験的乱用。

  • 1常に過度の約束をして確認に失敗します。

  • 2vm.overcommit_ratio厳密に言えば、このモードの仮想アドレス空間の制限は、次の式に従って設定された値によって決まります。

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))
    

厳密なメモリ統計を使用するときにページを保存するのに十分な空き物理メモリまたはスワップ領域がない場合、カーネルは匿名ページを割り当てなくなりました。これは、システムが次のことを行う必要があることを意味します。十分なスワップ領域が設定されました。

このコマンドを使用して、実行時にsysctlsysctl設定を確認または変更できます。変更を永久に適用するには、上記の設定をに記録することも/etc/sysctl.confできます。/proc/sys/vm相互作用。そのファイルは次のとおりです。

  • /proc/sys/vm/panic_on_oom

  • /proc/sys/vm/oom_kill_allocating_task

  • /proc/sys/vm/overcommit_memory

  • /proc/sys/vm/overcommit_ratio

答え2

  • どのプロセスがメモリを大量に消費するかを調べる必要があると思います。たぶん、プログラムにメモリリークのバグがあるかもしれません。あなたはそれを修正する必要があります。
  • 十分なメモリがない場合、Linux は多くのメモリを消費する一部のプロセスを終了するか、それ自体を再起動します。カーネルが一部のメモリを使用する必要があるためです。
  • さまざまな動作は構成によって決まります。しかし、メモリリークエラーを修正する必要があると思います。

答え3

一部(カーネル?)監視装置がシステムのハングを検出して再起動が発生したようです。このようなカーネル.configオプションは、CONFIG_BOOTPARAM_SOFTLOCKUP_PANICシステム停止が検出されると、特定のタイムアウト後に再起動を引き起こす可能性があります。

実際の質問は、システムがなぜ停止するのかです。私はこれが次の質問だと思います。OOM キラーが正常に動作しないため、OS が停止します。

関連情報