LinuxでSwap使用量が高いときの確認方法|メモリ不足の原因と対処手順

Linuxサーバーを運用していると、メモリにはまだ空きがあるように見えるのに、Swapの使用量が高くなっていることがあります。

Swapは、物理メモリ(RAM)が不足したときなどに、メモリページの一部をディスク上に退避させる仕組みです。ただし、Swapの使用量が多いからといって、必ずしも現在メモリ不足が発生しているとは限りません。

重要なのは、Swapがどれくらい使われているかだけでなく、現在もSwapへの読み書きが繰り返されているかを確認することです。

ここでは、LinuxでSwapの使用状況を確認する方法から、メモリ不足の原因を調べる手順、安全に対処する方法まで順番に説明します。

1. LinuxのSwapとは?

Swapは、物理メモリ(RAM)だけでは処理しきれない場合などに、メモリページの一部をディスク上に退避させる仕組みです。

すぐに使用されないメモリページをSwapに移すことで、RAMをほかの処理に使えるようになります。

主な役割は次のとおりです。

  • RAMが不足したときのメモリ領域の補助
  • 使用頻度の低いメモリページの退避
  • 一時的にメモリ使用量が増加した場合の対応
  • システムのメモリ管理を補助

ただし、Swapはディスクを使用するため、RAMと比べてアクセス速度が遅くなります。

Swapへの読み書きが頻繁に発生すると、サーバーの応答が遅くなったり、アプリケーションの処理時間が長くなったりすることがあります。

2. freeコマンドでSwap使用量を確認する

まずはfreeコマンドで、RAMとSwapの使用状況を確認します。

free -h

実行結果の例:

               total        used        free      shared  buff/cache   available
Mem:            16Gi        10Gi       1.2Gi       500Mi       4.8Gi       5.1Gi
Swap:            4Gi       2.5Gi       1.5Gi

主な項目の意味は次のとおりです。

項目説明
Mem物理メモリ(RAM)
totalメモリの総容量
used使用中のメモリ
free未使用のメモリ
available新しい処理に利用できると推定されるメモリ
SwapSwapの総容量
Swap used使用中のSwap容量

上記の例では、4GBのSwapのうち2.5GBが使用されています。

ただし、この数値だけでメモリ不足と判断することはできません。以前Swapに移動されたメモリページが、現在もそのまま残っている場合があるためです。

RAMのavailableと、実際のSwap入出力を合わせて確認することが大切です。

3. 使用中のSwap領域を確認する

現在どのSwap領域が有効になっているか確認するには、次のコマンドを実行します。

swapon --show

出力例:

NAME      TYPE      SIZE  USED PRIO
/swapfile file        4G  2.5G   -2

各項目の意味は次のとおりです。

  • NAME:Swapファイルまたはパーティションのパス
  • TYPE:Swap領域の種類
  • SIZE:Swapの総容量
  • USED:現在使用されている容量
  • PRIO:Swapの優先順位

複数のSwap領域が設定されている場合も、このコマンドでそれぞれの使用状況を確認できます。

別の方法として、次のファイルを確認することもできます。

cat /proc/swaps

4. Swapへの読み書きが続いているか確認する

Swapの使用量が多くても、現在ほとんど読み書きが発生していなければ、すぐに問題になるとは限りません。

実際にメモリへの負荷が続いているか確認するには、vmstatコマンドが役立ちます。

vmstat 1 5

このコマンドは、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
 1  0 2621440 1200000 200000 4000000   0    0     2     5  100  200 10  5 85  0  0
 2  0 2621440 1100000 200000 3900000  20   10    30    20  120  250 15  7 75  3  0

Swapの状態を確認するときに注目したい項目は次の2つです。

項目説明
siSwapからRAMへ読み込まれたデータ量
soRAMからSwapへ書き出されたデータ量

通常、これらはKB/秒単位で表示されます。

確認するときの目安は次のとおりです。

  • siとsoが継続的に0に近い:現在のSwap入出力はほとんど発生していない可能性がある
  • siとsoが繰り返し増加する:Swapへの読み書きが続いている可能性がある
  • Swap入出力と同時に応答速度が低下する:メモリ不足やメモリ負荷を詳しく調べる必要がある

一時的な数値だけで判断せず、複数回の測定結果とサーバーの応答状況を合わせて確認しましょう。

5. Swap使用量が高くなる原因を調べる

Swapの使用量が高い状態が続く場合は、どのプロセスがメモリを多く使っているのか確認します。

① メモリ使用量が多いプロセスを確認する

次のコマンドで、メモリ使用率が高いプロセスを上位10件まで表示できます。

ps aux --sort=-%mem | head -10

主に確認する項目は次のとおりです。

  • USER:プロセスを実行しているユーザー
  • PID:プロセスID
  • %MEM:物理メモリに対する使用率
  • RSS:実際にRAM上に常駐しているメモリ量
  • COMMAND:実行されているコマンド

特定のプロセスが大量のメモリを使用している場合は、そのプログラムの設定や動作状況を確認しましょう。

なお、このコマンドで確認できるのは主に現在のRAM使用状況です。プロセスごとのSwap使用量を正確に表示するものではありません。

② プロセスごとのSwap使用量を確認する

プロセスごとのSwap使用量を調べるには、/proc以下の情報を確認する方法があります。

for pid in /proc/[0-9]*; do
    if [ -r "$pid/status" ]; then
        awk '
            /^Name:/ { name=$2 }
            /^VmSwap:/ { swap=$2 }
            END {
                if (swap > 0) {
                    printf "%10d KB  %s\n", swap, name
                }
            }
        ' "$pid/status"
    fi
done | sort -nr | head -10

このコマンドは、各プロセスのstatus情報からSwap使用量を取得し、使用量の多い順に表示します。

出力例:

   524288 KB  java
   262144 KB  mysqld
   131072 KB  nginx

この結果から、どのプロセスがSwapを使用しているか、おおよその状況を把握できます。

ただし、プロセスが終了した場合や情報へのアクセス権限がない場合は、結果に反映されないことがあります。また、同じ名前のプロセスが複数存在する場合は、PIDごとの確認も必要です。

6. Swap使用量を減らす方法

Swapの使用量が高いからといって、すぐにSwapを無効化したり、設定を変更したりするのはおすすめできません。

まずはメモリを多く使っているプロセスと、実際のSwap入出力を確認してから対処しましょう。

① 不要なプロセスを整理する

メモリを過剰に使用しているプロセスが見つかった場合は、そのプログラムが必要かどうか、正常に動作しているかを確認します。

サービスとして動作している場合は、次のコマンドで状態を確認できます。

systemctl status サービス名

問題があるサービスについては、設定の見直しや安全な再起動を検討します。

ただし、稼働中のサービスを無計画に終了すると、システムやアプリケーションに影響が出る可能性があります。実行前にサービスの役割と影響範囲を確認してください。

② swappinessの設定を確認する

Linuxには、Swapをどの程度利用するかに関係するswappinessという設定があります。

現在の値は次のコマンドで確認できます。

cat /proc/sys/vm/swappiness

一般的な設定範囲は0~200です。

値が高いほど、カーネルがSwapを利用する傾向が強くなります。ただし、値を低く設定してもSwapが完全に使われなくなるわけではありません。

一時的に値を変更する場合は、次のコマンドを使用します。

sudo sysctl vm.swappiness=10

この変更は通常、再起動すると元に戻ります。

再起動後も設定を維持したい場合は、/etc/sysctl.confまたは/etc/sysctl.d/以下の設定ファイルに次の内容を追加します。

vm.swappiness=10

設定を変更する前に、現在の値とサーバーの用途を確認しておきましょう。

適切な値は、メモリ容量やアプリケーションの動作によって異なります。数値を下げれば必ず性能が改善するわけではないため、変更後も実際の動作を確認することが重要です。

③ Swapを一度無効化して再有効化する

Swapを一度無効化し、再び有効にすることで、使用中のSwap領域を解放する方法もあります。

sudo swapoff -a
sudo swapon -a

最初のswapoff -aは、有効になっているSwapをすべて無効化します。

続くswapon -aは、設定ファイルに登録されているSwapを再び有効化します。

ただし、swapoffを実行すると、Swap上のデータをRAMに戻す必要があります。

そのため、RAMに十分な空きがない状態で実行すると、メモリ不足が発生したり、プロセスが終了したりする可能性があります。

特に本番サーバーでは、安易に実行しないでください。

実行前には、次の点を確認しましょう。

  • free -hでavailableメモリに十分な余裕があるか
  • 現在のSwap使用量がどの程度か
  • メモリを多く使用しているプロセスがないか
  • サービスに影響が出る可能性がないか

Swapを一度空にしても、メモリ不足の根本原因が解決するわけではありません。原因を確認せずに繰り返すのは避けましょう。

7. Swap使用量が高いときの確認手順

実際のサーバーでは、次の順番で確認すると原因を絞り込みやすくなります。

順番コマンド確認する内容
1free -hRAMとSwapの使用量
2swapon --show有効なSwap領域
3vmstat 1 5Swapの読み書きが発生しているか
4ps aux --sort=-%memメモリ使用量が多いプロセス
5/proc/*/statusプロセスごとのSwap使用量
6systemctl status関連サービスの状態

特に重要なのは、free -hのavailable、vmstatのsiとso、そしてサーバーの応答速度を合わせて確認することです。

Swap使用量が高くても、システムが安定して動作し、Swapへの入出力がほとんど発生していないのであれば、すぐに設定を変更する必要はない場合があります。

一方、Swapへの読み書きが継続し、アプリケーションの応答まで遅くなっている場合は、メモリを多く使用しているプロセスから調査しましょう。

まとめ

LinuxでSwap使用量が高くなっていても、それだけでメモリ不足や障害が発生しているとは限りません。

以前Swapに移動したメモリページが残っている場合もあるため、現在のRAM使用状況とSwapへの読み書きを合わせて確認することが大切です。

まずは次の3つのコマンドから確認してみましょう。

  1. free -h:RAMとSwapの使用量を確認
  2. vmstat 1 5:Swapへの読み書きが続いているか確認
  3. ps aux --sort=-%mem:メモリ使用量が多いプロセスを確認

Swap使用量だけを見て無理に解放したり、設定を変更したりするのではなく、実際にメモリ不足が発生しているかを確認してから対処することが安全なサーバー運用につながります。

Linuxサーバーのメモリ不足を確認する方法

類似投稿