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

Dan*_*tef 6 sql-server dmv availability-groups sql-server-2014

我们最近在 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)

有什么方法可以找到哪个 SPID(以及最终哪个查询)在哪个线程上运行?

我已经搜索了一段时间,发现了一些关于调度程序、工作线程和线程之间连接的有趣信息,但如果可能的话,没有什么能真正向我展示:

我想看看哪个数据库使用了这么多工作线程。我们有一些(在我看来)不属于生产服务器的数据库。当我检查时sys.dm_exec_requests,似乎没有太多事情发生。

该环境在相同配置下运行了 1 年多,没有出现问题。有问题的服务器上有 24 个 CPU 和 5 个 AG,总共有 325 个数据库。3 AG 是主要的。为解决此问题,我们将具有 50 个数据库的 AG 从该服务器转移到辅助服务器。

Dan*_*tef 4

感谢所罗门·鲁茨基

scheduler_id您是否尝试过与 中的列关联sys.dm_exec_requests

我能够获得我正在寻找的信息。

通过此查询,我可以查看哪个会话正在使用哪个 CPU_ID(调度程序):

SELECT
    s.cpu_id,
    s.status,
    db_name(r.database_id) as [databaseName],
    w.last_wait_type, 
    w.return_code,
    t.task_state,
    t.pending_io_count,
    t.session_id,
    r.sql_handle
FROM  sys.dm_os_Schedulers s 
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
JOIN sys.dm_exec_requests r 
    ON r.scheduler_id = s.scheduler_id
order by 1,3
Run Code Online (Sandbox Code Playgroud)

为了获取正在运行的 SQL 语句,我将查询更改为:

SELECT
    s.cpu_id,
    s.status,
    db_name(r.database_id) as [databaseName],
    w.last_wait_type, 
    w.return_code,
    t.task_state,
    t.pending_io_count,
    t.session_id,
    r.sql_handle,
    te.text
FROM  sys.dm_os_Schedulers s 
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
JOIN sys.dm_exec_requests r 
    ON r.scheduler_id = s.scheduler_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) te   
order by 1,3
Run Code Online (Sandbox Code Playgroud)

但这只给了我(显然)具有 SQL_handle 的任务。

似乎该服务器上的大多数线程都被系统本身使用来保持所有内容同步。大多数工人被用作“系统工作”。这些任务中的大部分last_wait_typeREDO_THREAD_PENDING_WORKHADR_WORK_QUEUE

虽然我已经找到了我想要的答案,但我仍然没有找到问题的根源。我将为此提出另一个问题(谁在使用我的工作线程?SQL Server 2014 - HADR)。