Shoeisha Technology Media

EnterpriseZine(エンタープライズジン)

EnterpriseZine(エンタープライズジン)

テーマ別に探す

Denali のメモリ管理(前編)

edited by DB Online   2011/08/29 07:00

バッファプールとは

 メモリ管理の主要なコンポーネントの1つであるバッファプールは、そもそもデータベースのテーブルなどをユーザー間で共有するためにI/Oを管理するコンポーネントです。そのため、アプリケーションがデータベースの情報にアクセスすると、ディスクからバッファプールのメモリにデータベースの情報が読み込まれ、キャッシュされます。SQL Serverのデータベースのファイルは複数のページに論理的に分割されていて、1ページのサイズは8KBです。同様にバッファ プールが管理するメモリも 1ページを8KBとしてページ単位で使用されます。

 最初にバッファプールはデータベースの情報をユーザー間で共有するためのコンポーネントと記載しましたが、実際にはバッファプールが管理するメモリはデータベースをキャッシュする以外にも使用されています。SQL Serverの内部コンポーネントがメモリを必要とする場合もバッファプールのメモリが使用されるのです(このデータベースの情報以外に使用されているページはStolen pagesと呼ばれています)。内部コンポーネントがメモリマネージャにメモリを要求した場合、メモリマネージャはSingle Page Allocator と呼ばれるコンポーネントを使用してバッファプールにメモリを要求し、バッファプールは空きページ(データベースの情報のキャッシュや他の内部コンポーネントで使用されていない)からページを割り当てます。リソース ガバナーは全てのメモリの制御できないと書きましたが、このSingle Page Allocatorを使用したメモリの割り当てのみを制御します。

 データベースの情報をキャッシュする場合や内部コンポーネントに割り当てるメモリは、バッファ プール自身がWindowsのアプリケーションではおなじみのVirtualAlloc APIを使用して獲得しています。VirtualAlloc APIを使用して獲得したメモリは、空きページとして管理され、データベースのページの情報が読み込まれる場合などに使用されます。ページが使用されなくなると再び空きページとして管理され、解放されることはありません(システムの空きメモリが不足した場合は SQL Serverは使用しているメモリを解放します)。 

 このようにバッファプールは、データベースの情報を共有するためのI/Oとキャッシュのためのメモリ管理の仕組みを持っており、また他の内部コンポーネントのためのメモリの割当の機能を持っています。


著者プロフィール

  • 坂輪貴行(サカワ タカユキ)

      日本マイクロソフトの Premier Field Engineering 部にて、SQL Server ユーザーの支援を行う。前職はシステム エンジニアであり、長く Sybase を使用したプロジェクトに従事。業界歴 14 年の月一ゴルファー。

バックナンバー

連載:あたらしいSQL Server/Denaliの世界

もっと読む

All contents copyright © 2007-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5