SQLサーバーからの高ディスクI / Oまたは高ディスクI / OがSQLサーバーを遅くしていますか?


18

SQLサーバーのパフォーマンスの問題について、DBAと2人のハードウェア担当者と議論してきました。通常はすべて問題ありませんが、過去数週間にわたって、SQLサーバーで大きなラグスパイクが発生しています。SQL ServerがディスクI / Oで待機していることは明らかです。しかし、SQL Serverが異常に高いI / Oを要求しているためだと言われ続けています。そうではありません。実行しているものから、通常のことは何もありません。DBAが注意を払うのは、ブロッキングなどを引き起こしているものだけで、これは役に立ちません。たとえば、バックアップの主なものは、ASPStateデータベースの操作です。これは、WebサーバーでASPセッション状態を管理するために使用しています。これらの操作は通常、Sp_who2のアクティブな結果には表示されません。これは、これらの操作が非常に高速に発生するためです。データベースは単純復旧モードであり、ロギングは最小限です。ただし、これらのラグスパイクの間、ブロックまたは待機中のデータベースに対する多くの選択および更新操作を確認できます。何が起こっているのかは、そのデータベースのログとデータファイルに使用されているRAIDアレイでディスクの使用率が高くなっている原因で誰かまたは何らかのジョブが実行されていると確信しています。私たちのウェブサイトを殺している何かをしていることを誰も認めたくないので、問題はそれを証明しています。

私の質問は、SQLサーバーがI / Oを待機していることを示すのに役立つパフォーマンスカウンターまたはログに記録できるものですが、通常よりも多くを求めているためではなく、代わりにディスクがSQLサーバーからのリクエストに応答するためです通常のように迅速に?


3
ネットワークI / Oで実際に表示される待機状態は何ですか?つまり、SANを使用していますか?
エリックヒギンズ

DBサーバーでリソースの使用を支配しているクエリがあるかどうかを確認します。ある場合は、それらを調整してみてください。正常に動作しないクエリがない場合、PAGEIOLATCHの待機時間が長くなると、通常はシステムがI / Oにバインドされていることを示します。また、@ EricHigginsが言うように、SANはしばしば低速であり、データベースのパフォーマンスの問題を引き起こします。
ConcernedOfTunbridgeWells

QlogicファイバーHBAでSQLサーバーに接続されたNETAPPアレイ。
エッジー

これは比較的古い質問であり、これで問題が直接解決されるわけではないことを知っています... 十分に文書化されていませんが、セットアップはかなり簡単です。
MattGWagner

それで、あなた/ DBAは何をしましたか、そして何が問題でしたか?
ムクス

回答:


19

次のperfmonカウンターをご覧ください。

多数のIO要求を処理するSQL Serverは、多数のスキャン、ページ検索とページ読み取りの増加、およびページIOラッチ待機の増加によって裏付けられます。sys.dm_exec_query_stats物理読み取り数が多いエントリを確認する価値があります。彼らはすぐに犯人を特定できました。

一般に、パフォーマンスのトラブルシューティングの問題として問題にアプローチする場合、待機やキューなどの方法論に従うことが適切なアプローチです。DBAは正しいことをしているようですので、彼の話を聞いてください。


彼は私が働いた中で最高のDBAの一人であるDBAに問題はありません。そして、彼は私に高ブロッキングストアドプロシージャのリストを与えてくれました。しかし、多くのブロッキングを引き起こしているprocの1つは「TempUpdateStateItemLong」です。これは、SQLセッションステートストアで使用されるprocです。MSプロシージャであり、テーブルのインデックス付き主キーであるsessionIDによって単一のテーブルのみを更新します。また、せいぜいこのテーブルには2000〜3000のレコードがあるので、更新には本当に時間がかかりません。
エッジー

これは開始するのに適した場所です。まだSQL Server 2000を実行していますが、アップグレードの過程にありますが、それは今後数か月間発生しないため、PAge IOラッチ待機カウンターを確認する必要はありません。再度、感謝します。
エッジー

ブロッキング自体は、高いIOを意味しないことに注意してください。ロック競合である可能性があり、特にオプティマイザがテーブルスキャンベースのプランを選択した場合、サイズに関係なくテーブルに影響します。
レムスルサヌ

また、プロセスをチェックして、IO Data Bytes/sec他のプロセスがディスクを破壊していないかどうかを確認します。
レムスルサヌ

12

Glenn Berryの診断クエリとAdam MachanicのSP_Whoisactiveを使用して、実際に何が起こっているのかを確認します。

最初に、このクエリを実行して、どのデータベースファイルのIOボトルネックが最も大きいかを確認します(クエリby Glenn Berry)

SELECT  DB_NAME(fs.database_id) AS [Database Name] ,
        mf.physical_name ,
        io_stall_read_ms ,
        num_of_reads ,
        CAST(io_stall_read_ms / ( 1.0 + num_of_reads ) AS NUMERIC(10, 1)) AS [avg_read_stall_ms] ,
        io_stall_write_ms ,
        num_of_writes ,
        CAST(io_stall_write_ms / ( 1.0 + num_of_writes ) AS NUMERIC(10, 1)) AS [avg_write_stall_ms] ,
        io_stall_read_ms + io_stall_write_ms AS [io_stalls] ,
        num_of_reads + num_of_writes AS [total_io] ,
        CAST(( io_stall_read_ms + io_stall_write_ms ) / ( 1.0 + num_of_reads
                                                          + num_of_writes ) AS NUMERIC(10,
                                                              1)) AS [avg_io_stall_ms]
FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
        INNER JOIN sys.master_files AS mf WITH ( NOLOCK ) ON fs.database_id = mf.database_id
                                                             AND fs.[file_id] = mf.[file_id]
ORDER BY avg_io_stall_ms DESC
OPTION  ( RECOMPILE );

次に、このクエリを実行して、サーバーが待機している上位10のイベントを確認します(Jonathan Kehayiasによるクエリ)。Glenn Berryの診断クエリからも同様のクエリが見つかります。

SELECT TOP 10
        wait_type ,
        max_wait_time_ms wait_time_ms ,
        signal_wait_time_ms ,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms ,
        100.0 * wait_time_ms / SUM(wait_time_ms) OVER ( ) AS percent_total_waits ,
        100.0 * signal_wait_time_ms / SUM(signal_wait_time_ms) OVER ( ) AS percent_total_signal_waits ,
        100.0 * ( wait_time_ms - signal_wait_time_ms )
        / SUM(wait_time_ms) OVER ( ) AS percent_total_resource_waits
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0 -- remove zero wait_time
        AND wait_type NOT IN -- filter out additional irrelevant waits
( 'SLEEP_TASK', 'BROKER_TASK_STOP', 'BROKER_TO_FLUSH', 'SQLTRACE_BUFFER_FLUSH',
  'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP', 'SLEEP_SYSTEMTASK',
  'SLEEP_BPOOL_FLUSH', 'BROKER_EVENTHANDLER', 'XE_DISPATCHER_WAIT',
  'FT_IFTSHC_MUTEX', 'CHECKPOINT_QUEUE', 'FT_IFTS_SCHEDULER_IDLE_WAIT',
  'BROKER_TRANSMITTER', 'FT_IFTSHC_MUTEX', 'KSOURCE_WAKEUP',
  'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', 'ONDEMAND_TASK_QUEUE',
  'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BAD_PAGE_PROCESS',
  'DBMIRROR_EVENTS_QUEUE', 'BROKER_RECEIVE_WAITFOR',
  'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'WAITFOR',
  'DISPATCHER_QUEUE_SEMAPHORE', 'XE_DISPATCHER_JOIN', 'RESOURCE_QUEUE' )
ORDER BY wait_time_ms DESC

この情報が手元にあれば、問題のトラブルシューティングがはるかに簡単になります。

ところで、トラブルシューティングにsp_whoisactiveを使用する方法に関する多くの投稿をここで見つけることができます


1
このリストの最後のスクリプト、つまりキックキックを使用しました。
the_good_pony

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.