ディスクの監視オブジェクトとカウンタ
ディスクのボトルネックを調べる場合には,LogicalDiskオブジェクト,PhysicalDiskオブジェクト,SQL
Serverオブジェクトのカウンタを観察する。ここで注意しなければならないのは,メモリボトルネックがディスクボトルネックであるかのように現れることがあるということである。したがって,どれが真のボトルネックであるかを判断するためにMemoryオブジェクトのカウンタも併せて観察しなければならないし,できればメモリボトルネックを解決したうえでディスクボトルネックを評価したほうがよい。
ディスクのボトルネックを評価するには,アプリケーションからディスクへのI/O要求数と,ディスクサブシステム(ハードウェアおよびソフトウェア)が実際に処理しているI/O数を監視し,両者を比較する。処理されたI/O数よりI/O要求数のほうが大きい場合には,各ディスクに対するI/O要求の待ち行列が生成される。待ち行列が生成されている場合,ディスクにボトルネックがある可能性もあるので,ディスクI/O要求の待ち行列を中心に,下記のパフォーマンスカウンタの値を監視し,検証する。
Fig.9-73 パフォーマンスモニタ(ディスクサブシステム)
○LogicalDisk:% Disk Time
○PhysicalDisk:% Disk Time
これらのカウンタは,ディスクに対するI/O要求を処理するのに要した時間を百分率で示したものである。これらの値が95%以上で,Avg.
Disk Queue Lengthカウンタの値が2以上であれば,ディスクのボトルネックの可能性がある。PhysicalDisk:%
Disk Timeカウンタの値は,50%以下であることが望ましい。
○LogicalDisk:Avg. Disk Queue Length
○PhysicalDisk:Avg. Disk Queue Length
SQL Serverの関連ファイルが存在するすべてのドライブに対するDisk
Queue Lengthカウンタの値を監視し,ディスクI/O要求の待ち行列を過剰に増大させているファイルが存在するかどうかを判断する。Disk
Queue Lengthカウンタとは,ディスクI/O要求の待ち行列の長さのことである。
一口にDisk Queue Lengthカウンタといっても,パフォーマンスモニタで計測可能な値は2種類ある。Current
Disk Queue Lengthカウンタはパフォーマンスモニタのサンプリング時点における瞬間値であるのに対して,Avg.
Disk Queue Lengthカウンタはパフォーマンスモニタのサンプリング期間における平均値である。ボトルネックの有無を検証するときには,瞬間的な値を示すCuurent
Disk Queue Lengthカウンタよりも,平均値を示すAvg.
Disk Queue Lengthカウンタのほうが重要である。
LogicalDisk:Avg. Disk Queue Lengthカウンタ,PhysicalDisk:Avg.
Disk Queue Lengthカウンタ,LogicalDisk:Current
Disk Queue Lengthカウンタ,PhysicalDisk:Current
Disk Queue Lengthカウンタの値がそれぞれ2を超える場合には,ディスクがボトルネックである可能性がある。ハードウェアRAIDコントローラとディスクアレイを採用しているデータベースサーバーの場合には,実際のハードディスクの数で上記カウンタの値を除算して評価する必要がある。また,SQL
Serverのログファイルを格納している物理ハードディスクまたはRAIDシステムについては,ログマネージャが1つのI/O要求しか待ち行列に格納しないので,有用な尺度とはならないことに注意しなければならない。
なお,併せてDBCC SQLPERF(IOSTATS)ステートメント(Fig.9-57参照)を実行し,Reads
Outstandingカウンタの値とWrites Outstandingカウンタの値も調べる。これらのカウンタの値は,SQL
ServerがWindows NTに要求したディスクI/O処理のうち,まだ完了していない要求の数を示している。これらのカウンタの値が2以上であれば,ディスクドライブの追加などを検討する。
○LogicalDisk:Disk Write Bytes/secとLogicalDisk:Disk
Read Bytes/sec
○PhysicalDisk:Disk Write Bytes/secとPhysicalDisk:Disk
Read Bytes/sec
これらのカウンタは,論理ドライブごとの秒あたりのデータスループットをバイト数で表したものである。1台のハードディスクが1秒間に読み書き可能なデータ量は,ランダムアクセスで最大90回程度,シーケンシャルアクセスでも最大250回程度である。したがって,I/Oが8Kバイト単位*1で処理されたとしても,ランダムアクセスであれば720Kバイト,シーケンシャルアクセスでも2Mバイト程度の値しか表示されないかもしれない。もし64Kバイト単位*2でI/Oが実行されたのであれば,ランダムアクセスで5.7Mバイト,シーケンシャルアクセスで16Mバイト程度であろう。よって,Disk
Write Bytes/secカウンタとDisk Read Bytes/secカウンタの値の和,あるいはDisk
Transfer/secカウンタの値が30Mバイト/秒以上であれば,ディスクのボトルネックの可能性がある。
しかし,秒あたりのデータスループットが少ないからといって,即座に「ディスクサブシステムはボトルネックではない」と結論付けるのは早計である。Disk
Reads/secカウンタやDisk Writes/secカウンタの値も同時に監視し,これらの値が150アクセスに近いか,あるいは超えている場合には,転送バイト数が少なくてもディスクボトルネックになっている可能性がある。RAIDコントローラなどの場合は,2000回/sec以上であれば,ディスクボトルネックになっている可能性がある。
○LogicalDisk:Avg. Disk sec/Transfer
○PhysicalDisk:Avg. Disk sec/Transfer
これらのカウンタは,ディスクI/Oの完了に要した時間の平均値を示す。これらの値がディスクの物理仕様より異常に大きい場合には,ディスクコントローラかディスクに問題がある。ディスクの平均待ち時間は,次の式で求めることができる。
平均待ち時間=Current Disk Queue Length×Avg. Disk sec/Transfer
同様のカウンタとして,PhysicalDisk:Disk Bytes/secカウンタやLogicalDisk:Disk Bytes/secカウンタがある。これらのカウンタは,ディスクI/Oにあたってディスクから送受信されたバイト数を示す。これらのカウンタの値は,低いほど好ましい。ほとんどのディスクのスループットは10〜30Mバイト/秒であり,ディスクアレイの場合はRAIDディスクコントローラのスループット(約40Mバイト/秒)を考えればよい。
- ワーカースレッド,LazyWriterスレッド,Checkpointスレッドなどは,8Kバイト単位でI/Oを実行する。
- 先読みスレッド,DBCC BACKUPステートメント,バルクコピープログラムなどのユーティリティは,64Kバイト単位でI/Oを処理する。
| Chapter 9 42/46 |
