「空きメモリ」が多いことは良いことではありません。OSは余ったメモリを ディスクの内容のキャッシュに使い回します——それこそが仕事です。 このマシンのいまの内訳をライブで見てください。
接続中…
Linuxは物理メモリを2の冪(4KB・8KB・16KB…)のブロックで管理しています (オーダー0〜10)。空きブロックがどのオーダーにどれだけあるかは、 メモリがどれだけ断片化しているかを表します。値は対数スケールです。
—
プログラムから見えるアドレス(仮想アドレス)は、実際のメモリの場所 (物理アドレス)とは違います。x86-64はこの変換を4段のページテーブルで 行います。48bitの仮想アドレスを入れて、各段のインデックスに 分解してみてください。
4段それぞれのテーブルを1回ずつ読むため、変換だけで最大4回のメモリアクセスが必要になります(実際はTLBというキャッシュで大半省略されます)。
1秒間、TypedArrayを可能な限りコピーし続けて実効帯域(GB/s)を測ります。
上の「メモリ帯域の実測」は1秒間だけ実行するベンチマークですが、こちらは
いまこの瞬間、このマシンのメモリコントローラを実際に流れているデータ量を
CPUの性能カウンタ(uncore_imc)から直接読み取ったものです。
このマシンにはメモリコントローラが1系統しかないため、DIMM1枚ごとの
内訳には分解できません——常に全チャンネル合計の値です。
使用率は、このCPU(i7-4770S)の公称最大メモリ帯域
(Intel ARK公表値、デュアルチャンネルDDR3-1600で25.6GB/s)を
100%とした理論値との比率で、実測の上限ではありません。
普段の使用率は数%程度しかなく線形の棒では見えづらいため、
下の棒グラフは対数スケールで描いています(数値そのものは
正確な線形%です)。
—
このマシンの主記憶はDDR3です。メモリチップは行(row)と列(column)の 格子でできていて、読み書きの前に該当する行を一度「開く」必要があります。 さらにDRAMは電荷でビットを覚えているため、放っておくと数十ミリ秒で 忘れてしまい、定期的な「リフレッシュ」(再書き込み)が必要です (SRAMでできたキャッシュにリフレッシュが要らないのはこのため)。
③キャッシュの間で見た「メインメモリは遠い」の 「メインメモリ」がここです。行列走査で見た通り、同じデータでも 読み方次第でこのメモリへの距離が何倍にも変わります。