Linux Swapを徹底解説|Swap Out・Swap In・swappinessの仕組み

はじめに

Linuxでは、物理メモリへの負荷が高まった場合でも、システムが動作を継続できるようにするための仕組みとしてSwapが用意されています。

Swapとは、物理メモリ上で使用頻度の低いメモリページを一時的にディスク上のSwap領域へ退避させ、新たなメモリを確保する仕組みです。これにより、メモリ不足が発生した場合でも、アプリケーションを終了させることなく動作を継続できる場合があります。

一方で、Swapはディスクを利用するため、物理メモリへのアクセスと比べて大幅に処理速度が低下します。そのため、Swapが頻繁に発生している場合は、システム性能の低下やレスポンス悪化の原因となることがあります。

また、障害調査では「Swapが使用されている=異常」と考えられがちですが、必ずしもそうとは限りません。重要なのは、Swapがどのような状況で利用され、現在もSwap InやSwap Outが継続的に発生しているかを正しく判断することです。

本記事では、Swapの役割や仕組み、Swap Out・Swap Inの動作、swappinessの役割、さらにfreeやvmstatなどを利用した確認方法まで、図を交えながらわかりやすく解説します。

Swapとは

Swapとは、物理メモリ(RAM)が不足した際に、使用頻度の低いメモリページを一時的にディスク上のSwap領域へ退避させる仕組みです。

通常、アプリケーションが利用するデータは物理メモリ上に保持されます。しかし、メモリ使用量が増え、空きメモリが不足すると、新たなメモリを確保できなくなってしまいます。

そこでLinuxは、しばらく使用されていないメモリページをSwap領域へ退避させ、その分の物理メモリを解放します。解放された物理メモリは、新たなアプリケーションやカーネルが利用できるようになります。

Linuxはページの参照状況などを基に、利用頻度が低いと判断したAnonymous PageをSwap領域へ退避します。これにより、頻繁に利用されるページを物理メモリ上へ残しながら、限られたメモリを効率よく利用できます。

なお、Swapはディスクを利用するため、物理メモリよりもアクセス速度が大幅に遅くなります。そのため、Swapはあくまでもメモリ不足時の補助的な仕組みであり、頻繁に利用される状態はシステム性能の低下につながる可能性があります。

Anonymous Pageとは

Swapを理解するうえで重要なのが、Anonymous Page(匿名ページ)という概念です。

Anonymous Pageとは、ファイルに対応付けられていないメモリページのことです。

例えば、アプリケーションがmalloc()やnewを使用して確保したヒープ領域や、プログラムのスタック領域などがAnonymous Pageに該当します。これらのデータはファイルから読み込まれたものではないため、ディスク上に元となるファイルが存在しません。

一方、HTMLファイルや画像ファイル、ライブラリファイルなど、ファイルから読み込まれたデータはFile-backed Page(ファイルページ)として管理されます。

両者の違いをまとめると、次のようになります。

ここで重要なのは、Swapの対象になるのは基本的にAnonymous Pageであるという点です。

File-backed Pageは、元となるファイルがディスク上に存在するため、メモリ不足になればページキャッシュを解放するだけで済みます。必要になった場合は、再びファイルから読み込めばよいためです。

一方、Anonymous Pageは元となるファイルが存在しないため、単純に破棄してしまうとアプリケーションのデータが失われてしまいます。そのため、LinuxはAnonymous PageをSwap領域へ退避させることでデータを保持します。

このようにLinuxは、ページの種類によって解放方法を使い分けることで、限られた物理メモリを効率よく活用しています。

Swapの動作

SwapにはSwap OutとSwap Inという処理があります。それぞれ見ていきましょう。

Swap Out

Swap Outとは、物理メモリ(RAM)が不足した際に、使用頻度の低いAnonymous PageをSwap領域へ退避させる処理です。

Linuxでは、物理メモリに十分な空きがある間は、アプリケーションのデータはすべてRAM上で管理されます。しかし、メモリ使用量が増えて空きメモリが少なくなると、Linuxカーネルは新たなメモリを確保するためにメモリ回収(Page Reclaim)を開始します。

Linuxはメモリ回収時に、File-backed PageとAnonymous Pageのどちらを優先して回収するかを、アクセス状況やswappinessなどを考慮して判断します。swappinessは、匿名メモリとファイルページの回収にかかる相対的なI/Oコストを調整するパラメータです。詳細は、後続の章で説明しています。

Swap Outによって物理メモリが解放されることで、新たなアプリケーションやカーネルが利用できるメモリを確保できます。

なお、Swap Outの対象となるのは基本的にAnonymous Pageです。ページキャッシュは元となるファイルが存在するため、通常はSwapへ退避されることなく解放されます。

Swap In

Swap Inとは、Swap領域へ退避したメモリページを再び物理メモリへ読み戻す処理です。

Swap Outされたページは、ディスク上のSwap領域へ保存されています。そのページへ再びアクセスが発生すると、LinuxはSwap領域からページを読み込み、物理メモリへ復元します。この処理をSwap Inと呼びます。

Swap領域はディスク上にあるため、Swap Inには物理メモリへのアクセスよりも多くの時間がかかります。そのため、Swap Inが頻繁に発生すると、アプリケーションのレスポンス低下やシステム全体の性能低下につながることがあります。

また、Swap Inはページフォルト(Page Fault)と密接に関係しています。

ページフォルトとは、プロセスがアクセスしたページが現在物理メモリ上に存在しない場合に発生する例外です。Swap Outされたページへアクセスするとページフォルトが発生し、LinuxはSwap領域から対象ページを読み込んで物理メモリへ配置します。その後、アプリケーションの処理が再開されます。

このように、Swap Inはページフォルトを契機として実行されることで、アプリケーションはSwapされたことを意識することなく処理を継続できます。ただし、Swap領域からの読み込みにはストレージI/Oが必要となるため、アクセス遅延として影響が現れることがあります。

Swapが発生する流れ

ここまで説明した内容をまとめると、Swapは次のような流れで実行されます。

まず、アプリケーションの実行に伴い物理メモリの使用量が増加します。空きメモリが十分にある間は問題ありませんが、空きメモリが不足するとLinuxカーネルはPage Reclaimを開始します。

Page Reclaimでは、利用頻度の低いFile-backed Pageを解放したり、Anonymous PageをSwap領域へ退避したりして空きメモリを確保します。どちらを優先して回収するかは固定ではなく、ページの参照状況やswappinessなどを考慮して判断されます。

その後、Swap Outされたページへ再びアクセスするとページフォルトが発生し、Swap Inによってページが物理メモリへ読み戻されます。

この一連の流れにより、Linuxは限られた物理メモリを効率よく利用しながら、アプリケーションの動作を継続しています。

Swapの流れをまとめると、次のようになります。

  1. メモリ使用量が増加する
  2. 空きメモリが不足する
  3. Page Reclaimが実行される
  4. 不要なページキャッシュを解放する
  5. 必要に応じてAnonymous PageをSwap Outする
  6. Swapされたページへアクセスするとページフォルトが発生する
  7. Swap Inによって物理メモリへ読み戻される

このように、Linuxはページキャッシュの解放とSwapを組み合わせることで、限られた物理メモリを効率的に利用しています。そのため、物理メモリが不足したからといって、すぐにSwapが実行されるわけではありません

swappiness

swappinessとは、Linuxカーネルがどの程度積極的にSwapを利用するかを決定するカーネルパラメータです。

物理メモリの空きが少なくなると、Linuxはページキャッシュを解放したり、Anonymous PageをSwap領域へ退避したりしてメモリを確保します。swappinessは、このときSwap Outをどの程度積極的に実行するかを調整するための指標です。

RHEL 9では、swappinessの有効範囲は0~200です。値100は、匿名ページのSwap I/Oとファイルページの再読み込みにかかるI/Oコストを同等とみなす設定です。

  • 値が小さいほど、できるだけSwapを利用せず、物理メモリを優先して使用します。
  • 値が大きいほど、Swapを積極的に利用するようになります。

一般的なLinuxディストリビューションでは、デフォルト値として60が設定されています。

swappinessの設定値

swappinessの設定値の目安は以下の通りです。

動作の傾向
0Anonymous PageのSwap Outを可能な限り抑える
60多くの環境で使われる標準的な設定値
100Swapとファイルページ再読み込みのI/Oコストを同等とみなす
200Anonymous Pageの回収を非常に積極的に選択する

なお、「0」に設定したからといってSwapがまったく使用されなくなるわけではありません。物理メモリが不足した場合は、必要に応じてSwap Outが実行されます。

例えば、データベースサーバでは、頻繁に利用するデータがSwapされると性能が大きく低下するため、低い値が設定されることが多くあります。一方、一般的なLinuxサーバでは、デフォルト値の60でも問題なく運用できるケースが少なくありません。

ただし、「この値が正解」というものはありません。

物理メモリ容量、アプリケーションの特性、ページキャッシュの利用状況などによって最適な値は変わります。そのため、障害調査や性能改善では、vmstatのsi・soやfreeコマンドなどを確認しながら、実際のメモリ使用状況に応じて調整することが重要です。

swappinessの確認方法

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

[root@almalinux ~]# cat /proc/sys/vm/swappiness
60
[root@almalinux ~]#

この例では、デフォルト値である60が設定されています。

swappinessの変更方法

設定変更を永続化する場合は、/etc/sysctl.confまたは/etc/sysctl.d/配下の設定ファイルへ以下を記述します。

[root@almalinux ~]# vi /etc/sysctl.conf
[root@almalinux ~]#
[root@almalinux ~]# grep vm.swappiness /etc/sysctl.conf
vm.swappiness = 10
[root@almalinux ~]#

そのあと、sysctl -p で設定を反映します。

[root@almalinux ~]# sysctl -p
kernel.panic = 10
kernel.watchdog_thresh = 20
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
vm.swappiness = 10
[root@almalinux ~]#
[root@almalinux ~]# cat /proc/sys/vm/swappiness
10
[root@almalinux ~]#

Swapの確認方法

Linuxでは、Swapの使用状況やSwap In・Swap Outの発生状況を、さまざまなコマンドで確認できます。

障害調査では、「Swapが使用されているか」だけでなく、「現在もSwapが発生し続けているか」を確認することが重要です。

ここでは、実務でよく利用する確認方法を紹介します。

freeコマンド

最も手軽にSwapの使用状況を確認できるのが free コマンドです。

[root@almalinux ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           7.6Gi       3.4Gi       1.2Gi       220Mi       3.0Gi       3.8Gi
Swap:          2.0Gi       512Mi       1.5Gi

ここで注目すべき項目は、Swapの使用量です。

項目内容
Swap TotalSwap領域の総容量
Swap Used現在使用中のSwap容量
Swap Free空いているSwap容量

Swap Usedが増えている場合は、Anonymous PageがSwap領域へ退避されていることを意味します。

ただし、Swapが使用されているだけでは異常とは限りません。

Linuxでは、一度Swap Outされたページは、再度アクセスされるまでSwap上に保持されます。そのため、過去にSwapが使用された結果としてSwap Usedが残っているだけの場合もあります。

そのため、現在もSwapが発生しているかどうかは、後述するvmstatなどで確認することが重要です。

/proc/meminfo

より詳細な情報は、/proc/meminfo から確認できます。

特に確認したい項目は以下のとおりです。

項目内容
SwapTotalSwap領域の総容量
SwapFree空いているSwap容量
SwapCachedSwapへ退避された後、再びRAMへ読み込まれたページのキャッシュ

必要な項目だけ確認する場合は、次のコマンドが便利です。

[root@almalinux ~]# grep -E "SwapTotal|SwapFree|SwapCached" /proc/meminfo
SwapTotal:      2097148 kB
SwapFree:       1572864 kB
SwapCached:         4096 kB
[root@almalinux ~]#

SwapCachedは、一度Swapから読み戻されたページが、再利用される可能性を考慮して保持されている容量を表します。

vmstatコマンド

現在もSwapが発生しているかを確認するには、vmstatが最も有効です。

[root@almalinux ~]# vmstat 1
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 524288 256000  12000 820000    0    0     8    24 2200 1400  2  3 95  0  0

特に確認する項目は以下のとおりです。

項目内容
swpd使用中のSwap容量
siSwap In(SwapからRAMへの読み込み量)
soSwap Out(RAMからSwapへの退避量)

障害調査では、特にsiとsoに注目します。

  • siが継続的に増えている場合は、Swapから頻繁にページを読み込んでいる状態です。
  • soが継続的に増えている場合は、物理メモリ不足によりSwap Outが発生している状態です。

siとsoが長時間増え続ける場合は、物理メモリ不足によって性能が低下している可能性があります。

sarコマンド

過去のSwap発生状況を確認するには、sarコマンドが便利です。

[root@almalinux ~]# sar -W 1
Linux 5.14.0-570.19.1.el9_6.x86_64 (almalinux)  08/02/2026      _x86_64_        (4 CPU)

12:00:01 AM pswpin/s pswpout/s
12:00:02 AM      0.00      3.00
12:00:03 AM      0.00      0.00
12:00:04 AM      5.00      0.00

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

項目内容
pswpin/s1秒あたりにSwap Inされたページ数
pswpout/s1秒あたりにSwap Outされたページ数

vmstatが現在の状況を確認するコマンドであるのに対し、sarは過去から現在までの推移を確認できるため、障害発生時刻の分析にも役立ちます。

sarについては以下で詳細にまとめているので、興味があったら合わせて参照ください。
Linux性能監視に必須!sarコマンドの使い方と見方を徹底解説【CPU・メモリ・I/O分析】

Swapが増える原因と障害調査のポイント

今まで説明している通り、Swapは物理メモリが不足した際に、使用頻度の低いAnonymous Pageをディスク上のSwap領域へ退避させる仕組みです。

そのため、Swapが使用されているということは、Linuxが物理メモリを確保するためにSwap Outを実行したことを意味します。

ただし、Swapが使用されていること自体は必ずしも異常ではありません。

重要なのは、なぜSwapが利用されたのか、そして現在もSwapが発生し続けているのかを確認することです。

物理メモリ不足

最も多い原因は、物理メモリ不足です。

アプリケーションが大量のメモリを使用すると、Linuxは新たなメモリを確保するためにSwap Outを実行します。

例えば、大量データを処理するバッチ処理や、多数のアプリケーションを同時に実行した場合などにSwapが発生することがあります。

メモリリーク

アプリケーションのメモリリークも、Swapが増える代表的な原因です。

メモリリークが発生すると、使用メモリが徐々に増加し、最終的に物理メモリが不足してSwap Outが実行されます。

長時間稼働するにつれてSwap使用量が増え続ける場合は、メモリリークも疑う必要があります。

swappinessの設定

swappinessの設定値によっても、Swapの発生しやすさは変化します。

設定値が高いほどSwapを利用しやすくなり、低いほど物理メモリを優先して利用します。

ただし、Swapの発生はswappinessだけで決まるものではなく、物理メモリの使用状況やワークロードにも大きく左右されます。

長時間稼働

長期間稼働しているサーバでは、一度Swap OutされたページがそのままSwap領域に残っていることがあります。

この場合、現在は物理メモリに余裕があってもSwap Usedは減りません。

つまり、現在Swapが発生しているわけではなく、過去にSwapが利用された結果が残っているだけというケースです。

障害調査のポイント

Swapの状態を確認する際は、次の点を確認すると原因を切り分けやすくなります。

確認ポイント考えられる状況
Swap Usedが増えている過去にSwapが利用された可能性がある
siが継続的に増えているSwap Inが頻繁に発生している
soが継続的に増えているSwap Outが発生し、物理メモリが不足している
si・soの両方が増えている頻繁なSwap In/Outが発生し、性能低下の可能性が高い
Swap Usedは増えているがsi・soは0現在はSwapが発生しておらず、過去の利用結果が残っているだけ
特定プロセスのメモリ使用量が増え続けるメモリリークの可能性
swappinessが高いSwapが発生しやすい設定になっている可能性

重要なのは、「Swap Usedが多い=異常」ではないという点です。

障害調査では、freeコマンドでSwap使用量を確認した後、vmstatsarを利用して、現在もSwap InやSwap Outが継続的に発生しているかを確認します。さらに、プロセスのメモリ使用量やswappinessの設定もあわせて確認することで、Swapが発生した原因を効率よく切り分けることができます。

まとめ

Swapは、メモリ回収時に利用頻度の低いAnonymous Pageをストレージ上のSwap領域へ退避させ、物理メモリを確保する仕組みです。

Anonymous PageがSwap領域へ退避される処理をSwap Out、再びアクセスされた際に物理メモリへ読み戻される処理をSwap Inと呼びます。Swap InではストレージI/Oが発生するため、頻繁に繰り返されるとアプリケーションの応答性能が低下する可能性があります。

本記事で紹介した主な要素を整理すると、次のようになります。

項目役割
SwapAnonymous Pageの退避先
Swap OutRAM上のページをSwap領域へ退避する
Swap InSwap領域のページをRAMへ読み戻す
swappinessAnonymous PageとFile-backed Pageの回収バランスを調整する
freeSwap領域の総量と使用量を確認する
vmstat現在のSwap In・Swap Outを確認する
sar -WSwap In・Swap Outの推移を確認する

障害調査で重要なのは、Swap Usedの大きさだけで異常と判断しないことです。Swap Usedが残っていても、vmstatのsiとsoが0であれば、過去にSwap Outされたページが残っているだけの場合があります。

一方、siやsoが継続的に発生し、I/O待ちやアプリケーションの応答遅延も増えている場合は、物理メモリ不足やメモリリークなどを疑う必要があります。

そのため、Swapの調査では、free、vmstat、sar、プロセスごとのメモリ使用量を組み合わせ、現在の動作と過去の推移を総合的に確認することが重要です。

メモリ管理の詳細については、以下の通り詳細を記載していますので、合わせて読んでみてください。

記事内容リンク
第1回Linuxメモリ管理の全体像(本記事)Linuxメモリ管理を徹底解説|仮想メモリ・ページキャッシュ・Swap・OOM Killerの仕組み
第2回仮想メモリの仕組みLinuxの仮想メモリを徹底解説|仕組み・MMU・ページテーブルをわかりやすく解説
第3回プロセスのメモリレイアウトLinuxプロセスのメモリレイアウトを徹底解説|Heap・Stack・Text・Data・BSS・mmapの役割
第4回Linuxカーネルのメモリ管理Linuxカーネルのメモリ管理とは?ページフレーム・メモリゾーン・Buddy Allocator・SLUBをわかりやすく解説
第5回ページキャッシュLinuxカーネルのメモリ管理とは?ページフレーム・メモリゾーン・Buddy Allocator・SLUBをわかりやすく解説
第6回Swap本記事
第7回メモリ不足時の動作(kswapd・OOM Killer)Linuxメモリ不足時の動作を徹底解説|kswapd・Direct Reclaim・OOM Killerの仕組み

コメント