ablog

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

Solaris の空きメモリの見方について

Solaris の sar -r や vmstat ってダーティーじゃないページキャッシュを空きとして表示してくれているのかな?
ダーティーじゃなくなったページは Page cache から Free (cachelist) に回されると思うけど、都度やっているか、一括でやってるかで話が変わるな。都度やってくれているなら常に正確な空き容量がわかるけど、定期的もしくは何らかのきかけで一括でやっていたら、Page cache にダーティーじゃないページも含まれることになるな。

free は空きメモリのサイズ (Kilo-Bytes) です。この値が小さくなったらメモリが圧迫されている状態です。UFS のキャッシュは free から取られますが、その場合は free の値は減りません。一方、ZFS のキャッシュは free の値を減らすので、使用しているファイルシステムによって注意して読む必要があります。メモリの統計情報は "echo '::memstat' | mdb -k" でも取得する事が可能です。

free の値は kstat の unix:0:vminfo:freemem をページサイズ単位から KB 単位に直した数値です。"kstat -p 'unix:0:vminfo:freemem' 1" を実行すると同じ値を取得する事が可能です。kstat コマンドの結果は累積値で出ますので差分を取って、その値にページサイズを掛けて 1024 で割って下さい。ページサイズは pagesize コマンドで取得出来ます。

kstat の unix:0:vminfo:freemem は /usr/src/uts/common/os/clock.c 内で freemem の値が代入されています。freemem は /usr/src/uts/common/vm/vm_page.c 等で更新されています。

vmstat コマンドの読み方 | Oracle やっぱり Sun がスキ! Blog

と書かれているので、UFS のページキャッシュは free として表示してくれるようだ。確かに、ZFS では free の値減ってたな。UFS でも、read の場合は free が減らないけど、write の場合は減って、Page cache に計上されるのではとか妄想中。

  • echo "::memstat"|mdb -k で空きメモリを見る
# echo "::memstat"|mdb -k

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      65170               509    6%
Anon                       528459              4128   51%
Exec and libs               46929               366    4%
Page cache                  99184               774    9%
Free (cachelist)           139511              1089   13%
Free (freelist)            165497              1292   16%

Total                     1044750              8162
Physical                  1025739              8013

空きは 2381MB ← 1089MB(Free (cachelist)) + 1292MB(Free (freelist))

  • sar -r で空きメモリを見る
$ pagesize
8192
$ sar -r 5 3

01:21:38 freemem freeswap
01:21:43  289051 20339536
01:21:48  289051 20339536
01:21:53  288921 20337370

Average   289008 20338814

空きは 1920MB ← 289051(ページ数) * 8192(pagesize) / 1024 / 1024

  • vmstat で空きメモリを見る
$ vmstat 5 3
 kthr      memory            page            disk          faults      cpu
 r b w   swap  free  re  mf pi po fr de sr s1 s2 s3 s4   in   sy   cs us sy id
 0 0 0 11280400 3719424 213 940 3 0 0 0  0  0  1 -75 -75 1338 19225 2340 4 4 92
 0 0 0 10170152 2312712 138 679 0 0 0 0  0  0  0  0  0 1405 2872 2392  3  3 94
 0 0 0 10166912 2309824 309 1553 0 0 0 0 0  0  1  0  0 1582 43977 2923 6  8 86

空きは 2258MB ← 2312712(KB) / 1024

環境

# uname -r
5.10


追記(2014/09/30):
memstat の各カテゴリの意味が説明されているブログを発見。例えば、stack、heap、共有メモリなどは Anon に含まれる。

The categories are described as follows:

Kernel

The total memory used for nonpageable kernel allocations. This is how much memory the kernel is using, excluding anonymous memory used for ancillaries (see Anon).

Anon

The amount of anonymous memory. This includes user process heap, stack and copy-on-write pages, shared memory mappings, and small kernel ancillaries, such as lwp thread stacks, present on behalf of user processes.

Exec and libs

The amount of memory used for mapped files interpreted as binaries or libraries. This is typically the sum of memory used for user binaries and shared libraries. Technically, this memory is part of the page cache, but it is page cache tagged as “executable” when a file is mapped with PROT_EXEC and file permissions include execute permission.

Page cache

The amount of unmapped page cache, that is, page cache not on the cachelist. This category includes the segmap portion of the page cache, and any memory mapped files. If the applications on the system are solely using a read/write path, then we would expect the size of this bucket not to exceed segmap_percent (defaults to 12% of physical memory size). Files in /tmp are also included in this category.

Free (cachelist)

The amount of page cache on the freelist. The freelist contains unmapped file pages and is typically where the majority of the file system cache resides. Expect to see a large cachelist on a system that has large file sets and sufficient memory for file caching.

Free (freelist)

The amount of memory that is actually free. This is memory that has no association with any file or process.

https://blogs.oracle.com/rmc/entry/the_vm_system_formally_known