Linuxのボックスがメモリ不足になり、ランダムなプロセスを破棄して処理するようになることがあります。
管理者がこれを回避するために何をすべきか知りたいのですが。メモリ量を増やすための唯一の現実的な解決策はありますか(スワップだけを増やすと効果がありますか?)、またはこれを回避するためにソフトウェアでボックスをセットアップするより良い方法はありますか? (つまり、クォータ、またはそのようなものですか?)。
デフォルトでは、Linuxのメモリ管理の概念はやや頭を痛めています。これにより、システムよりも多くのメモリを割り当てることができ、問題が発生したときに、プロセスをランダムに実行します。 (何が殺されるかの実際のセマンティクスはそれよりも複雑です-それが良いことか悪いことかについての多くの詳細と議論のためのグーグル「Linux OOM Killer」)。
健全性のいくつかの類似性をメモリ管理に復元するには:
vm.oom-kill = 0
/etc/sysctl.conf内)vm.overcommit_memory = 2
/etc/sysctl.conf内)これらの設定により、Linuxは従来の方法で動作します(利用可能なよりも多くのメモリをプロセスが要求すると、malloc()は失敗し、メモリを要求するプロセスはその失敗に対処することが期待されます)。
マシンを再起動してリロードします/etc/sysctl.conf
、またはproc
ファイルシステムを使用して、再起動せずにすぐに有効にします。
echo 2 > /proc/sys/vm/overcommit_memory
オーバーコミットを無効にすることができます。参照 http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514
物理メモリの量を増やすことは、すべての状況で効果的な対応とは限りません。
これを確認する1つの方法は、「atop」コマンドです。特にこれらの2つの行。
これは正常だったときのサーバーです。
MEM | tot 23.7G | free 10.0G | cache 3.9G | buff 185.4M | slab 207.8M |
SWP | tot 5.7G | free 5.7G | | vmcom 28.1G | vmlim 27.0G |
それが不十分に実行されていたとき(そしてovercommit_memoryを50から90に調整する前は、vmcomが50Gをはるかに超えて動作していて、oom-killerが数秒ごとにプロセスを爆破し、NFSdの子プロセスが爆破されたために負荷が根本的に跳ね続けました。アップし、継続的に再作成。
マルチユーザーのLinuxターミナルサーバーが仮想メモリの割り当てを大幅にオーバーコミットしたが、要求されたページのほんのわずかしか実際に消費されないケースを最近複製しました。
この正確なルートに従うことはお勧めしませんが、overcommit-memoryをデフォルトの50から90に調整して、問題の一部を軽減しました。最終的には、すべてのユーザーを別のターミナルサーバーに移動し、再起動して完全な利点を確認する必要がありました。
サーバーの場合、簡単な答えは、RAMを購入してインストールすることです。
日常的に十分に経験したサーバー[〜#〜] oom [〜#〜](Out-Of-Memory)エラー、さらにVM(virtual memory) Linuxカーネルでのマネージャのオーバーコミットsysctlオプション。これは良いことではありません。
スワップの量(カーネルのメモリマネージャーによってディスクにページアウトされた仮想メモリ)を増やすと、現在の値が低く、使用量が1つまたは少数ではなく、そのような大量のメモリごとに多くのタスクを伴う場合に役立ちます。利用可能な仮想メモリの合計(RAM +スワップ)の膨大な量をそれぞれ要求するプロセス。
スワップを2回以上(2x)割り当てる多くのアプリケーションでは、RAMの量が多いため、スワップの改善による利益が減少します。大規模な計算シミュレーションでは、速度の低下が許容できる場合、これは許容できる場合があります。 。
RAM(ECCであるかどうかにかかわらず))で、適度な量(たとえば、4〜16 GB)で非常に手頃な価格で、認めざるを得ません。この問題を長い間経験していません。
メモリ使用量パターンの2つの最も一般的なクイック評価として、メモリ使用量でソートされたfree
とtop
の使用を含む、メモリ消費量の確認の基本。したがって、少なくともこれらのコマンドの出力の各フィールドの意味を理解していることを確認してください。
アプリケーション(データベース、ネットワークサービスサーバー、リアルタイムビデオ処理など)とサーバーの使用法(パワーユーザーが少ない、100〜1000のユーザー/クライアント接続)の詳細がないため、対処に関する一般的な推奨事項は考えられません。 OOMの問題。
Ulimitを使用して、プロセスが強制終了される前にプロセスが要求できるメモリの量を減らすことができます。問題がサーバーをクラッシュさせる1つまたはいくつかの暴走プロセスである場合に非常に役立ちます。
問題が、必要なサービスを実行するのに十分なメモリがないことである場合、解決策は3つしかありません。
キャッシュなどを制限することで、サービスが使用するメモリを削減する
より大きなスワップ領域を作成します。パフォーマンスは低下しますが、時間がかかる場合があります。
追加のメモリを購入
このバグ に関連する同様の問題があり、解決策は古い/新しい(修正済み)カーネルを使用することでした。
ただし、当時はマシンを再起動できなかったため、次のコマンドを使用してrootとしてログインし、システムキャッシュをクリアすることで、醜い回避策を講じていました。
echo 3 > /proc/sys/vm/drop_caches