.Net構成のアプリケーションから投げたクエリが不定期にタイムアウトする(SQLServer)
.Net 4.5(VB.net)で構築したバッチアプリケーション上において、
Sqlcommandから発行したSQLが不定期にタイムアウトします。
処理件数やサーバー負荷の状況によらず発生する為原因が掴めず…。
参考までに既に判明している内容をを以下に記述します。
- タイムアウトが発生するSQLコマンドは複数存在するが、内容は多様で一貫性が無い。
対象テーブル等に関係なく落ちる。 - 高負荷の処理が落ちやすい傾向があるようだが即時終了する場合の方が多い。
※タイムアウトしない場合はどのコマンドも即時終了する。 - アプリケーションの稼働最初期はタイムアウトしなかったが、
データレコードの増加に比例して発生頻度が高くなるわけではない - 複数ある対象テーブルは毎日2,000~6,000件のレコードが追加される。統計情報は1日1回更新
- SqlcommandのCommandTimeout、接続文字列のConnectionTimeoutはそれぞれ120秒を設定
- 基本的には再実行すれば処理が通る(ただし、稀に失敗する場合もある)
- 処理を妨げるようなデッドロックは発生していない(Profilerで確認済み)
- SSMSから同クエリを実行した場合は必ず成功する。SET ARITHABORT OFFを付けた場合も同様
- 当該アプリケーションとDBは同一サーバーで稼働しているのでネットワーク影響は考えにくい
- 本番環境のみで発生。本番DBをリストアした検証環境では再現しない
本番・検証環境は諸事情あって内容に差異が存在(この辺りが怪しいが、関連性が掴めず…)
・本番
Windows Server 2012 Standard(64-bit)
Microsoft SQL Server 2012 Standard (64-bit)
・開発
Windows Server 2012 R2 Standard(64-bit)
Microsoft SQL Server 2012 Standard(32-bit)※どちらもVMWare上で稼働。設定上のメモリ、CPUは同等。(4GB, 3.40GHz)
エラーメッセージは毎回以下の通り。
エラー内容:
Timeout に達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
内部エラー:
待ち操作がタイムアウトになりました。
2016/03/14 追記1
環境について質問頂いたため、いくつか知見を追加します。
- 保守部門にハードウェア障害が発生していないことは確認済み。HDDも支障なし
- 再起動は基本しない環境。
タイムアウト時にメンテナンスの意味合いで実施したこともあるものの、状況改善には至らず - Windows Updateの起動と相関が無いことは確認済み
- 本番環境での作業有無に依らず発生する(発生時間帯はオペレーター不在の為、間違いない)
- イベントログ等で発生時刻に走る別処理を確認したが、関連性のある処理は存在せず
- 当該TBLの断片化率に依らず発生する
2016/03/14 追記2
「コメント欄で回答しないように」とご指摘頂いたのでさらに追記。
- タイムアウト発生有無に依らず、クエリの実行計画は変わらない
- アプリケーションのトランザクション分離レベルはReadCommited
2016/03/15 追記
- 本番環境と仮想環境の仮想CPUはどちらも同数(2コア)