Linux Azure 仮想マシンでメモリ不足エラーが発生する

この記事では、Linux オペレーティング システム (OS) を実行する Microsoft Azure Virtual Machine (VM) でメモリ不足 (OOM) が発生するシナリオについて説明します。 OOM 条件により、新しいメモリ割り当て要求が失敗するか、 OOM Killer プロセスが呼び出されます。 これを実行するように構成されている場合、 カーネルはパニックになり、メモリ ダンプ ファイルが作成されます。

元の製品バージョン: Linux を実行している仮想マシン
元の KB 番号: 4010058

現象

Linux OS では、OS の実行中にいつでもメモリ割り当ての問題が発生する可能性があります。 これらの問題には、さまざまなログ記録シナリオが含まれます。 次のセクションでは、一般的なエラー メッセージの例をいくつか示します。

現象 1: メモリ割り当てエラー

[12345.678901] ruby: ページ割り当てエラー: order:0, mode:0x1080020(GFP_ATOMIC), nodemask=(null)

症状 2: メモリ不足エラー

OS との対話中に、ログまたはコマンド ラインで OOM エラーが発生します。 たとえば、システム ログ ファイルには次のエラーが表示されます。

localhost kernel: Out of memory: Kill process 2154 (oom) score 844 or sacrifice child

次のテキストは、OOM メッセージの別の形式を示しています。 このメッセージは、OOM キラーが呼び出されたことを示します。

Jul  7 21:09:50 hostname kernel: [ 1347.090377] output.rb:140 invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0

シリアル コンソールまたはシステム ログでは、多くの場合、OOM イベントに対してカーネル スタック トレースが生成されます。 メッセージは次のテキストのようになります。

[1774674.375021] out_of_memory+0x1ab/0x4a0

症状 3: フォークに失敗する

OS が新しいプロセスを開始しようとしても、そのプロセスを作成できない場合は、"フォークに失敗しました" というメッセージが表示されます。 通常、このエラー メッセージは、プロセスをフォークできない理由を示します。 一般的な理由の 1 つと、この状況で適用可能な理由の 1 つは、初期プロセス状態に必要なメモリを割り当てに失敗することです。 次のテキストには、メッセージの 1 つの形式が含まれています。

Feb 29 08:35:52 hostname systemd: Failed to fork: Cannot allocate memory

原因

最上位レベルでは、このエラーの基本的な原因は、OS が行われた要求にメモリを割り当てることができないということです。 エラーの理由はさまざまであり、システム管理者はエラーが発生した時点で診断を行う必要があります。 メモリ割り当てエラーの原因としては、次のようなことが考えられますが、これらに限定されません。

  • 予期しない、または予期しないスパイクまたはアプリケーションの負荷の増加
  • メモリの断片化 (メモリの空きブロックは小さいですが、要求を満たすのに十分な大きさのブロックはありません)
  • メモリ パラメーターの構成ミス
  • アプリケーションのメモリ リーク
  • カーネルのバグ
  • 使用可能なスワップ領域の不足または完全なスワップ

診断

メモリ診断は、エラーが検出された時点で行う必要があります。 通常、診断は振り返って行うことはできません。 さまざまなツールとメソッドを使用して、メモリの使用と断片化を診断できます。 次のツールの一覧を包括的に表示することはできませんが、一覧は診断を行うための出発点です。

  • free

  • vmstat

  • top

  • htop

  • atop

  • cat /proc/meminfo

  • cat /proc/buddyinfo

  • echo m > /proc/sysrq-trigger

    注:

    このコマンドの出力は、システム ログにあります。 通常、このログは /var/log/messages または /var/log/syslog ファイルです

  • sa/sar

    注:

    ツールキットを sa 使用すると、システム全体の履歴集計データを分析できますが、プロセス レベルの詳細は分析できません。

ソリューション

最も適切なソリューションでは、メモリ使用量、パターン、構成を徹底的に分析する必要があります。 このようなソリューションには、次のアクション 項目の 1 つ以上が含まれます。

  • VM メモリのスケールアップ
  • 制限が cgroup 使用されている場合の定義の再構成
  • 巨大なページ割り当ての変更
  • スワップ領域の構成

Azure でスワップ領域を構成するには、Azure のベスト プラクティスに従う 2 つの一般的なアプローチから選択できます。 どちらの方法でも、リソース ディスクを含む VM モデルが必要です。

システムの種類 アプローチの説明
cloud-init を使用するシステム 推奨される方法は、cloud-init 構成またはブートごとのスクリプトを使用することです。
cloud-init を使用せず、Azure エージェントを使用するシステム 構成ディレクティブは /etc/waagent.conf ファイルに存在し、カスタマイズ可能なサイズでリソース ディスクにスワップ ファイルを作成します。

これらのメソッドの詳細については、次の記事を参照してください。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。