スキップしてコンテンツを表示

EC2 Linux インスタンスでの、メモリ使用率増加に関する問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスでメモリ使用量が増加する問題をトラブルシューティングしたいです。

簡単な説明

EC2 Linux インスタンスのメモリ使用率が高くなると、システムパフォーマンスが低下したり、フリーズしたりすることがあります。これらのパフォーマンスの問題は通常、メモリリーク、リソースを大量に消費するプロセス、または不十分なメモリ割り当てが原因で発生します。これらの問題を解決するには、まず Linux システムツールを使用して問題の根本原因を特定します。次に、問題の原因に応じてトラブルシューティング手順を実行します。

解決策

問題の根本原因を特定する

問題の原因を特定するには、EC2 インスタンスのメモリ使用パターンを特定します。現在のメモリ使用量を確認するには、次のコマンドを実行します。

free -h

出力例:

      total       used        free        shared      buff/cache   available
Mem:  15Gi        7.2Gi       2.1Gi       1.2Gi       5.7Gi        6.3Gi
Swap: 8Gi         6.5Gi       1.5Gi

EC2 Linux インスタンスでメモリを大量に消費するプロセスを特定するには、top コマンドを実行します。

top

出力例:

    top - 14:23:45 up 15 days, 3:42, 1 user, load average: 2.15, 1.98, 1.75
Tasks: 256 total,   2 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu(s): 24.8 us, 12.3 sy,  0.0 ni, 62.1 id,  0.8 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  32768.0 total,   2453.2 free,  24156.4 used,   6158.4 buff/cache
MiB Swap:   4096.0 total,   3012.5 free,   1083.5 used.   2537.2 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  1234 mysql     20   0   18.2g  15.1g   5.1g S  45.0  47.2   220:31 mysqld
  5678 tomcat    20   0   12.8g  11.2g   124m S  85.2  70.1   445:22 java

インスタンスで最もメモリを消費しているプロセスを特定するには、次のコマンドを実行します。

ps aux --sort=-%mem | head -n 5

出力例:

USER   PID   %CPU %MEM  VSZ    RSS   TTY  STAT  START TIME    COMMAND
mysql  1234  45.0 47.2  18.2g  15.1g ?    Ssl   Jan10 220:31  mysqldjava
       5678  85.2 70.1  12.8g  11.2g ?    Ssl   Jan12 445:22  javaapache
       9012  25.3 23.8  4.2g   3.8g  ?    Ss    Jan12 178:44  httpd

スワップアクティビティが多いと、システムの速度が大幅に低下する可能性があります。詳細については、「M1 および C1 EC2 インスタンスでインスタンスストアのスワップボリュームを有効にする」を参照してください。

スワップアクティビティが発生していないか確認するには、次のコマンドを実行します。

vmstat 1 5

出力例:

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 6650880  2150012 189408 5678024 45  67   234   567 300 450 65 15 10 10  0

メモリ使用パターンに応じて問題をトラブルシューティングする

インスタンスのスワップ使用率が高い場合

次の手順を実行します。

  1. スワップ発生率を削減するには、次のコマンドを実行します。

    sudo sysctl vm.swappiness=10
  2. スワップをクリアするには、次のコマンドを実行します。

    # Find processes using most swap
    $ smem -s swap -r
    
    # For specific process, check its swap usage
    $ grep VmSwap /proc/[PID]/status
    
    # Restart specific high-swap-usage processes during low-traffic periods
    $ systemctl restart [service-name]
    
    # Use Extreme caution when running this command - can cause OOM kills if physical memory is insufficient:
    $ sudo swapoff -a && sudo swapon -a

    重要: インスタンスの物理メモリが swap コマンドを実行するのに十分でない場合、メモリ不足 (OOM) エラーが発生する可能性があります。

  3. インスタンスに追加容量が必要な場合は、次のコマンドを実行します。

    sudo dd if=/dev/zero of=/swapfile bs=1G count=8

システム全体でメモリの問題が発生する場合

次の手順を実行します。

  1. OOM エラーが発生していないか確認するには、次のコマンドを実行します。

    sudo grep -i 'out of memory' /var/log/syslog
    sudo dmesg | grep -i 'out of memory'
    sudo journalctl -k | grep -i 'oom'
    sudo grep -i 'killed process' /var/log/messages
  2. インスタンスのメモリ使用量を監視するには、次のコマンドを実行します。

    watch -n 1 free -m
  3. 使用可能なメモリページの有無を確認するには、次のコマンドを実行します。

    cat /proc/buddyinfo

詳細については、「Amazon EC2 インスタンスタイプ」を参照してください。

Java アプリケーションにメモリリークが発生している場合

次の手順を実行します。

  1. ヒープサイズを調整するには、次のコマンドを実行します。
    java -Xms2g -Xmx4g -jar application.jar
    注: 2g4g を、アプリケーションの最小ヒープサイズと最大ヒープサイズに置き換えます。
  2. ガベージコレクション (GC) の記録を有効にするには、次のコマンドを実行します。
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    注: gc.log を実際のログファイル名とパスに置き換えます。
  3. G1 ガベージコレクタを使用してインスタンスメモリの管理を改善するには、次のコマンドを実行します。
    java -XX:+UseG1GC -jar application.jar
    注: -XX:+UseG1GC を希望するガベージコレクションアルゴリズムに置き換えてください。

データベースサーバーに問題がある場合

次の手順を実行します。

  1. 特定のデータベースサーバープロセスを監視するには、次のコマンドを実行します。

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. InnoDB バッファプールの使用状況を確認するには、次のコマンドを実行します。

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. 各接続のメモリ使用量を分析するには、次のコマンドを実行します。

    mysql -e "SHOW VARIABLES LIKE '%buffer%';"

データベースサーバーのパフォーマンスを最適化する方法については、「MySQL を使用する際のベストプラクティス」を参照してください。

関連情報

CloudWatch エージェントを使用してメトリクス、ログ、証跡を収集する

AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ