最近、SQL Server 2014 HADR環境で問題が発生し、サーバーの1つでワーカースレッドが不足しました。
メッセージを受け取りました:
AlwaysOn可用性グループのスレッドプールは、利用可能なワーカースレッドが十分にないため、新しいワーカースレッドを開始できませんでした。
問題を分析するのに役立つ(と思った)ステートメントを取得するために、別の質問を既に開いています(どのSPIDがどのスケジューラー(ワーカースレッド)を使用しているかを確認できますか?)。システムを使用しているスレッドを見つけるためのクエリを取得しましたが、サーバーがワーカースレッドを使い果たした理由がわかりません。
私たちの環境は次のとおりです。
- 4 Windows Server 2012 R2
- SQL Server 2014エンタープライズ
- 24プロセッサ-> 832ワーカースレッド
- 256 GB RAM
- 12個の可用性グループ(全体)
- 642データベース(全体)
したがって、問題が発生したサーバーには次の構成がありました。
- 5つの可用性グループ(3つのプライマリ/ 2つのセカンダリ)
- 325データベース(127プライマリ/ 198セカンダリ)
MAXDOP = 8
Cost Threshold for Parallelism = 50
- 電源プランは「高パフォーマンス」に設定されています
この問題を「解決」するために、1つの可用性グループをセカンダリサーバーに手動でフェールオーバーしました。そのサーバーの構成は次のとおりです。
- 5つの可用性グループ(2つのプライマリ/ 3つのセカンダリ)
- 325データベース(77プライマリ/ 248セカンダリ)
私はこのステートメントで利用可能なスレッドを監視しています:
declare @max int
select @max = max_workers_count from sys.dm_os_sys_info
select
@max as 'TotalThreads',
sum(active_Workers_count) as 'CurrentThreads',
@max - sum(active_Workers_count) as 'AvailableThreads',
sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
sum(work_queue_count) as 'RequestWaitingForThreads' ,
sum(current_workers_count) as 'AssociatedWorkers'
from
sys.dm_os_Schedulers where status='VISIBLE ONLINE'
通常、サーバーは約250〜430のワーカースレッドを使用できますが、問題が発生したとき、ワーカーは残っていませんでした。
今日、どこからともなく、利用可能な労働者は327から50に減少しましたが、1分間だけで、その後約400に戻りました。
他の質問(HADRのワーカースレッドの使用率が高い)はすでに見ましたが、それでも役に立ちません。
私たちのシステムは1年以上問題なく安定して動作しました。データベースのディストリビューションにフェイルオーバーやその他の大きな変更はありません。
レプリカ間で「同期コミット」を使用しています。私の理解では、圧縮は含まれていないため、ドキュメントの可用性グループの圧縮の調整を参照してください。
誰がすべてのワーカースレッドを使用しているのか考えていますか?
編集:正確にそれらの問題に関する多くの情報があるこのページを見つけました http://www.techdevops.com/Article.aspx?CID=24