SQL Server のメモリ管理 - Part 4
神谷 雅紀
SQL Server Escalation Engineer
バッファプール - まとめ
まずは、前回までのまとめです。
- プロセス仮想アドレス空間のサイズは、搭載されている物理メモリサイズに関係なく一定である。32-bit は 4GB。
- プロセス仮想アドレス空間は、カーネルモード用とユーザモード用に分かれている。
- ユーザーモードプロセスは、プロセス仮想アドレス空間のうち、ユーザモード用のユーザー仮想アドレス空間の中でメモリ割り当てを行う。ユーザーモードアプリケーションが割り当てを行うユーザー仮想アドレス空間のサイズは、32-bit では 2GB (/3GB オプションで 3GB, Wow64 上で 4GB)、x64 では 8TB、IA64 (IPF) では 7TB。
- SQL Server プロセスのユーザー仮想アドレス空間は、バッファプールとそれ以外に分けられる。
- バッファプールは、Reserved と Committed の領域から構成され、物理メモリやページファイルを使用するのは Committed のみ。
- バッファプールは、Reserved を Committed にすることで拡張、Committed を Reserved にすることで縮小する。
- 拡張縮小の必要性は、SQL Server 内部のメモリ要求と Windows からの物理メモリの空き容量の通知 (Memory Notification API) により判断される。
ここまででおさらいは終わりです。
Memory Manager
メモリが必要となった SQL Server 内部のコンポーネントは、Memory Manager にメモリを要求します。Memory Manager はバッファプールから、または、非バッファプールからその要求を満たすためのメモリを獲得します。Buffer Manager - Stolen pages に表されるページ数は、Memory Manager によってバッファプールから獲得されたページの数を示しています。
Single page allocator と Multi page allocator
メモリが必要となった SQL Server 内部のコンポーネントは、Memory Manager にメモリを要求しますが、バッファプールは 8KB に区切られているため、8KB 以下のメモリ要求しか満たすことができません。では、8KB 以上のメモリ要求は、どのように満たされるのでしょうか?8KB 以上のメモリが要求された場合、Memory Manager は、バッファプールからメモリを獲得するのではなく、非バッファプールからメモリを割り当てます。
Memory Manager には、バッファプールからメモリ獲得することで 8KB 以下のメモリ要求に応える Single page allocator と、非バッファプールからメモリを獲得することで 8KB を越えるメモリ要求に応える Multi page allocator の 2 種類のメモリ割り当て機構があります。Memory Manager – Total server memory (KB) パフォーマンスカウンタは、Single 及び Multi page allocator が割り当てた合計サイズを示しています。
Single/Multi page allocatorは SQL Server 2005 で新たに取り入れられたもので、SQL Server 2000 にはありません。しかし、動きとしては SQL Server 2000 も同じであると考えて問題ありません。
SQL Server 内でのメモリ使用は、8KB ページに最適化されているため、SQL Server データベースエンジンが非バッファプールからメモリを獲得することは、バックアップファイルへの転送バッファ用一時領域やクライアントがネットワークパケットサイズに 8KB 以上のサイズを指定した場合、8KB を超える XML の処理要求など、限られた状況下のみです。
Memory Manager から獲得されたメモリの内訳、サイズ
Memory Manager パフォーマンスオブジェクト下には、 Lock Memory(KB), Connection Memory(KB), Optimizer Memory(KB), SQL Cache Memory(KB) など、主要なメモリ消費者がどの程度のメモリを使用しているのかを確認するためのカウンタが提供されています。一方、sys.dm_os_memory_clerks DMV では、すべてのメモリ消費者のメモリ使用量を細かく確認することができます。
バッファプールを中心に、4 回に分けて SQL Server のメモリ管理について書いてきましたが、ここで一旦区切りにしたいと思います。今回の Memory Manager についての話は非常にあっさりとした内容になっていますが、また機会があれば詳しく書いてみたいと思います。
Comments
- Anonymous
June 13, 2011
SQL Server のメモリ管理 - Part 1 ~ 4 blogs.msdn.com/.../sql-server-part-1.aspx blogs.msdn.com/.../sql-server-part-2.aspx blogs.msdn.com/.../sql-server-part-3.aspx blogs.msdn.com/.../sql-server-part-4.aspx