.NET 4.0で開発したOLTPシステムの負荷テストに忙しく、SQL Server 2008 R2を背後で実行しています。システムはSQL Server Service Brokerキューを使用します。これは非常にパフォーマンスが高いキューですが、処理中に独特の傾向が発生しています。
SQL Serverは、1分の猛烈な速度で要求を処理し、その後、約20秒のディスク書き込みアクティビティが増加します。次のグラフは問題を示しています。
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
トラブルシューティング中に、パターンに大きな変更を加えることなく次のことを試みました。
- SQL Serverエージェントを停止しました。
- 実行中の他のほぼすべてのプロセスを強制終了(A / V、SSMS、VS、Windowsエクスプローラーなど)
- 他のすべてのデータベースを削除しました。
- すべての会話タイマーを無効にしました(トリガーは使用しません)。
- メッセージキュー主導のアプローチから、シンプル/粗いテーブルモニタリングデザインに移行しました。
- 軽いものから重いものまで、さまざまな負荷を使用しました。
- すべてのデッドロックを修正しました。
SQL Serverがキャッシュを構築し、特定の時間ベースの間隔でディスクに書き込んでいるように見えますが、この理論をサポートするオンラインのものが見つかりません。
次に、ソリューションを専用のテスト環境に移動して、問題を再現できるかどうかを確認します。暫定的な支援をいただければ幸いです。
Update 1 要求に応じて、チェックポイントページ/秒、ページの平均寿命、およびいくつかのディスク遅延カウンターを含むグラフがここにあります。
チェックポイント(水色の線)が、パフォーマンスの低下(黄色の線)の原因であるように見えます。^
ディスクの待機時間は処理中も比較的一定しており、ページの平均寿命は目立った影響を与えていないようです。SQL Serverで使用できるRAMの量も調整しましたが、これも大きな影響はありませんでした。復旧モデルをからSIMPLE
に変更してFULL
も、違いはほとんどありませんでした。
Update 2 「回復間隔」を次のように変更することで、チェックポイントが発生する間隔を短縮することができました。
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
これが悪い習慣かどうかはわかりませんが?
FULL
またはBULK_LOGGED
にある場合でもSIMPLE
、フルバックアップを行うまでは、データベースが存在するかのように動作します。