おそらくはそれさえも平凡な日々

Macのメモリ利用状況をコマンドラインから取得する(2015年 Yosemite版)

余り新しい情報がなかったようだったので調べてみた。正確じゃないところもあるかと思うので識者の指摘もお待ちしています。

Macにはアクティビティモニタっていうのがあって色々なリソースを見ることができる。メモリタブからメモリの状況も見ることができる。これは結構コロコロデザインや表示している値が変わっているようなのだが、手元のYosemite 10.10.3だとこんな具合である。

これらの値がどうやって算出されているかが知りたいし、コマンドラインから取得したい。つまりmackerel-agentで使いたい。

OSXではメモリに関する値はvm_statを使うと取得できる。だいたいこんな感じの出力が得られる。これらの数値に4096を乗じるとbyte数になる。

% vm_stat
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                               40002.
Pages active:                            683617.
Pages inactive:                          493217.
Pages speculative:                        10068.
Pages throttled:                              0.
Pages wired down:                        456039.
Pages purgeable:                          48961.
"Translation faults":                 278857338.
Pages copy-on-write:                   36020071.
Pages zero filled:                    134390345.
Pages reactivated:                      5391312.
Pages purged:                           8146232.
File-backed pages:                       202097.
Anonymous pages:                         984805.
Pages stored in compressor:             1231270.
Pages occupied by compressor:            413708.
Decompressions:                         7813542.
Compressions:                           9714425.
Pageins:                               19602535.
Pageouts:                                520882.
Swapins:                                4023560.
Swapouts:                               4356161.

何がused(使用済みメモリ)か?

まず、何がusedなのかという話だが、wiredとactiveとinactiveとspeculativeを足した値がusedになるという記述が散見されるが、これは以前はそうだったようだが現状では以下の2点により正確ではない。

  • Mavericksから入った圧縮メモリの領域がある
  • 現状はキャッシュの領域はusedには含まれない(以前はusedに含まれてアクティビティモニタに出力されていた)

圧縮メモリの容量は、"occupied by compressor"というものがそれのようである。なので、wired, active, inactive, speculative, occupied by compressorの合計がcachedを含んだusedなメモリの合計になる。

ちなみに上の画像内の「確保されているメモリ」がwiredで「圧縮」が"occupied by compressor"である。

ここからcached分を減じたものが、アクティビティモニタに出ているusedの値になる。

何がcached(キャッシュ)か?

これは実は正確なソースが見つけられなかったのでかなり勘なのだが、"Pages purgeable"と"File-backed pages"の合計がcachedとして表示されているのではないかと推測している。

これが「キャッシュ」の部分に表示されている値になる。

何がtotal(物理メモリ)か?

ここまで出てきたusedとcachedとfreeを足し合わせると物理メモリ総量になるが微妙に誤差が出る。既知の問題のようである。

Why does free + active + inactive + speculative + wired not equal total RAM?

ちなみに、本当に正確な物理メモリの総量を知りたい場合はsysctl hw.memsizeをたたけば良い。

swap

vm_statではスワップの値は取れないようなのでどうやって取るんだろうなーとか思ってたたら、sysctl vm.swapusageでパツイチであった。これは@aereal++に教えてもらった。

mackerel-agentでの対応

ということで、mackerel-agentにもMacのメモリ取得の機能を入れてp-rにしてある。問題なさそうだったらこのまま入る予定。

https://github.com/mackerelio/mackerel-agent/pull/84

ちなみに、"Pages throttled"が何なのかよく分かってない…。

参考

created at
last modified at

2019-06-01T18:57:39+0900

comments powered by Disqus