小编Dan*_*tef的帖子

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

我们最近在 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 …
Run Code Online (Sandbox Code Playgroud)

sql-server availability-groups sql-server-2014

11
推荐指数
1
解决办法
4915
查看次数

是否可以查看哪个 SPID 使用哪个调度程序(工作线程)?

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

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

虽然我们能够通过将可用性组之一移动到另一台服务器来“解决”问题,但我想知道是否可以查看哪些查询在哪个调度程序(或工作程序或任务)上运行。

通过以下查询,我可以看到有多少工人可用、正在使用和等待资源:

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)

通过以下查询,我可以看到哪些工作人员正在哪个 CPU(核心)上运行:

SELECT *
FROM  sys.dm_os_Schedulers s --> Prozessoren Kerne
JOIN sys.dm_os_workers w ON w.scheduler_address = s.scheduler_address
JOIN sys.dm_os_tasks t ON t.task_address = w.task_address
WHERE s.status = 'VISIBLE ONLINE'
AND s.cpu_id = 2
Run Code Online (Sandbox Code Playgroud)

有什么方法可以找到哪个 …

sql-server dmv availability-groups sql-server-2014

6
推荐指数
1
解决办法
1438
查看次数