誰が私のワーカースレッドを使用していますか?SQL Server 2014-HADR


10

最近、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のワーカースレッドを使用できますが、問題が発生したとき、ワーカーは残っていませんでした。

-119使用可能なスレッド

今日、どこからともなく、利用可能な労働者は327から50に減少しましたが、1分間だけで、その後約400に戻りました。

他の質問(HADRのワーカースレッドの使用率高い)はすでに見ましたが、それでも役に立ちません。

私たちのシステムは1年以上問題なく安定して動作しました。データベースのディストリビューションにフェイルオーバーやその他の大きな変更はありません。

レプリカ間で「同期コミット」を使用しています。私の理解では、圧縮は含まれていないため、ドキュメントの可用性グループの圧縮の調整を参照してください。

誰がすべてのワーカースレッドを使用しているのか考えていますか?

編集:正確にそれらの問題に関する多くの情報があるこのページを見つけました http://www.techdevops.com/Article.aspx?CID=24

回答:


1

コミュニティwikiの回答

可用性グループに多数のデータベースがあり、それがスレッドの目的です。圧縮、暗号化、およびトランスポートのコストには多くのことが関係しています。圧縮をオフにしてみてください。これにより、スレッドの使用量が約3分の1になります(レプリカの数によって異なります)。

質問にはSQL Server 2014のタグが付けられており、デフォルトで圧縮が使用されます。SQL Server 2016では、デフォルトで、同期に圧縮は使用されません。

インスタンスのワーカースレッドを増やす必要がある場合があります。つまり、複数のサーバーで最もアクティブなスレッドと非アクティブなスレッドのバランスをとります。関連するQ&A AlwaysON可用性グループのクエリが非常に遅いのを参照してください。

また、リクエストを適切に閉じることができないアプリケーションである場合もあります。これにより、多くの睡眠セッションが発生する可能性があります(これにより、ワーカーが消費されます)。

実際に使用されるスレッドの数は、データベースのアクティブ度によって異なります。1,000個のデータベースを使用でき、ほとんどが95%の時間アイドル状態であれば、問題は発生しません。データベースがより頻繁にアクティブになり、スレッドをより多く消費しているようです。それは長くて短いです。

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