ディスクキャッシュとは、ディスク(HDDやSSD)の読み書きを速くするために、よく使うデータを高速なメモリ側に一時的に保持しておく仕組みです。「データをディスクに貯める仕組み」と誤解されがちですが、実際は逆で、遅いディスクへのアクセス回数を減らすためにRAMなどへ写しを置く技術です。この記事では、ディスクキャッシュの仕組み、メモリキャッシュやキャッシュメモリ(CPU内部のL1〜L3)との違い、書き込みキャッシュで起きるデータ消失の危険、ブラウザの「from disk cache」表示の意味、そしてLinuxとWindowsでの確認方法を、そのまま実行できるコマンド例つきで整理します。
メモリが逼迫したときの退避そのものの仕組みと、スラッシングかどうかの判定手順はスワッピングとは?ページングとの違いとスラッシングの判定手順で扱っています。
まとめ:ディスクキャッシュは遅いディスクの読み書きをRAMで肩代わりする仕組み
結論を先に示します。ディスクキャッシュは「遅いディスクを速いメモリで肩代わりする」仕組みで、OSが自動で管理するため、普段は意識も操作も要りません。
- 定義:ディスクのデータを、より速いメモリ(OSのページキャッシュ=RAM、またはドライブ内蔵のバッファ)に一時保持し、ディスクI/Oを減らす仕組み。
- メモリキャッシュとの違い:メモリキャッシュは計算・アプリのデータをRAMに置く仕組み全般、ディスクキャッシュはディスクI/O削減が目的。重なる部分もあるが狙いが違う。
- 書き込みの注意:書き込みもいったんRAMに溜めてから後でディスクへ書き戻す(ライトバック)。電源断で消える範囲があるため、確実に残したいデータはfsyncなどで明示的に書き出す。
- Linuxでの確認:
free -hのbuff/cacheがページキャッシュ。メモリが足りるかはavailable列で判断する。 - Windowsでの確認:タスクマネージャーの「キャッシュ済み」がファイルキャッシュを含む待機中メモリ。
- ブラウザの「from disk cache」:再訪時にディスク上の保存物から読み込んだ印で、異常ではない。
ディスクキャッシュとは|ディスクI/Oを減らすページキャッシュとドライブ内蔵バッファ
ディスクキャッシュ(disk cache)とは、ディスクから読み込んだデータや、これから書き込むデータを、より高速なメモリ側に一時的に保持しておく仕組みです。目的はただ一つ、遅いディスクへのアクセス回数を減らすことです。実体は主に2種類あり、OSが管理する「ページキャッシュ」と、HDDやSSD自体が内蔵する小容量のバッファに分かれます。どちらも「ディスクの内容を、ディスクより速い場所に置く」点で共通しています。
OSのページキャッシュが一度読んだファイルをRAMに残す読み込みの流れ
アプリがファイルを読むと、OSのカーネルはディスクから読んだ内容をページ(多くの環境で4KB単位)としてRAMに置き、その写しをアプリへ渡します。次に同じ箇所が読まれたとき、カーネルが返すのは、ディスクに触れずに取り出したRAM上のページです。これがページキャッシュで、Linuxでは空いているRAMのほぼすべてがこの用途に回ります。カーネルがメモリやI/Oをどう仲介しているかの全体像はカーネルとは?OSの中核が担う役割と仕組みで整理しています。
ここで誤解を正しておきます。ディスクキャッシュは「大量データをディスクに溜める」仕組みではありません。キャッシュの本体は速いメモリ側にあり、元データはディスクにあります。読み込み用のキャッシュが消えても(電源を切っても)、データ自体は失われません。ディスクキャッシュは保存ではなく高速化の技術だ、と押さえると以降が理解しやすくなります。
HDDやSSDが内蔵するDRAMバッファとOSのキャッシュが分担する範囲
もう一つの実体は、HDDやSSDのコントローラが持つDRAMバッファです。ドライブはこの領域で細かい書き込みをまとめ、読み出しを先回りして、物理アクセスの回数と順序を整えます。OSのページキャッシュがファイル単位の高速化を、ドライブ内蔵バッファがドライブ内部の効率化を受け持つ分担です。容量はファームウェアが管理するため変えられませんが、書き込みキャッシュの有効・無効はOSから切り替えられる場合があります。ドライブの種類やHDDとSSDの違いはストレージとは?種類・HDDとSSDの違いで、性能を数字で比べる指標はIOPSとは?計算式とスループット・レイテンシの違いで解説しています。
メモリキャッシュとディスクキャッシュの違い|目的・対象・消えたときの影響で区別
検索で最も多いのが、メモリキャッシュとの違いです。両方ともデータをRAMに置く点が似ているため混同されますが、目的と対象が異なります。
| 観点 | メモリキャッシュ | ディスクキャッシュ |
|---|---|---|
| 主な目的 | データを高速供給 | ディスクI/Oの削減 |
| 代表例 | CPUキャッシュ・Redis | ページキャッシュ |
| 保存先 | RAM | RAM/ドライブ内DRAM |
| 元データの所在 | 計算結果やDBなど | 必ずディスク上 |
| 管理する主体 | アプリ・CPU | OS・ドライブ |
| 消えたとき | 再生成が必要な場合も | ディスクから読み直す |
メモリキャッシュは「速いデータ供給そのもの」を指す広い言葉で、ディスクキャッシュは「ディスクアクセスを減らす具体的な仕組み」です。ディスクキャッシュはOSが自動で効かせ、Redisのようなアプリ用キャッシュは何を置くかをアプリ側で設計します。ページキャッシュだけでは足りないなら、インメモリストアを足すのが次の手です。製品の選び方はValkeyとは?Redisとの違い・導入手順、サーバーレスで使う場合はUpstashとは?サーバーレスRedisの料金・無料枠と使い方、AWSのマネージド版はAmazon ElastiCacheとは?対応エンジンと料金・採用判断で比較できます。
キャッシュの階層|レジスタ・キャッシュメモリ・主記憶・ディスクの速度差と位置づけ
ディスクキャッシュの位置づけは、コンピュータの「記憶階層」で見ると分かりやすくなります。CPUに近いほど高速・小容量・高価で、遠いほど低速・大容量・安価です。代表的な速度と容量の目安を示します(製品世代で変わるため桁の目安として読んでください)。
| 階層 | 速度の目安 | 容量の目安 | 揮発性 |
|---|---|---|---|
| レジスタ | 1ナノ秒未満 | 数KB | 揮発 |
| キャッシュメモリ | 数ナノ秒 | 数MB | 揮発 |
| 主記憶(RAM) | 数十ナノ秒 | 数GB〜 | 揮発 |
| ページキャッシュ | RAM相当 | 空きRAMに依存 | 揮発 |
| ディスク | 数十μ秒〜数ミリ秒 | 数百GB〜 | 不揮発 |
「レジスタ」や「キャッシュメモリ(L1〜L3)」はCPU内部の超高速メモリで、名前が似ていてもディスクキャッシュとは別物です。置かれるのが「CPUが計算に使うデータ」か「ディスクの内容」かで区別します。NVMe SSDでも読み出しの応答は数十マイクロ秒、HDDは数ミリ秒かかり、RAMの数十ナノ秒とは千倍から十万倍の開きがあります。この速度差こそ、キャッシュが効く根本理由です。
書き込みキャッシュの仕組み|ライトバックとライトスルーの違いと停電時のリスク
ディスクキャッシュは書き込みにも働き、その書き込み方式は次の2種類です。ライトバック(write-back)は書き込みをキャッシュに受け取った時点で「完了」を返し、ディスクへは後でまとめて書き戻します。ライトスルー(write-through)はディスクへの書き込みが済んでから完了を返します。
OSの既定はライトバックです。速い代わりに、書き戻し前の電源断やカーネルのクラッシュで、直近の書き込みが失われる余地があります。読み込み用と違い、書き込み用キャッシュは消えるとデータが失われ得る。ここが見落とされやすい落とし穴で、データベースがfsyncを呼んでからコミット完了を返すのはこの穴をふさぐためです。
Linuxのダーティページが書き戻されるまでの流れとvm.dirty系パラメータの確認
Linuxでは、書き込まれたがまだディスクに反映されていないページを「ダーティページ」と呼びます。カーネル公式ドキュメントのsysctl/vmによると、カーネルのフラッシャースレッドが dirty_writeback_centisecs の間隔(100分の1秒単位)で起き、dirty_expire_centisecs より長くダーティのままのデータを書き出します。ダーティの量が dirty_background_ratio を超えるとバックグラウンドでの書き戻しが始まり、dirty_ratio に達した時点では、書き込んだプロセス自身が書き戻しを担う仕組みです。手元の値と、いまのダーティ量は次のコマンドで確かめられます。
# 書き戻しのしきい値と間隔(ディストリビューションごとに既定値が違うため実機で確認する)
sysctl vm.dirty_background_ratio vm.dirty_ratio vm.dirty_expire_centisecs vm.dirty_writeback_centisecs
# いまディスクへの書き戻しを待っている量(Dirty)と書き戻し中の量(Writeback)
grep -E '^(Dirty|Writeback):' /proc/meminfo
# 大きなファイルを書いた直後にDirtyが増え、syncの後に減ることを観察する
dd if=/dev/zero of=/tmp/dirtytest.bin bs=1M count=512 status=none
grep -E '^(Dirty|Writeback):' /proc/meminfo
sync
grep -E '^(Dirty|Writeback):' /proc/meminfo
rm /tmp/dirtytest.bin
アプリが「このデータは確実に残したい」場合は、fsync(2)のマニュアルにあるとおり fsync() か fdatasync() を呼びます。fsync() はファイルの変更をストレージデバイスへ送り、ドライブにディスクキャッシュがあればその書き出しも含めて、デバイスが完了を報告するまで待ちます。すべての書き込みで呼ぶと遅くなるため、呼び出す対象はログやトランザクションの確定に絞る方針です。
WindowsのレイジーライターとFILE_FLAG_WRITE_THROUGHの動作差
Windowsも既定はライトバックです。MicrosoftのFile Cachingの説明では、キャッシュマネージャーが毎秒「レイジーライター」を起動し、最近書き出されていないページの8分の1をディスクへの書き込み待ちに積む、と書かれています。即時にディスクへ書きたいアプリは、CreateFileに FILE_FLAG_WRITE_THROUGH を渡してライトスルーにするか、FlushFileBuffers を呼んで明示的に書き出します。FILE_FLAG_NO_BUFFERING を渡せばキャッシュを通さずに読み書きできます(メタデータはキャッシュされます)。
ドライブ内蔵の書き込みキャッシュは、デバイスマネージャーのディスクのプロパティにある「ポリシー」タブで有効・無効を切り替えられます。UPSのないサーバーで停電時の消失を避けたい場合は無効化を検討し、性能が落ちる分はRAID構成やコントローラ側の電池付きキャッシュで補うのが定石です。冗長化の考え方はRAIDとは?RAID0/1/5/6/10の違いと構成で整理しています。
Linuxのキャッシュ確認|free・meminfo・fincoreの操作と読み方
Linuxでは、ページキャッシュの量を free で、内訳を /proc/meminfo で、ファイル単位のキャッシュ状況を fincore で確認できます。順に見ていくと、メモリ不足なのか、単にキャッシュが育っているだけなのかを切り分けられます。
free -hのbuff/cacheとavailableによるメモリ不足の判定手順
free(1)のマニュアルによると、buff/cache列はカーネルのバッファ(Buffers)と、ページキャッシュおよび回収可能なスラブ(Cached と SReclaimable)の合計です。available列は、スワップを使わずに新しいアプリへ回せるメモリの見積もりで、ページキャッシュのうち回収できる分も勘定に入っています。
$ free -h
total used free shared buff/cache available
Mem: 7.8Gi 2.1Gi 1.0Gi 0.2Gi 4.7Gi 5.3Gi
Swap: 2.0Gi 0B 2.0Gi
# 内訳を見る(Cachedがページキャッシュ、MemAvailableがfreeのavailableに相当)
$ grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SReclaimable):' /proc/meminfo
この例では free が1.0GiBしかありませんが、available は5.3GiBあります。buff/cacheの4.7GiBの大半は、アプリがメモリを要求すれば即座に解放されるためです。判定の基準は free ではなく available です。available が搭載量の1割を切り、さらにスワップの使用量が増え続けているときに初めてメモリ不足を疑います。その先の確認はLinuxのスワップ領域(swap)とは|確認・推奨サイズ・vm.swappinessの設定の手順につながります。meminfoの各項目の意味を一覧で確認できるのは、カーネル公式ドキュメントの/procの説明です。
fincoreとdrop_cachesで1回目と2回目の読み込み時間の差を測る検証手順
ディスクキャッシュが効いている様子は、同じファイルを2回読むと数字で確かめられます。fincore(1)はutil-linuxに含まれ、ファイルの内容のうち何ページがメモリ上にあるかを数えるためのコマンドです。キャッシュの解放にはsysctl/vmの drop_cachesを使います。1でページキャッシュ、2で回収可能なスラブ(dentryやinode)、3で両方を解放し、ダーティなものは解放しない非破壊の操作です。先に sync を実行すると解放できる量が増えます。検証用のサーバーで次の順に実行してください。
# 1GBの検証用ファイルを作る
dd if=/dev/urandom of=/tmp/cachetest.bin bs=1M count=1024 status=none
# キャッシュを空にしてから、メモリ上にあるページ数を確認(RESが0に近い)
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
fincore /tmp/cachetest.bin
# 1回目:ディスクから読む
time cat /tmp/cachetest.bin > /dev/null
# 読んだ後はファイル全体がメモリ上に載る(RESが1Gに近づく)
fincore /tmp/cachetest.bin
# 2回目:ページキャッシュから読むため、realの時間が大きく縮む
time cat /tmp/cachetest.bin > /dev/null
rm /tmp/cachetest.bin
1回目と2回目の real の差が、そのサーバーにおけるディスクキャッシュの効き目です。差はHDDやネットワーク越しのブロックストレージほど開きます。ディスク自体の性能を測るベンチマークでは、毎回 drop_caches で空にしないとRAMの速度を測ることになります。
Windowsでディスクキャッシュを確認するタスクマネージャーとPowerShellの手順
手軽に見るならタスクマネージャーの「パフォーマンス」タブで「メモリ」を選び、「キャッシュ済み」の値を確認します。ファイルキャッシュを含む待機中のメモリで、Linuxのbuff/cacheと同じく、アプリが必要とすれば明け渡される領域です。記録や監視に組み込むなら、PowerShellでパフォーマンスカウンタを読みます。次のプロパティ名は日本語版のWindowsでもそのまま使えます。
# システムのファイルキャッシュ(CacheBytes)、待機リスト、書き戻し待ち(ModifiedPageListBytes)をMB単位で表示
Get-CimInstance Win32_PerfFormattedData_PerfOS_Memory |
Select-Object @{n='CacheMB';e={[math]::Round($_.CacheBytes/1MB)}},
@{n='StandbyNormalMB';e={[math]::Round($_.StandbyCacheNormalPriorityBytes/1MB)}},
@{n='ModifiedMB';e={[math]::Round($_.ModifiedPageListBytes/1MB)}},
AvailableMBytes
ModifiedPageListBytes は、変更済みでディスクへの書き戻しを待っているページの量で、Linuxの Dirty に近い位置づけです。どのファイルがキャッシュに載っているかまで知りたい場合は、SysinternalsのRAMMap(2026年3月公開のv1.63時点)が使えます。物理メモリの内訳をファイル単位で表示できます。
from disk cacheの意味とブラウザのCache-Controlによる制御
WebブラウザもOSとは別に、自前のディスクキャッシュとメモリキャッシュを持っています。「memory cache」はブラウザのプロセスがRAM上に持つコピーで、速い代わりにブラウザを閉じると消える仕組みです。「disk cache」はディスクに永続化されたコピーで、再起動後の再訪でも使われます。どちらから読むかはブラウザが判断し、保存の可否と期限はCache-Controlなどのヘッダに従います。
つまり「from disk cache」表示は、サーバーへ再リクエストせず表示できた効率の良い状態で、異常ではありません。最新内容を取り直したいときだけ、スーパーリロード(WindowsはCtrl+Shift+R、macOSはCommand+Shift+R)を使います。
Chrome開発者ツールのSize列で読み込み元を確かめてキャッシュを無効化する手順
Chromeでは、F12で開発者ツールを開き、Networkタブでページを再読み込みすると、Size列に読み込み元が表示されます。キャッシュから返ったリクエストには、転送サイズの代わりに「(memory cache)」や「(disk cache)」と出ます(版によって「from disk cache」と表記されます)。初訪問と同じ条件で確かめるなら、Chrome DevToolsのNetwork機能リファレンスのとおり「Disable cache」にチェックを入れます。リクエスト一覧の右クリックで「Clear browser cache」を選べば、保存済みのキャッシュも消せます。
サーバーのCache-Controlヘッダによる再訪時のディスクキャッシュ制御
ブラウザがどれだけキャッシュを使うかを決めるのは、サーバーが返すヘッダです。MDNのCache-Controlの説明のとおり、max-age で再利用してよい秒数を、no-cache で「使う前に毎回サーバーへ確認」を、no-store で「保存しない」を指示します。Cache-Controlが無い場合でも、ブラウザは最終更新日時などから推測して保存することがあり、MDNのHTTPキャッシュの解説で使われている、この動作の名称がヒューリスティックキャッシュです。自社サイトが何を返しているかは、次のコマンドで確認できます。
# レスポンスヘッダのうちキャッシュに関係する行だけを表示(URLは確認したいページに置き換える)
curl -sI https://example.com/ | grep -iE '^(cache-control|expires|etag|last-modified|age):'
更新しても古い表示が残る原因の多くは、HTMLに長い max-age が付いているか、CDNが古い版を返しているかです。CDNでの制御はCDNとは?仕組み・キャッシュ制御からサービスの選び方で、古いキャッシュを返しながら裏で更新する設定はstale-while-revalidateとは?Cache-ControlとSWRの再検証で解説しています。
ディスクキャッシュを消すべき場面と消さない判断|メモリ不足との見分け方
結論から言い切ります。OSのディスクキャッシュは、通常運用では消しません。キャッシュが大きいのはRAMを遊ばせずに使えている証拠で、消して得られるのは空きメモリの数字が増えて見えることだけです。直後のアクセスはすべてディスクに行き、一時的に遅くなります。
手動で消してよいのは、ディスク性能のベンチマーク、fincoreの手順のような効き目の検証、そしてブラウザに古い表示が残るとき(OSではなくブラウザのキャッシュを消す)の3場面に限られます。
本当のメモリ不足のサインは別にあります。Linuxなら available が搭載量の1割を下回り、スワップ使用量が増え続け、vmstat の si/so 列(スワップイン・アウト)が常に動いている状態です。足りないのはキャッシュの掃除ではなく、メモリの増設か、メモリを食うプロセスの見直しです。クラウドなら、メモリの多いインスタンスタイプへの変更や、DBの読み込みをElastiCacheなどへ逃がす構成変更が選択肢になります。
サーバーのメモリ量とストレージ性能の見積もり、キャッシュ層を含めたクラウド基盤の構成を自社だけで決めきれない場合は、インフラ構築(AWS・Google Cloud・Azure)のサービスで、既存環境の計測からサイジングまで相談を受けています。
よくある質問
ディスクキャッシュについて検索の多い質問に、本文の内容を踏まえて答えます。
ディスクキャッシュとは簡単に言うと何ですか?
ディスクの読み書きを速くするため、よく使うデータを高速なメモリ側に一時的に置いておく仕組みです。遅いディスクへのアクセス回数を減らすのが目的で、データを貯め込む仕組みではありません。読み込み用のキャッシュは元データがディスクに残るため、消えてもデータは失われません。ただし書き込み用のキャッシュは、ディスクへ書き戻す前に電源が切れると直近の書き込みが失われることがあります。
メモリキャッシュとディスクキャッシュの違いは何ですか?
メモリキャッシュはデータをRAMに置いて高速に供給する仕組み全般(CPUキャッシュやRedisなど)を指します。ディスクキャッシュはその中でも、ディスクの内容をRAMやドライブ内バッファに保持し、ディスクI/Oを減らすことに特化した仕組みです。どちらもRAMを使いますが、目的と対象、管理する主体(OSかアプリか)が異なります。
ブラウザの「from disk cache」とは何ですか?
再訪したページの一部を、サーバーに再リクエストせずディスク上の保存物から読み込んだことを示す表示です。ブラウザを閉じずに同じページを開き直した場合は、より速い「memory cache」が使われることが多く、ブラウザ再起動後の再訪では「disk cache」が使われます。いずれも正常な動作で、最新化したいときはスーパーリロードします。
ディスクキャッシュは消してもいいですか?
消すこと自体は可能ですが、通常運用では消す必要がありません。OSのページキャッシュは、アプリがメモリを必要とすれば自動で解放されます。Linuxの drop_caches はダーティなデータを解放しない非破壊の操作なので、実行してもデータは壊れません。その代わり、直後のアクセスがすべてディスクに行くため一時的に遅くなります。手動の解放はベンチマークや効き目の検証に限ってください。
ディスクキャッシュの確認方法をLinuxとWindowsで教えてください
Linuxでは free -h のbuff/cache列がページキャッシュの量で、メモリが足りるかはavailable列で判断します。ファイル単位でキャッシュに載っているかを確認するためのコマンドは fincore です。Windowsではタスクマネージャーの「パフォーマンス」→「メモリ」にある「キャッシュ済み」を見るか、PowerShellで Win32_PerfFormattedData_PerfOS_Memory の CacheBytes を読みます。ファイル単位の内訳はSysinternalsのRAMMapで表示できます。
関連記事
- スワッピングとは?ページングとの違いとスラッシングの判定手順を実装目線で解説
- Linuxのスワップ領域(swap)とは|確認・推奨サイズ・vm.swappinessの設定を実コマンドで解説
- カーネルとは?OSの中核が担う役割と仕組みを実装目線で解説【2026年版】
- IOPSとは?計算式とスループット・レイテンシの違い、SSD/クラウドの性能設計を実装目線で解説【2026年版】
- CDNとは?仕組み・キャッシュ制御からサービスの選び方まで実装目線で解説
- Valkeyとは?Redisとの違い・Streamsの使い方と導入手順【Valkey 9.1】
- Upstashとは?サーバーレスRedisの料金・無料枠と使い方【2026年9月】