在设置新的 SQL Server 时,我使用以下代码来确定设置的良好起点MAXDOP
:
/*
This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
configuration. You will need to evaluate this setting in a non-production
environment before moving it to production.
MAXDOP can be configured using:
EXEC sp_configure 'max degree of parallelism',X;
RECONFIGURE
If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1
(URL wrapped for readability)
http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx
Biztalk (all versions, including 2010):
MAXDOP = 1 is only required on the BizTalk …
Run Code Online (Sandbox Code Playgroud) 假设我有一个带有 4 个套接字的 SQL Server,每个 NUMA 节点。每个插槽有 4 个物理内核。总共有 512 GB 的内存,因此每个 NUMA 节点有 128 GB 的 RAM。
密钥表被加载到第一个 NUMA 节点中。
假设我们从该表中读取了大量流量。如果拥有 NUMA 节点的插槽的所有物理内核的 CPU 利用率为 100%,这是否会对来自其他插槽的非本地 NUMA 访问成本产生负面影响?或者另一方面是非本地 NUMA 访问的成本与该套接字的繁忙程度无关?
我希望我的问题是有道理的。如果没有,请告诉我,我会尽力澄清。
上周我们的生产服务器出现了数据库问题,我们处理的一些业务似乎比其他业务受到的影响更大。我们有一些逻辑读取的查询需要超过 1 分钟。我们查看了大约 60% 的整体 CPU 利用率。我们没有查看特定于套接字的 CPU 指标。I/O 指标是平均的。
我们的 SQL 配置为最多使用 704 个线程,有时我们会收到警告,指出只剩下 10 个线程,所以我无法理解 SQL 是否保持线程打开,因为再次创建新线程的成本很高。
所以我的问题是
如何知道线程是否可用于新请求或当前正忙于其他请求。
我正在尝试task_address
从 sys.dm_exec_requests 与 sys.dm_os_tasks链接,worker_address
如下所示
select * from sys.dm_exec_requests ec
join
sys.dm_os_tasks tsk
on tsk.task_state=ec.task_address
join
sys.dm_os_workers wrk
on wrk.worker_address=tsk.worker_address
Run Code Online (Sandbox Code Playgroud)我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的
4.我可以使用下面的查询来发现我有工作线程饥饿吗
select status from sys.dm_Exec_requests
Run Code Online (Sandbox Code Playgroud)
如果状态为挂起,我可以假设 SQL 正在等待新的工作线程
sys.dm_os_Waiting_tasks
,我可以看到超过 2186 行,其中 90% 是针对同一个会话。所以我的问题是查询如何跨越这么多线程我会使用下面的查询获得可用的工人数量,这是正确的吗?
select (
select max_workers_count
from sys.dm_os_sys_info
) - (
select sum(active_workers_count)
from sys.dm_os_Schedulers
)
Run Code Online (Sandbox Code Playgroud)我在线程池上面临非常长的等待时间,有没有办法找出造成这种情况的原因?我们目前在 Windows Server 2008、16 CPU 上运行 SQL Server 2012 标准。连接数为 ~20k ,每分钟 30k 请求。我需要更多的 CPU 还是这是一个应用程序问题?
select COUNT(*) from sys.dm_os_workers
SELECT *
FROM sys.dm_os_wait_stats
WHERE wait_type = 'threadpool'
SELECT Count(* ) AS [UserSessions]
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
SELECT Count(* ) AS [SessionsOver60]
FROM sys.dm_exec_sessions
WHERE is_user_process = 1
AND last_request_end_time < Dateadd(mi,-15,Getdate())
Run Code Online (Sandbox Code Playgroud)
24 小时的 CPU 利用率图
我们有一个服务器,在 2 个 NUMA 上有 8 个 CPU,并启用了超线程。当前 Maxdop 设置为 8,但实际上应该按照本文的 Maxdop 部分设置为 4:
https://support.microsoft.com/en-us/kb/322385
所以我们需要把它改成4。
但是我的问题是将 maxdop 设置为 8 有什么影响?那么并行跨越两个 NUMAS 吗?我问的原因是我们刚刚遇到了一个奇怪的问题,查询返回非常慢,而 PLE 迅速下降。
即使没有针对 SQL 运行,PLE 也没有改进。CXPACKET 等待类型上升。然后突然 CXPACKET 等待类型完全下降,PLE 开始上升,现在已经恢复正常。
在这段时间里,对数据库执行了小查询,但并不是一个查询完成导致 CXPACKET 等待类型下降而 PLE 再次上升的情况 - 我们不知道是什么原因造成的。
一个可能的解释是 MAXDOP 设置不正确。
谁能向我解释跨 NUMA 节点并行执行的影响,是否与使用外部内存时耗尽工作线程和更慢的访问时间相同?
谢谢