ablog

不器用で落着きのない技術者のメモ

sar -r でメモリ使用状況を確認する

# sar -r
00:00:00    kbmemfree kbmemused  %memused kbmemshrd kbbuffers  kbcached kbswpfree kbswpused  %swpused
00:10:00       220216   3875156     94.62         0    289288   1707500   2024592     72536      3.46
00:20:00       215180   3880192     94.75         0    289312   1707672   2024592     72536      3.46
00:30:00       214552   3880820     94.76         0    289340   1707804   2024592     72536      3.46
  • kbmemfree: 物理メモリの空き容量
  • kbmemused: 使用中の物理メモリ量
  • %memused: 物理メモリ使用率
  • kbbuffers: カーネル内のバッファとして使用されている物理メモリの容量
  • kbcached: カーネル内のキャッシュ用メモリとして使用されている物理メモリの容量
  • kbswpfree: スワップ領域の空き容量
  • kbswpused: 使用中のスワップ領域の容量
  • %swpused: スワップ領域の使用率

→ 実質メモリ使用量 = kbmemused - ( kbbuffers + kbcached )

# free
             total       used       free     shared    buffers     cached
Mem:        315636      40112     275524          0       5636      19116
-/+ buffers/cache:      15360     300276
Swap:       650624          0     650624

free コマンドの場合、計算しなくても「-/+ buffers/cache:」に実質メモリ使用量を表示してくれる。
→「-/+ buffers/cache:」は「 used - ( buffers + cache ) 」って意味だろうな。

Linux のディスクキャッシュが「ページキャッシュ」と呼ばれるのは、キャッシュの単位がページだからです。ページというのは Linux仮想メモリの最小単位。つまり何かしらのデータがメモリに存在するとき、そのメモリ領域をカーネルが扱うときの最小単位です。ディスクの内容をキャッシュする場合、ファイルを丸ごとキャッシュしたりするのではなくiノード番号とファイルのオフセットをキーにしてページ単位でキャッシュします。
...
Linux はメモリに空きがある限りページキャッシュにキャッシュを蓄え続けます。他のアプリケーションでメモリが必要になるとページキャッシュは優先的に開放されます。

Linux のページキャッシュ - naoyaのはてなダイアリー

バッファキャッシュ(buffer cache)には、ブロックデバイスドライバが使用するデータバッファが含まれている。
[see: fs/buffer.c]
これらのバッファは固定サイズ(たとえば、512 バイト)で、ブロックデバイスから読み出されたか、そこに書き込まれた情報のブロックが入っている。ブロックデバイスとは、データアクセスの際に、固定サイズのブロック単位でのみ読み書きできるデバイスを指す。すべてのハードディスクはブロックデバイスである。

バッファキャッシュは、デバイス識別子と必要なブロック番号とでインデックス付けされていて、データブロックをすばやく見つけだすために使用されるものである。ブロックデバイスは、バッファキャッシュを経由しなければアクセスできない。データがバッファキャッシュに見つかれば、たとえばハードディスクのような物理ブロックデバイスから読み出す必要がなくなるので、アクセスがずっと高速になる。

http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-4.html

ページキャッシュ(page cache)は、ディスク上のイメージやデータへのアクセスを高速化するために使用される。
[see: mm/filemap.c]
これは、ページ単位でファイルの論理的な内容をキャッシュし、ファイル名とそのファイル内のオフセットを使ってアクセスされる。ページがディスクからメモリに読み出されると、それらはページキャッシュにキャッシュされる。

http://www.linux.or.jp/JF/JFdocs/The-Linux-Kernel-4.html


追記(2010/06/13):
結構、妄想入っているまとめ。Linuxカーネル2.6の場合のはなし。


ページキャッシュはファイルのキャッシュ。バッファキャッシュはブロックのキャッシュ。スーパーブロック、inodeブロックなどのメタデータはバッファキャッシュに、ファイルそのもののデータはページキャッシュにキャッシュされる。バッファキャッシュはページキャッシュの一部として管理される。

  • ページキャッシュ
    • ファイルそのもののキャッシュ。
    • inode番号とファイルオフセットがインデックスに使われる。
    • get_page_cache_size()-total_swapcache_pages-i.bufferram
    • スワップキャッシュ、BufferはPageCacheとして実装されているのでその分を引いてある。
  • バッファキャッシュ
    • ディスクのブロックのキャッシュ。
    • スーパーブロック、inodeブロックなどのメタデータのキャッシュに使われる。
    • バッファキャッシュはページキャッシュの中のバッファページと呼ばれる専用ページに置かれる。
    • 各デバイスのbdev->bd_inode->i_mapping->nrpagesの総和から計算している。
    • BufferはPageCacheとして実装されており、PageCache割り当て時にbdev->bd_inode->i_mappingを指定している。


追記(2011/04/24):
会社にあった

Solarisインターナル―カーネル構造のすべて

Solarisインターナル―カーネル構造のすべて

をパラパラっと見ていたら、ページ・キャッシュの説明がとてもわかりやすかったのでメモ。
P.606

15.1.1 Solarisページ・キャッシュ
Solarisでは、ファイル・システム・データをキャッシュするためにページ・キャッシュという新しい手法を採用している。このページ・キャッシュは、SunOS 4 で一新された仮想メモリ・システムの一部として1985年にSunで開発され、System Vリリース4 UNIX でも採用された。現在では、LinuxWindows NTでもこの手法を採用している。
ページ・キャッシュには、従来のキャッシュと比べて2つの大きな違いがある。1つは、そのサイズを動的に変更でき、アプリケーションが使用していないすべてのメモリをキャッシュとして利用できる点である。もう一つは、ディスク・ブロックではなくファイル・ブロックをキャッシュしている点である。つまり、物理ブロックに対するキャッシュではなく、仮想ファイルに対するキャッシュなのである。この仮想ファイル・キャッシュによって、オペレーティング・システムはファイルとそのオフセットから簡単にファイル・データを取得することができる。これに対して従来のブロック・キャッシュの方法では、オペレーティング・システムは、まずファイルに対応した物理ディスク・ブロック番号を見つけ出す必要があり、それから物理ディスク・ブロック・キャッシュのデータを取得していた。これが、仮想ファイル・キャッシュの方が効率的に処理できる理由である。

P.610

ページ・キャッシュは、すべてのフリー・メモリをキャッシュして使用するため、本当の意味でのフリー・メモリのサイズや、ファイル・システム・キャッシュとして使用されているメモリのサイズを確認することは困難である。MemToolパッケージ(249ページの「ファイル・システム・キャッシュ・メモリ」を参照)を使用すると、ファイル・システム・キャッシュにどれだけのメモリが使用されているのか確認できる。