Linuxのバッファキャッシュとページキャッシュの違いは?
Linuxが管理するキャッシュ領域には、バッファキャッシュとページキャッシュ領域があって、topコマンドや/proc/meminfoの「bufferes」「cached」という項目を見れば、現在のそれぞれのキャッシュ領域がどの程度なのかを確認することができる。
どちらも、ディスクの読み書きをキャッシュしてデータへのアクセスを高速化するという点では同じだが、それぞれがどのような意味で、どういう違いがあるのかについて、Quoraに分かりやすい解説があったので、翻訳してみた。
ページキャッシュは、ファイルI/Oを最適化するために、ファイルのページをキャッシュする。バッファキャッシュは、ブロックI/Oを最適化するために、ディスクブロックをキャッシュする。
Linuxカーネル2.4よりも前では、2つのキャッシュは明白に違うものだった。ファイルはページキャッシュに、ディスクブロックはバッファキャッシュに載せられていた。ほとんどのファイルがディスク上のファイルシステムによって扱われているとすると、データは2回、すなわち両方のキャッシュそれぞれに取り扱われる。多くのUnixシステムはこれと同じようなパターンを採用している。
これはシンプルな実装だが、明らかに洗練されていないし、非効率である。Linuxカーネル2.4からは、2つのキャッシュのコンテンツは統合された。VM(Virtual Memory)サブシステムがI/Oを司るようになり、それはページキャッシュからデータを取り出す。キャッシュされたデータがファイルとブロックの両方のかたちをとる(ほとんどのデータがそうだが)場合、バッファキャッシュは単純にページキャッシュを指し示す。つまり、データは1つだけがメモリにキャッシュされていることになる。ページキャッシュは、ディスクキャッシュのことを考えた通りのものだ。それは、後続のI/Oを高速化するために、ディスクからデータをキャッシュする。
バッファキャッシュはいまだに残っているが、それは、カーネルは現在もページ単位ではなくブロック単位のブロックI/Oを行う必要があるからだ。ほとんどのブロックはファイルデータのかたちを取っているため、バッファキャッシュの多くはページキャッシュと同等である。しかし、少量のブロックデータ、例えばメタデータやrawブロックI/Oなどは、ファイルを前提にしたものではなく、もっぱらバッファキャッシュによって取り扱われる。
現在のかたちに至った経緯まで含めて説明できるのは、経験豊かな人ならではというべきか。
Linuxカーネル Hacks ―パフォーマンス改善、開発効率向上、省電力化のためのテクニック 池田 宗広 大岩 尚宏 島本 裕志 竹部 晶雄 平松 雅巳 高橋 浩和 </p>
オライリージャパン 2011-07-26 Amazonで詳しく見る</font> by G-Tools</td> </tr> </table> |