メモリの管理について
MMU
MMU(Memory Managemant Unit)とは、ハードウェアベースのメモリ管理ユニットです。 物理メモリと仮想メモリとのマッピングは、CPUに組み込めれているMMUで行われます。
TLM(Translation Lookaside Buffer)と呼ばれるバッファメモリもMMUの中にあります。 高速化のためのキャッシュとして活用されています。
スワップ
よくスワップという言葉を聞きますが、よく理解している人はどれくらいいるでしょう? 前のブログ「OS上のプロセスについて」でやったプロセスというものがあります。
プロセスはメモリが割当されないといけません。 まず仮想メモリの中から連続したメージ領域を確保しようとしますが、その仮想メモリと対応した物理メモリが確保できない場合があります。 スワップ(swap)とは、この時物理空間上の既に割り当てられているデータの一部をスワップ領域に追い出して場所を確保することです。 (※スワップアウト) 逆に、追い出したデータが必要になる場合ももちろんあります。 このデータが戻されることをスワップインといいます。
ページング
スワップの説明にでてきたページ領域ですが、この領域とは、 ページと呼ばれる固定サイズでメモリ空間を分割する単位のことです。
ハードディスクと物理メモリ間のページの出し入れをページングといいます。
一般的なページのサイズは、4KBでしょう。
NUMA
NUMA(Non-Uniform Memory Access)とは、非対称メモリアクセスのことです。
それはなんだというかんじです。
さきほど出てきたMMUがありましたね。 CPUに組み込まれたMMUは、サーバ上の全ての物理メモリにアクセスできます。 しかし、同一NUMAノード内の物理メモリには高速でアクセスできますが、 異なったNUMAノードにある物理メモリには低速になってしまう。
ということです。
もちろんPCの設計上、できるだけ同じNUMAノード内で処理されるようになっていますが、 大きなメモリを消費する場合は別のNUMAノードを使用せざるをえないです。
このNUMAですが、もう1つ覚えておきたいことがあります。
それは仮想サーバ
をさわるときです。
よくGUIで「仮想ソケット数×ソケットあたりのコア数」なんか設定するかと思います。 わたしも特に気にすることなく、デフォで設定してたりしますが、 仮に設定値を、2×4とか1×8とかに設定してなんの違いが?と思ったりします。
これはNUMAの概念をおさえておけば、わかることです。 よく仮想サーバのドキュメントを読むことをおすすめします。 どれもパフォーマンスに違いがあることを忘れないようにしましょう。