Linuxページキャッシュを徹底解説|Page Cache・Dirty Page・Writebackの仕組み

はじめに

Linuxでは、空いている物理メモリ(RAM)をそのまま遊ばせておくことはありません。使用されていないメモリを積極的に活用し、ファイルアクセスを高速化するためのページキャッシュ(Page Cache)として利用しています。

そのため、freeコマンドを実行すると空きメモリが少なく表示されることがあります。しかし、多くの場合、それはメモリ不足ではなく、Linuxが空きメモリを効率的に活用している結果です。

また、アプリケーションがファイルへデータを書き込んだ場合、その内容はすぐにディスクへ保存されるわけではありません。一度ページキャッシュへ書き込まれ、Dirty Pageとして管理された後、Writebackによってディスクへ書き戻されます。この仕組みにより、ディスクへの書き込み回数を削減し、システム全体のI/O性能を向上させています。

ページキャッシュ、Dirty Page、Writebackは、それぞれ異なる役割を持ちながら連携し、Linuxの高速なファイルアクセスを支える重要な仕組みです。これらを理解することで、「なぜLinuxでは空きメモリが少なく見えるのか」「ファイルの書き込みはどのようにディスクへ反映されるのか」といった疑問だけでなく、ディスクI/Oに関するトラブルの原因も把握しやすくなります。

本記事では、ページキャッシュの役割や動作の流れ、Dirty PageやWritebackの仕組み、さらに障害調査で役立つ確認方法について、図を交えながらわかりやすく解説します。

本記事では、ページキャッシュ、Dirty Page、Writeback、Swapの仕組みや役割、動作の流れ、確認方法について、図を交えながらわかりやすく解説します。

ページキャッシュ(Page Cache)

ページキャッシュ(Page Cache)とは、Linuxがファイルデータを物理メモリ(RAM)上にキャッシュし、ディスクアクセスを高速化するための仕組みです。

通常、ファイルを読み込む際にはストレージ(SSDやHDD)へアクセスする必要があります。しかし、ディスクアクセスは物理メモリへのアクセスと比べて非常に時間がかかります。

そこでLinuxは、一度読み込んだファイルデータをページキャッシュへ保存します。同じデータが再び必要になった場合は、ディスクではなくページキャッシュから読み込むことで、高速にデータを取得できます。

例えば、WebサーバがHTMLファイルや画像ファイルを読み込んだ場合、それらのデータはページキャッシュへ保存されます。その後、同じファイルへ再度アクセスすると、ディスクへアクセスすることなくページキャッシュから取得できるため、レスポンス時間を短縮できます。

また、ページキャッシュは読み込みだけでなく、書き込み処理でも利用されます。アプリケーションから書き込まれたデータは、一度ページキャッシュへ保存され、後からまとめてディスクへ書き戻されます。この仕組みにより、ディスクI/Oの回数を減らし、システム全体の性能を向上させています。なお、この書き戻しの仕組みについては、後述する「Dirty Page」と「Writeback」で詳しく説明します。

ページキャッシュには、次のような特徴があります。

  • ファイルデータを物理メモリへキャッシュする
  • ディスクアクセスを減らし、読み書きを高速化する
  • メモリが不足すると不要なキャッシュから解放される
  • アプリケーションはページキャッシュの存在を意識する必要がない

Linuxでは、「空きメモリは無駄な資源」という考え方に基づき、使用されていない物理メモリを積極的にページキャッシュとして活用しています。そのため、freeコマンドを実行すると空きメモリが少なく表示されることがありますが、多くの場合、それはページキャッシュとして有効活用されているだけであり、必ずしもメモリ不足を意味するわけではありません。

ページキャッシュの動作

ページキャッシュがどのように動作するのかを理解するために、ファイルを2回読み込む場合を例に見てみましょう。

初回アクセス

アプリケーションがファイルを読み込む際、ページキャッシュに対象データが存在しない場合は、ストレージ(SSDやHDD)からデータを読み込みます。

読み込まれたデータはアプリケーションへ渡されると同時に、ページキャッシュにも保存されます。

このため、初回アクセスではディスクI/Oが発生します。

2回目以降のアクセス

同じファイルへ再度アクセスすると、Linuxはまずページキャッシュを確認します。

必要なデータがページキャッシュに存在していれば、ディスクへアクセスすることなく、ページキャッシュから直接データを取得できます。

これにより、ディスクI/Oを発生させずに高速なファイルアクセスを実現できます。

このように、一度読み込んだファイルはページキャッシュへ保持されるため、同じデータへのアクセスを繰り返すアプリケーションほど、その効果は大きくなります。

なお、物理メモリには限りがあるため、ページキャッシュを無制限に保持できるわけではありません。メモリが不足すると、Linuxは使用頻度の低いページキャッシュから順番に解放し、新たなメモリ要求へ対応します。

このように、Linuxは空きメモリをページキャッシュとして積極的に活用し、必要に応じて解放することで、性能とメモリ利用効率の両立を実現しています。

Dirty PageとWriteback

アプリケーションがファイルへデータを書き込んだ場合、その内容はすぐにディスクへ保存されるわけではありません。Linuxでは、まずデータをページキャッシュへ書き込み、そのページをDirty Pageとして管理します。

Dirty Pageとは、メモリ上で内容が更新されたものの、まだディスクへ書き込まれていないページのことです。

例えば、アプリケーションがログファイルへデータを書き込むと、その内容はページキャッシュへ反映されます。この時点ではディスク上のファイルはまだ更新されておらず、ページキャッシュ内のページだけが変更された状態になっています。

このような仕組みを採用する理由は、ディスクへの書き込み回数を減らし、システム全体の性能を向上させるためです。

もし書き込みのたびにディスクへアクセスすると、大量のディスクI/Oが発生し、性能が低下してしまいます。一度ページキャッシュへ書き込み、後からまとめてディスクへ反映することで、効率的な書き込み処理を実現しています。

Dirty Pageの動作は、次のような流れになります。

  1. アプリケーションがファイルへ書き込む
  2. データがページキャッシュへ保存される
  3. ページはDirty Pageになる
  4. 後からWritebackによってディスクへ書き戻される

Dirty Pageは、そのままメモリ上へ保持されるわけではありません。Linuxカーネルは定期的にWritebackを実行し、Dirty Pageをディスクへ書き戻します。

Writebackとは、Dirty Pageをディスクへ反映する処理です。書き戻しが完了すると、ページはDirty PageではなくClean Pageとなり、ページキャッシュ内へ保持され続けます。

LinuxカーネルはバックグラウンドでWritebackを実行し、Dirty Pageを少しずつディスクへ書き戻します。

この処理はバックグラウンドで自動的に実行されるため、通常はアプリケーションがWritebackを意識する必要はありません。

Dirty PageとClean Pageの違いをまとめると、以下のようになります。

ページ状態
Clean Pageディスクと内容が一致しているページ
Dirty Pageメモリ上で更新されたが、まだディスクへ反映されていないページ

Dirty Pageが一時的に増えること自体は正常な動作です。しかし、Dirty Pageが長時間減少しない場合は、Writebackが追いついていない可能性があります。そのような場合は、ディスク性能の低下やディスクI/Oの輻輳などが発生していないか確認するとよいでしょう。

Linuxでは、このようにページキャッシュ、Dirty Page、Writebackを組み合わせることで、ディスクI/Oを削減しながら、高いファイルアクセス性能を実現しています。

ページキャッシュの確認方法

Linuxでは、ページキャッシュの利用状況をさまざまなコマンドで確認できます。障害調査では、「ページキャッシュがどの程度利用されているか」「Dirty Pageが増えていないか」などを確認することが重要です。

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

freeコマンド

最も手軽にページキャッシュの利用状況を確認できるのがfreeコマンドです。

[root@almalinux ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           3.6Gi       1.6Gi       2.0Gi       104Mi       285Mi       2.0Gi
Swap:             0B          0B          0B
[root@almalinux ~]#

ここで注目すべき項目は、buff/cacheです。

項目内容
usedアプリケーションが使用しているメモリ
free未使用のメモリ
buff/cacheバッファキャッシュ・ページキャッシュとして利用されているメモリ
available新たなアプリケーションが利用可能なメモリ

Linuxでは空きメモリを積極的にページキャッシュへ利用するため、freeが少なくてもavailableが十分にあれば、通常はメモリ不足ではありません。

/proc/meminfo

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

[root@almalinux ~]# cat /proc/meminfo
MemTotal:        3742864 kB
MemFree:         2113544 kB
MemAvailable:    2088244 kB
Buffers:           13576 kB
Cached:           261124 kB
SwapCached:            0 kB
~~
Dirty:              3488 kB
Writeback:             0 kB
AnonPages:       1168880 kB
Mapped:           145220 kB
Shmem:            107052 kB
KReclaimable:      20884 kB
Slab:              66708 kB
SReclaimable:      20884 kB
SUnreclaim:        45824 kB
KernelStack:        7192 kB
PageTables:         9008 kB
[root@almalinux ~]#

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

項目内容
Cachedページキャッシュとして利用されているメモリ
DirtyDirty Pageの容量
Writeback書き戻し中のDirty Page
Buffersブロックデバイスのバッファ
MemAvailable実際に利用可能なメモリ

例えば、ページキャッシュとDirty Pageだけを確認したい場合は、次のように実行します。

[root@almalinux ~]# grep -E 'Dirty|Writeback' /proc/meminfo
Dirty:            179100 kB
Writeback:           100 kB
WritebackTmp:          0 kB

この例では、約175MBのDirty Pageが存在していますが、実際にディスクへ書き戻し中(Writeback)のデータは100KBだけです。LinuxはDirty Pageを一度にすべて書き戻すのではなく、バックグラウンドで少しずつWritebackを実行するため、このような値になることがあります。

vmstatコマンド

ページキャッシュの解放やSwapの発生状況は、vmstatでも確認できます。

以下の通り、1秒おきに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      0 1428580  10652 983968    0    0     5    20    0    0  0  0 99  0  0
 1  0      0 1084148  10664 1327648    0    0     0 294912 2431 1335  1 31 68  0  0
 1  0      0 607424  10692 1801728    0    0     8 516760 2707 1538  1 31 66  1  0
 1  0      0 237556  10700 2170156    0    0     0 368640 2346 1374  1 30 70  0  0
 2  0      0 116188  10252 2312000    0    0     0 647168 3004 1566  1 38 60  2  0
 1  0      0 136536  10284 2291936    0    0     4 814436 3758 1708  0 48 51  1  0
 6  0      0 120328  10300 2322024    0    0     0 569516 3018 1509  0 37 40 23  0
 0  0      0 136844  10324 2307372    0    0     8 438276 2200 1448  1 18 55 26  0

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

項目確認ポイント今回の結果
free空きメモリ。ページキャッシュとして利用されるため減少することがある約1.4GB → 約116MBまで減少
cacheページキャッシュの使用量約984MB → 約2.3GBまで増加
siSwap In(SwapからRAMへの読み込み)0(発生なし)
soSwap Out(RAMからSwapへの退避)0(発生なし)
boディスクへ書き込まれたブロック数(Writebackの目安)最大814436まで増加
waCPUのI/O待ち時間最大26%まで増加

障害調査での着眼点

ページキャッシュを確認する際は、次の点を意識すると原因の切り分けがしやすくなります。

確認ポイント考えられる状況
Cachedが大きいページキャッシュが積極的に利用されている(正常な場合が多い)
Dirtyが一時的に増える書き込み処理が発生している(正常な動作)
Dirtyが長時間減らないWritebackが追いついていない可能性
Writebackが高い状態が続くディスクI/Oがボトルネックになっている可能性
si・soが継続的に増えるSwapが頻繁に発生し、物理メモリ不足の可能性

ページキャッシュはLinuxが性能向上のために積極的に活用している仕組みです。そのため、「ページキャッシュが多い=問題」ではありません。重要なのは、Dirty PageやWritebackの状況、ディスクI/OやSwapの発生状況をあわせて確認し、システム全体の状態を判断することです。

まとめ

Linuxでは、空きメモリをページキャッシュとして積極的に利用することで、ディスクアクセスを高速化しています。また、書き込み時には一度Dirty Pageとしてメモリへ保持し、Writebackによって後からまとめてディスクへ反映することで、ディスクI/Oを効率化しています。

それぞれの役割を整理すると、以下のようになります。

仕組み役割
Page Cacheファイルデータをキャッシュし、ディスクアクセスを高速化する
Dirty Page変更済みだが、まだディスクへ反映されていないページ
WritebackDirty Pageをディスクへ書き戻す処理
Swap使用頻度の低い匿名ページをディスクへ退避し、物理メモリを確保する

また、障害調査では、free、/proc/meminfo、vmstatなどを利用することで、ページキャッシュやDirty Page、Writebackの状況を確認できます。これらの情報を正しく読み取ることで、メモリ不足やディスクI/Oに関する問題を効率よく切り分けられるようになります。

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

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

コメント