すべてのプロダクト
Search
ドキュメントセンター

:Linux ECSインスタンスのシステム、メモリ、またはプロセスが異常で、「ページ割り当ての失敗」というエラーメッセージがシステムログに表示された場合はどうすればよいですか。

最終更新日:Feb 27, 2024

このトピックでは、次の問題の原因と解決策について説明します。Linux Elastic Compute Service (ECS) インスタンスのシステム、メモリ、またはプロセスが異常で、「ページ割り当て失敗」というエラーメッセージがシステムログに表示されます。

問題の説明

Linux ECSインスタンスのシステム、メモリ、またはプロセスが異常です。 システムログには、「ページ割り当て失敗」というエラーメッセージが表示されます。これは、メモリ不足のためにシステムが新しいメモリページにメモリスペースを割り当てることができないことを示しています。 その結果、メモリページの割り当てが失敗します。

メモリページ

メモリページは、オペレーティングシステムにおけるメモリ管理のためのデータの最小単位である。 仮想メモリシステムでは、物理メモリは固定サイズのブロックに分割され、各ブロックはメモリページと呼ばれます。 ほとんどの場合、メモリページのサイズは4 KBまたは8 KBです。 オペレーティングシステムは、メモリページを使用してメモリを割り当て、管理する。 プログラムがメモリを使用する必要があるとき、オペレーティングシステムは、メモリページをプログラムに割り当てる。 メモリページのサイズは、ハードウェアおよびオペレーティングシステムの設計に基づいて決定され、メモリ利用率、アドレス空間サイズ、およびオペレーティングシステムのメモリ管理メカニズムなどの様々な要因に基づいて変化する。

image.png

インスタンスのシステムログとスクリーンショットを表示する方法については、「システムログとスクリーンショットの表示」をご参照ください。

原因

この問題は、ECSインスタンスの不十分なシステムメモリまたは深刻なメモリ断片化が原因で発生する可能性があります。 その結果、必要なメモリページを割り当てることができなくなる。

解決策

メモリ使用量の問題を解決するには、まず解決策1: メモリ例外のトラブルシューティングとメモリの最適化を試すことをお勧めします。 メモリ例外のトラブルシューティングとメモリの最適化後に問題が解決しない場合は、解決策2: インスタンスタイプ (vCPUとメモリ) のアップグレードを使用して、メモリ不足またはメモリの深刻な断片化の問題を解決できます。

解決策1: メモリ例外のトラブルシューティングとメモリの最適化

  1. Linuxインスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 大量のメモリを消費する異常なプロセスのトラブルシューティング。

    1. freeコマンドとtopコマンドを実行して、メモリを大量に消費するプロセスが実行されていないことを確認します。

    2. 次のコマンドを実行して、すべてのプロセスによって占有されている物理メモリの合計量を照会し、結果をフリーコマンド出力の値と比較して、オフセットが存在するかどうかを確認します。

      ps aux | awk '{sum +=$6} END {print sum/1024}'

      オフセットが見つからない場合は、次のコマンドを実行して、常駐セットサイズ (RSS) でプロセスをソートし、メモリを大量に消費するプロセスを識別できます。

      ps -eo pid,rss,pmem,pcpu,vsz,args -- sort=rss

      上記の手順で異常なプロセスが見つからない場合は、次の手順に進みます。

    3. 次のコマンドを実行して、スラブメモリアロケーターの使用状況を確認します。

      cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum "MB"}'
      説明

      {print $1 sum "MB"} コマンドは、出力をMBで表示するように変換します。

    4. コマンドを実行して、上ツールを使用してスラブのメモリ使用量を分析し、メモリ使用量が多いかどうかを確認します。

      次の図は、サンプル出力を示しています。

      image

      コマンド出力に基づいて、スラブメモリの使用率が高いかどうかを判断します。

    5. slabtopコマンドを実行して、スラブのメモリ使用量を詳細に分析します。

      次の図は、サンプル出力を示しています。

      image

  3. メモリを最適化するには、次の操作を実行します。

    • メモリを解放する

      重要

      メモリを解放する前に、syncコマンドを実行して、変更されたinode、遅延ブロックI/O、読み書きマッピングファイルなど、システムキャッシュ内のすべての未書き込みデータがディスクに書き込まれるようにすることをお勧めします。

      ページキャッシュをクリアするには、次のコマンドを実行します。

      • クリアページキャッシュ: sudo echo 1 > /proc/sys/vm/drop_caches

      • ディレクトリとinodeキャッシュのクリア: sudo echo 2 > /proc/sys/vm/drop_caches

      • クリアページ、ディレクトリ、およびinodeキャッシュ: sudo echo 3 > /proc/sys/vm/drop_caches

      説明
      • 前述の操作は、完全に未使用のメモリオブジェクトを解放するだけであり、ダーティデータは、データがディスクに書き込まれるまでメモリ内で使用されたままであるため、システムに有害ではありません。

      • sudo echo 3 > /proc/sys/vm/drop_cachesコマンドを複数実行してキャッシュのクリアに失敗した場合は、sudo echo 0 > /proc/sys/vm/drop_cachesコマンドを実行してから、sudo echo 3 > /proc/sys/vm/drop_cachesコマンドを実行します。

    • デフラグメントメモリ

      メモリを解放してもシステムのメモリがまだ不足している場合は、次のコマンドを実行してメモリを最適化し、部分的なメモリ断片化の問題を解決できます。

      説明

      この操作は、大量のCPUリソースを消費します。

      sudo echo 1 > /proc/sys/vm/compact_memory
    • システムパラメータを正しく設定する

      /etc/sysctl.confファイルの次のフィールドを確認し、許容される最小空きメモリ量に適した値を設定します。 この値に達すると、自動メモリ再利用がトリガーされます。

      vm.min_free_kbytes

解決策2: インスタンスタイプのアップグレード (vCPUとメモリ)

メモリの例外をトラブルシューティングしてメモリを最適化した後に問題が解決しない場合は、ECSインスタンスのインスタンスタイプをアップグレードして、メモリ不足またはメモリの断片化の問題を解決し、システムが必要なメモリページを割り当てて、インスタンスのシステム、メモリ、またはプロセスの例外を防ぐことができます。 詳細については、「インスタンス設定の変更の概要」をご参照ください。