AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
EC2 Linux インスタンスでの、メモリ使用率増加に関する問題をトラブルシューティングする方法を教えてください。
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
メモリ使用パターンに応じて問題をトラブルシューティングする
インスタンスのスワップ使用率が高い場合
次の手順を実行します。
-
スワップ発生率を削減するには、次のコマンドを実行します。
sudo sysctl vm.swappiness=10 -
スワップをクリアするには、次のコマンドを実行します。
# 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) エラーが発生する可能性があります。
-
インスタンスに追加容量が必要な場合は、次のコマンドを実行します。
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
システム全体でメモリの問題が発生する場合
次の手順を実行します。
-
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 -
インスタンスのメモリ使用量を監視するには、次のコマンドを実行します。
watch -n 1 free -m -
使用可能なメモリページの有無を確認するには、次のコマンドを実行します。
cat /proc/buddyinfo
詳細については、「Amazon EC2 インスタンスタイプ」を参照してください。
Java アプリケーションにメモリリークが発生している場合
次の手順を実行します。
- ヒープサイズを調整するには、次のコマンドを実行します。
注: 2g と 4g を、アプリケーションの最小ヒープサイズと最大ヒープサイズに置き換えます。java -Xms2g -Xmx4g -jar application.jar - ガベージコレクション (GC) の記録を有効にするには、次のコマンドを実行します。
注: gc.log を実際のログファイル名とパスに置き換えます。java -Xlog:gc*=debug:file=gc.log -jar application.jar - G1 ガベージコレクタを使用してインスタンスメモリの管理を改善するには、次のコマンドを実行します。
注: -XX:+UseG1GC を希望するガベージコレクションアルゴリズムに置き換えてください。java -XX:+UseG1GC -jar application.jar
データベースサーバーに問題がある場合
次の手順を実行します。
-
特定のデータベースサーバープロセスを監視するには、次のコマンドを実行します。
ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql -
InnoDB バッファプールの使用状況を確認するには、次のコマンドを実行します。
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool" -
各接続のメモリ使用量を分析するには、次のコマンドを実行します。
mysql -e "SHOW VARIABLES LIKE '%buffer%';"
データベースサーバーのパフォーマンスを最適化する方法については、「MySQL を使用する際のベストプラクティス」を参照してください。
関連情報
関連するコンテンツ
質問済み 2年前
