Fixed size block Allocator
Fixed size block Allocatorはメモリの割り当てを行うときに、自分が管理するブロックから割り当てをおこないます。1つのWorkspaceがもつ様々なサイズのFixed size block Allocatorは階層構造になっていて、管理するブロックに空きがない場合は階層構造上のより上位のFixed size block Allocatorからメモリを獲得します。そして獲得したメモリから割り当てをおこないます。
Fixed size block Allocatorは上位のblock Allocatorからメモリを獲得しますが、最上位のblock Allocatorはどこからメモリを獲得するのでしょうか。DenaliではSQL Server の仮想アドレス空間は、フラグメントマネージャによってフラグメントと呼ばれる予約領域として管理されています。フラグメントのサイズはアーキテクチャによって異なり、32bit が 4MB 、64bitでは通常 1 つのフラグメントで仮想アドレス空間全体を管理しています。そして Fixed size block Allocator の最上位には Top level block Allocator と呼ばれるコンポートネントがあり、そのコンポーネントがフラグメントからメモリを獲得します。Top level block Allocatorが獲得するサイズは32bitでは 4MB 、64bitでは128MBの固定のサイズであり、Workspaceが異なっても常に同じサイズです。
このように、Denaliでは全てのサイズのメモリの割り当ては最終的にTop level block Allocatorがフラグメント領域から獲得します。Denaliでは‘max server memory’はバッファプールのサイズではなく、フラグメント全体のサイズを制御しますので、SQL Serverが獲得する全てのメモリを制御できるようになるのです。また、リソースガバナーの変更はありませんが、全てのサイズの割り当てが1つのメカニズムで行われるようになったことにより、リソースガバナーも全てのサイズのメモリ割り当てを制御できるようになります。
Multi Page Allcatorによって獲得されるメモリはバッファプール以外の領域(MemToLeaveと呼ばれる領域)からおこなわれていました。MemToLeaveの既定のサイズはmax worker thread ×スレッドのスタックサイズ(32bit:512KB、64bit:2MB、IA64:4MB) + 256MB (-g スタートアップ オプションの既定のサイズ) です。Denaliでもフラグメントとは別にMemToLeaveの領域は残されていますが、この領域は通常SQL Serverは使用しません。スレッドスタックや拡張 DLLなどが直接メモリを獲得した場合に使用されます。32bitでは大きなクエリを多く実行している環境でMemToLeaveが不足し、–g スタートアップオプションを使用してサイズを変更していただく場合がありました。Denaliではそういったことはほとんどなくなると思いますが、–g スタートアップオプションでサイズを変更することは可能です。