谁在使用我的工作线程?SQL Server 2014 - HADR

Dan*_*tef 11 sql-server availability-groups sql-server-2014

我们最近在 SQL Server 2014 HADR 环境中遇到了一个问题,其中一台服务器用完了工作线程。

我们收到消息:

AlwaysOn 可用性组的线程池无法启动新的工作线程,因为没有足够的可用工作线程。

启动时的错误信息

我已经打开了另一个问题,以获得(我认为)应该帮助我分析问题的声明(是否可以查看哪个 SPID 使用哪个调度程序(工作线程)?)。虽然我现在有查询来查找正在使用系统的线程,但我不明白为什么该服务器用完了工作线程。

我们的环境如下:

  • 4 Windows Server 2012 R2
  • SQL Server 2014 企业版
  • 24 个处理器 --> 832 个工作线程
  • 256 GB 内存
  • 12 个可用性组(总体)
  • 642个数据库(总体)

因此,出现问题的服务器具有以下配置:

  • 5 个可用性组(3 个主要 / 2 个辅助)
  • 325 个数据库(127 个主要 / 198 个辅助)
  • MAXDOP = 8
  • Cost Threshold for Parallelism = 50
  • 电源计划设置为“高性能”

为了“解决”该问题,我们手动将一个可用性组故障转移到辅助服务器。该服务器的配置现在是:

  • 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'
Run Code Online (Sandbox Code Playgroud)

通常服务器有大约 250 - 430 个可用的工作线程,但是当问题开始时,没有工作人员离开。

-119 个可用线程

今天,可用的工人突然从 327 人下降到 50 人,但只持续了一分钟,然后又回升到 400 人左右。

我已经看到另一个问题(HADR high worker thread usage),但它对我没有帮助。

我们的系统稳定运行了一年多,没有任何问题。我们在数据库的分布方面没有任何故障转移或其他重大变化。

我们在副本之间使用“同步提交”。根据我的理解,不涉及压缩,请参阅文档中的可用性组的调整压缩

有没有人知道所有工作线程正在使用什么?

编辑:发现这个页面有很多关于这些问题的信息 http://www.techdevops.com/Article.aspx?CID=24

小智 3

社区维基回答

您在可用性组中有大量数据库,这将是您的线程所在的位置。压缩、加密和传输成本涉及很多内容。尝试关闭压缩,它会将线程使用量减少大约三分之一(取决于副本数量)。

该问题被标记为 SQL Server 2014,默认情况下它将使用压缩。默认情况下,SQL Server 2016 不会使用压缩进行同步。

您可能需要增加实例上的工作线程,或者更好:平衡多个服务器上最活跃的线程和不活动的线程。参见AlwaysON的相关问答可用性组查询非常慢

您可能还会发现它是一个无法正确关闭请求的应用程序。这可能会导致大量的睡觉时间(这会消耗工人的精力)。

实际使用的线程数取决于数据库的活跃程度。您可以拥有 1,000 个数据库,如果大多数数据库在 95% 的时间内处于空闲状态,那么您不会遇到任何问题。看来您的数据库变得更加活跃,并且占用了更多的线程。这就是它的长处和短处。