39
ここここここここ SQL Server こここここ ここ ここ (@Masayuki_Ozawa)

ここからはじめる SQL Server の状態取得

Embed Size (px)

Citation preview

Page 1: ここからはじめる SQL Server の状態取得

ここからはじめる SQL Server の状態取得

小澤 真之 (@Masayuki_Ozawa)

Page 2: ここからはじめる SQL Server の状態取得

自己紹介

2

SQL Serve 関連の案件を中心に仕事をしていけるといいなと考えているフリーランスのエンジニアです。

SE の雑記 というブログをやっていますhttp://blog.engineer-memo.com/

SNS はこちら Twitter :

@Masayuki_Ozawa Facebook : http://www.facebook.com/masayuki.ozawa

2012/12/01SQLSaturday #181

Page 3: ここからはじめる SQL Server の状態取得

現状取得の重要性

2012/12/01SQLSaturday #1813

突然こんなこと言われたことがありませんか??

最近 サーバーが遅くなった気がするんだけど、どうして??

Page 4: ここからはじめる SQL Server の状態取得

どうして突然遅くなった??

2012/12/01SQLSaturday #1814

データが増えた?? 利生者数が増えた?? インデックスの断片化?? 統計情報が古くなって最適な実行プランではない??

そもそも、遅くなったって何と比較して??感覚値との比較??

サーバーの使用状況の変化を把握することで何があったかを確認することが重要 !!

Page 5: ここからはじめる SQL Server の状態取得

レスポンス悪化時の問題解決の 2 つのアプローチ

2012/12/01SQLSaturday #1815

Page 6: ここからはじめる SQL Server の状態取得

二つのアプローチ

2012/12/01SQLSaturday #1816

• クエリの実行プランの最適化• インデックスチューニング• ロックの最適化 ……

クエリ最適化 ( 部分最適 )

• ハードウェアリソースの使用状況の最適化• CPU / ディスク / メモリ / ネットワーク• 待ち事象 (Wait Stats / Latch Stats) ……

サーバー最適化 ( 全体最適)

処理が遅い画面が分かっている

全体的 / なんとなく遅い

今回の内容

Page 7: ここからはじめる SQL Server の状態取得

ここからはじめてみてはどうでしょう

2012/12/01SQLSaturday #1817

Page 8: ここからはじめる SQL Server の状態取得

基本情報を取得するからはじめてみる

2012/12/01SQLSaturday #1818

リソースの基本情報を正しく取得 / 整理するところから、はじめてみてはどうでしょう。

サーバーの基本的なリソースCPUディスクメモリネットワーク

Page 9: ここからはじめる SQL Server の状態取得

  このグラフをどう見ますか??

9

以下のようなディスクの使用率のグラフがあります。ディスクがボトルネックになっているでしょうか ?

Disk Read が頻繁に発生

Disk Queue が頻繁に発生

Disk Write は定期的に発生

Logical Disk : Current Disk Queue LengthLogical Disk : Avg. Disk Bytes/ReadLogical Disk : Avg. Disk Bytes/Write

2012/12/01SQLSaturday #181

Page 10: ここからはじめる SQL Server の状態取得

ボトルネックになっているのは??

2012/12/01SQLSaturday #18110

1. ディスクのスペックが不足している

2. CPU のスペックが不足している

3. メモリのサイズが不足している

4. わからない

私の回答はこれ

Page 11: ここからはじめる SQL Server の状態取得

各リソースの情報をどう読む ?

11

CPU サーバー全体の CPU の使用率 SQL Server のプロセスの CPU の使用率 コンパイル / リコンパイルの発生状況 CPU キュー

メモリ サーバーの使用可能な空きメモリ SQL Server のメモリ使用状況 キャッシュヒット率

ディスク ディスク読み込み / ディスク書き込み ( ディスクキュー )

ネットワーク 受信バイト / 送信バイト ネットワークキュー

2012/12/01SQLSaturday #181

Page 12: ここからはじめる SQL Server の状態取得

キホンのキホン

2012/12/01SQLSaturday #18112

瞬間値や平均値ではなく時系列にデータを整理する 瞬間値 ( 最大値 ) は有効なデータになりえます??

瞬間的に 100% に達するのは問題でしょうか ?? リソースを有効に使っているという見方もできます。

リソースの使用状況を 波形 で見れるようにするのが重要 100% に張り付いた状態が継続していないことを確認 ピーク時間とオフピーク時間のリソースの使用状況を確認

複数のリソースの情報を組み合わせて確認する 一つのリソースだけで判断しないことがポイント

先ほどわからないといった理由はこれ

Page 13: ここからはじめる SQL Server の状態取得

たとえばこのようなことが考えられます

2012/12/01SQLSaturday #18113

ディスク ディスクの書き込みではなく読み込みの頻度が多い

→ ディスク / メモリがボトルネックになりえる CPU

ユーザーが増えたことにより再利用されない SQL が頻繁に実行され、コンパイルの発生が頻発し CPU が 100% になっている→ CPU / メモリがボトルネックになりえる

メモリ データの増加によって、メモリが不足して頻繁にデータがディスクから読み

込まれている→ メモリ / ディスクがボトルネックになりえる

Page 14: ここからはじめる SQL Server の状態取得

使用するツール

2012/12/01SQLSaturday #18114

Page 15: ここからはじめる SQL Server の状態取得

現状を見るために使用するツール

15

SQL Server 2000 Undocumented DBCC システムテーブル OS のパフォーマンスモニター

SQL Server 2005 動的管理ビュー (DMV) SSMS の標準レポート SQL Server 2005 Performance Dashboard Reports

SQL Server 2008 / R2 / SQL Server 2012 データコレクション ( ただし、 Enterprise Edition)

SQL Server 2008 以降は SQL Server の機能でパフォーマンス状態のレポートが作れるようになりました

拡張イベント (XEvent)

今回はこれ

これも少し

2012/12/01SQLSaturday #181

Page 16: ここからはじめる SQL Server の状態取得

データコレクションの画面例

16 2012/12/01SQLSaturday #181

Page 17: ここからはじめる SQL Server の状態取得

パフォーマンスモニタとは??

17

リアルタイムのパフォーマンス情報 現状を確認するときに使用します

パフォーマンス情報のログの取得 ベースラインを作成するときに使用します

リモート (別のコンピュータ ) からも取得できます サーバーのディスク容量が無くても別のコンピューターにログを取得できます

SQL Server 固有のカウンタならメモリの情報を取得できます タスクマネージャーでメモリの使用状況が取得できなくても、 SQL Server 固

有のカウンタからはメモリの使用状況を取得することができます。

2012/12/01SQLSaturday #181

エディションに依存せずに使用できるので

どの環境でも情報を取得可能

Page 18: ここからはじめる SQL Server の状態取得

18

データ取得時の環境例モニタリング端末

PerflogUser(Performance Log User)(Performance Monitor

User)

モニター対象

PerflogUser(Performance Log User)

(Performance Monitor User)

ログ取得ディレクトリ別端末から取得

同一ユーザー名 / 同一パスワード( ワークグループ環境のため )

2012/12/01SQLSaturday #181

Page 19: ここからはじめる SQL Server の状態取得

パフォーマンスモニタで取得する項目の例

19

「 SQL Server Perlman Counters Poster」でビングってください Quest Software さんから SQL Server のパフォーマンスモニタのカウン

タについて、まとまった情報が公開されています

2012/12/01SQLSaturday #181

Page 20: ここからはじめる SQL Server の状態取得

最初にすること

2012/12/01SQLSaturday #18120

Page 21: ここからはじめる SQL Server の状態取得

こういうデータを見ていませんか?

21

最大 / 最小 / 平均を表にする

タスクマネージャーで確認

CPU Memory

最大 最小 平均 最大 最小 平均9:00 50% 10% 40% 10GB 10GB 10GB

10:00 90% 10% 80% 10GB 10GB 10GB

11:00 96% 15% 90% 10GB 10GB 10GB

sqlservr.exe の状態を確認

2012/12/01SQLSaturday #181

Page 22: ここからはじめる SQL Server の状態取得

データの読み方

22

4 つのポイント

1. 波形を見る2.同じ種類の複数の情報を重ねる3.違う種類の情報と比較する4. 比率を見る

2012/12/01SQLSaturday #181

Page 23: ここからはじめる SQL Server の状態取得

波形を読む

23

波形からCPU 使用率の高い時間を把握

Processor : %Processor Time (_Total)

2012/12/01SQLSaturday #181

ピークタイム (高負荷 ) とオフピークタイム (低負荷 )

の状態を確認する

Page 24: ここからはじめる SQL Server の状態取得

同じ種類の複数の情報を重ねる

24

Processor : % Processor Time (_Total) Process : % Processor Time (sqlservr)

プロセッサの使用率の波形とSQL Server のプロセスの

波形が一致

2012/12/01SQLSaturday #181

SQL Server のプロセスがCPU を多く使用している

ことが読み取れる

Page 25: ここからはじめる SQL Server の状態取得

違う種類の情報と比較する

25

Buffer Manager : Buffer Cache Hit RatioPlan Cache : Cache Hit RatioBuffer Manager : Page life expectancy

データのキャッシュヒット率メモリが不足していると低い

クエリのキャッシュヒット率アドホッククエリが多いと低い

メモリ内のデータでどの程度の時間処理ができているか

300秒以上が一般的な推奨値

2012/12/01SQLSaturday #181

どの用途のメモリが不足しているかを確認

Page 26: ここからはじめる SQL Server の状態取得

比率を見る

26

SQL Server の使用メモリ

サーバー上の空きメモリ

SQL Server 以外の使用メモリ

Memory : Available MBytesProcess : Working Set (sqlservr 以外 )Memory Manager : Total Server Memory (KB)

2012/12/01SQLSaturday #181

全体のメモリに対してどの程度使用しているか

Page 27: ここからはじめる SQL Server の状態取得

SQL Server のメモリ構造

27

Buffer Manager : Database Pages

Plan Cache : Cache Pages

Memory Manager : Connection Memory (KB)

Memory Manager : Granted Workspace Memory (KB)

Memory Manager : Lock Memory (KB)

一時利用

キャッシュ

2012/12/01SQLSaturday #181

Page 28: ここからはじめる SQL Server の状態取得

一歩踏み込んでメモリの状態を確認

28

プロシージャキャッシュ

Buffer Manager : Free pagesBuffer Manager : Database PagesPlan Cache : Cache Pages (_Total)※各値はページ数なので 8KB をかける※SQL Server 2012 ではカウンタ名少しが変わっています

データキャッシュ

2012/12/01SQLSaturday #181

フリーページ

SQL Server が確保しているメモリでも内部的には

空きがあることが

Page 29: ここからはじめる SQL Server の状態取得

DMV でさらにブレークダウン

29

データキャッシュの詳細は [sys].[dm_os_buffer_descriptors] で

プロシージャキャッシュの詳細は [sys].[dm_exec_cached_plans] で

2012/12/01SQLSaturday #181

DB 単位のメモリの使用状況を取得

用途単位でメモリの使用状況を取得

Page 30: ここからはじめる SQL Server の状態取得

最初のグラフを改めて見直すと

30

Disk Read が頻繁に発生

Disk Queue が頻繁に発生

Disk Write は定期的に発生

Logical Disk : Current Disk Queue LengthLogical Disk : Avg. Disk Bytes/ReadLogical Disk : Avg. Disk Bytes/Write

2012/12/01SQLSaturday #181

Page 31: ここからはじめる SQL Server の状態取得

組み合わせると見えてくる !!

31

データキャッシュのヒット率が低いとディスクからデータの読み込みが発生しているので、ディスク負荷が高くなる傾向に

プランキャッシュのヒット率が低いとコンパイルの発生回数が多くなるため、 CPU 負荷が高くなる傾向に

ディスク / CPU の値が高くてもメモリネックの場合があります。

このような場合は、違う種類の情報を比較することが重要です。

2012/12/01SQLSaturday #181

Page 32: ここからはじめる SQL Server の状態取得

使い分けが重要

32

パフォーマンスモニタは現状を俯瞰するのが得意です 各カウンターで現状を取得して、特異点があれば DMV でブレークダウン

DMV は現状の状態詳細に取得するのが得意です DMV の情報はサービスを再起動すると初期化されるのでログとして取得す

る場合はユーザー定義のデータコレクションまたは、定期的にクエリを実行してテーブルに格納することで対応

拡張イベントはイベントを取得するのが得意です 今回は紹介できていませんが拡張イベントでは内部動作を取得できます。 セッション単位の待ち事象 (Wait Stats / Ratch Stats) ブロッキング ( ロックの競合 )

2012/12/01SQLSaturday #181

Page 33: ここからはじめる SQL Server の状態取得

33

基本的な情報の組み合わせで

有効な情報がとれる !!2012/12/01SQLSaturday #181

Page 34: ここからはじめる SQL Server の状態取得

さらに踏み込みたい方は

2012/12/01SQLSaturday #18134

Page 35: ここからはじめる SQL Server の状態取得

実行状態の遷移

2012/12/01SQLSaturday #18135

実行状態(RUNNING)

実行可能状態(RUNNABLE)

待機状態(SUSPENDED)

処理を実行している状態CPU

メモリディスク

処理を待機している状態ロック

並列処理同期ディスク I/O

待機がなくなり処理の開始待ちCPU 使用権の譲渡

キューの解放

Page 36: ここからはじめる SQL Server の状態取得

待機状態の理由を考える

2012/12/01SQLSaturday #18136

実行状態が長い = 処理に時間がかかる どの処理で時間がかかっているかを確認 実行プランのイテレータを確認 sys.dm_exec_requests ( 実行中の要求 ) で確認することができます。

待機状態が長い = リソースを使用できる状態になるのに時間がかかる どのリソースを使用可能な状態になるのに時間がかかっているかを確認 sys.dm_os_wait_stats ( 待機の累計 ) で確認をすることができます。

Page 37: ここからはじめる SQL Server の状態取得

最初の一歩は利用状況モニターから

2012/12/01SQLSaturday #18137

Page 38: ここからはじめる SQL Server の状態取得

詳しく知りたい方はこちらを

2012/12/01SQLSaturday #18138

SQL Wait Stats Joes 2 Pros: SQL Performance Tuning Techniques Using Wait Statistics

Page 39: ここからはじめる SQL Server の状態取得

まとめ

39

パフォーマンスモニターの勘所がわかれば状態取得ははじめられます インデックスチューニング / DMV 詳細確認は難しいかもしれませんが、基本的な

情報を取得して整理するところからはじめてみてはどうでしょう。

取得したデータを読むときは単純な値を控えるのではなく波形や複数の情報を組み合わせることが重要になってきます 組み合わせることで見えてくる事象があります。

定期的にベースラインと現状を比較し、負荷があがっているかを判断するのが予防保守として重要になってきます ベースラインを作成したら終わりではなく定期的にベースラインとの比較をするの

が大事です 急に遅くなっていないことを証明するための予防線

2012/12/01SQLSaturday #181