Open3
「絵で見てわかるSQL Serverの仕組み」読書メモ
第1章 CPUリソースの最適化
-
スレッド = プログラム内の処理の実行単位・CPUの利用単位
-
単一スレッドで処理 = シングルスレッドプログラミング
-
同一アドレス空間のメモリを共有しながら並列で実行 = マルチスレッドぷグラミング
-
複数のCPUを搭載したコンピュータであれば後者の方がお得
-
マルチタスク処理 = 異なるプロセスの処理に異なるCPUを割り当てて複数のアプリケーションを効率的に処理する仕組み
-
マルチスレッド処理 = 1つのアプリケーション内の操作を複数のスレッドに分割し、それぞれのスレッドに対して異なるCPUを割り当て、各スレッドを並列で処理することによって処理効率を高める仕組み
- I/O待ちなどでスレッドがCPUの使用を停止した場合別の処理にCPUを割り当て可能、結果コンピュータ全体のスループットが向上
- 逆に待ち状態が一切発生しないスレッドが発生した時に備え、一定時間が経過すると強制的に別スレッドにCPU使用権を譲る
-
スレッドに1回に割り当てられるCPUの使用可能時間 = タイムスライス
-
マルチスレッドOSではタイムスライスに達すると強制的にCPUの使用権を譲り別の処理が行われる。これをコンテキストスイッチと呼ぶ。
- それまでCPUそ使用していた処理の情報はレジスタに保存しておく
- 次回の処理ではレジスタに保存された前回の情報をロードする必要があるためオーバヘッドが発生する = コンテキストスイッチは負荷がかかる
- これら一連のCPUリソース管理を担当しているコンポーネントがスケジューラ
- WindowsではWindowsスケジューラ
-
データの一貫性を保つためにロック機能が提供されている
-
クエリはスレッドが作成されて処理される
- クエリがロック開放待ち = 別スレッドのロックの解放待ち
- Windowsスケジューラからはロック解放待ちかなのかCPU割り当て待ちなのかは見えない
- ロック解放待ちにCPUが割り当てられてシステムのスループットが低下する事がある
-
並列処理 = 1クエリが複数スレッドで処理される
- パフォーマンス向上
- 親スレッドが複数の子スレッドを立ち上げる
- 最も遅い子スレッドの処理待ち = 他の待機中のスレッドにCPUを割り当てられても無駄になる
- WindowsスケジューラにはSQL Server内部で発生している待機状態は判断できない
第2章 ディスクI/O操作の理解
- 2種類のファイルで情報を保持している
- データファイル
- ページ(8kb)単位で保管
- トランザクションファイル
- トランザクションログをトランザクションファイルに書き込んでからデータを変更する
- これを先行書き込みログ(Write Ahead Logging)と呼ぶ
- トランザクションログをトランザクションファイルに書き込んでからデータを変更する
- データファイル
- OLTP = オンライントランザクション処理
- データファイル内に小規模なアクセスが多発
- DWH
- 連続性を持ったデータが格納されている
- ページの論理順にスキャン
- トランザクションログは1箇所に時系列順に書き込まれる
- ディスクにスピンドルが複数あってもトランザクションログの書き込み処理は分散できない
- データを読み込むためのメモリ領域 = バッファキャッシュ
- クエリ実行のタイミングでクエリ結果範囲外のデータをバッファキャッシュに書き込む = 先行読み取り(Read-Ahead)
- Standard Edition...128ページ
- Enterprise Edition...1024ページ
- データ変更の流れ
- 先行書き込みログ操作
- バッファキャッシュのデータ更新 = 論理書き込み
- 物理ディスク上のデータは更新されない
- 論理書き込み済み && 物理書き込みがされていないデータ = ダーティページ
- 物理ディスク上のデータ更新(ディスクへのフラッシュ)
- 物理書き込み
- ダーティページの物理書き込みの手段
- チェックポイント
- SQL Server内のコンポーネントの1つ
- バッファキャッシュを定期的にスキャンして物理書き込みを行う
- 1度に最大16個のダーティページの物理書き込み要求を行う
- 基本的にダーティページがなくまるまで非同期で物理書き込み要求を行う
- 集中書き込み(Eager Write)
- 一括操作のトランザクションログのみ書き込まれるので全ての更新動作をログ出力する場合に比べてパフォーマンスが良い
- レイジー書き込み
- レイジーライタを使う
- バッファキャッシュに一定量の空きページを確保
- ディスクから読み込んだデータをバッファキャッシュ上に保持
- ディスク読み取り毎にバッファキャッシュをスキャンして空き場所を探すのは非効率
- バッファキャッシュの空き領域(空きページ)をフリーリストというリストに登録しておくことでディスクから読み込んだデータを効率的にバッファキャッシュに格納できる
- フリーリストの空きページが少なくなるとバッファキャッシュ上の参照頻度の低いデータを削除する
- レイジーライタを使う
- チェックポイント
第3章 メモリ管理
- プロセスに割り当てられた仮想アドレスには3つの状態が存在する
状態 | 特徴 |
---|---|
Commited | 仮想アドレス内で実際に使用されている領域 |
Reserved | 後の使用に備えて仮想アドレス空間の領域が予約済みになっている状態 物理メモリが一切割り当てられていない |
Free | 自由なメモリ割り当てが可能 |
- SQL Serverでは仮想アドレス空間をVirtualAlloc関数で操作する
- 全てのプロセスが自分自身の仮想アドレス空間を物理メモには展開できない
- 物理的メモリのサイズの制約があるため
- ではどう解決するか?
ページング
- ページングとは...メモリとストレージの間で書き込んだり読み込んだりする処理?