SQL Server 中的 MAX 工作线程 2012/14/16

Beg*_*DBA 2 sql-server sql-server-2012 sql-server-2014 cpu

我只是在浏览系统运行状况扩展事件时遇到一个事件,其中包含用于显示工作线程状态的查询处理的诊断结果:

  1. 当我有 80 个逻辑处理器时,为什么最大工作线程显示 2994,根据 msdn 计算,这里 512 + ((logical CPU's - 4) * 16)看起来不正确。但是,这里的最新链接对于大于 64 的逻辑处理器是有意义的,其中 16 的计算更改为 32。但是该链接说从 SQL 2017 开始,但是我得到的数字 2994 是针对 SQL2012, 14 16 的,其中逻辑处理器数为 80 . 我在这里遗漏了什么吗?

sp_configure 中的 max worker 设置设置为“0”

  1. 回到该系统运行状况事件状态,显示以下 no 的警告:

maxWorkers="2944" workersCreated="456" workersIdle="314" tasksCompletedWithinInterval="1021881" pendingTasks="1"

我应该检查其他东西还是可以忽略它?

Sea*_*ser 5

  1. 为什么当我有 80 个逻辑处理器时最大工作线程显示 2994 [...]

将该项目从 MSDN 复制到 Docs 时,似乎存在文档错误。您在 Dorr 的帖子中看到的内容是正确的,并且适用于 2012 SP4 + 最新的 CU。我将进行所需的文档更改。文档已更新。

  1. 回到那个系统健康事件状态显示警告以下没有 […]

您收到警告的原因是因为您有pendingTasks="1". 这可能表明调度程序存在问题,应进行调查。

我看到待处理的任务数有时会变化 2、4、8 甚至更高。

在您链接的同一 Docs 文章中,有一个查询可用于跟踪任务及其状态。看看它是否只是特定调度程序上的任务,只有登录任务等会很有趣。

SELECT  s.session_id, r.command, r.status,  
   r.wait_type, r.scheduler_id, w.worker_address,  
   w.is_preemptive, w.state, t.task_state,  
   t.session_id, t.exec_context_id, t.request_id  
FROM sys.dm_exec_sessions AS s  
INNER JOIN sys.dm_exec_requests AS r  
   ON s.session_id = r.session_id  
INNER JOIN sys.dm_os_tasks AS t  
   ON r.task_address = t.task_address  
INNER JOIN sys.dm_os_workers AS w  
   ON t.worker_address = w.worker_address  
WHERE t.task_state = N'PENDING'
Run Code Online (Sandbox Code Playgroud)