本文介绍如何使用SQL Server Management Studio或Transact-SQL在SQL Server中配置最大工作线程服务器配置选项。

max worker threads选项配置SQL Server可用于处理查询请求、登录、注销和类似应用程序请求的工作线程数。

SQL Server使用操作系统的本地线程服务来确保以下条件:
·一个或多个线程同时支持SQL Server支持的每个网络。
·一个线程处理数据库检查点。
·一个线程池处理所有用户。

max worker threads的默认值为0。这使SQL Server能够在启动时自动配置工作线程数。默认设置适合大多数系统。但是,根据你的系统配置,将最大工作线程数设置为特定值有时会提高性能。

查询请求的实际数量可能会超过max worker threads中设置的值,在这种情况下,SQL Server将工作线程池化,以便下一个可用的工作线程可以处理请求。工作线程仅分配给活动请求,并在请求得到服务后释放。即使发出请求的用户会话/连接保持打开,也会发生这种情况。

max worker threads配置选项不会限制引擎内可能产生的所有线程。LazyWriter、Checkpoint、Log Writer、Service Broker、Lock Manager或其他任务所需的系统线程在此限制之外生成。可用性组使用max worker threads限制内的一些工作线程,但如果超过配置的线程数,也使用系统线程,以下查询将提供有关系统任务产生的额外线程信息。

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 s.is_user_process = 0;

以下是设置建议:

此选项是一个高级选项,只能由经验丰富的数据库管理员或经过认证的SQL Server专业人员进行更改。如果你怀疑存在性能问题,有可能不是工作线程的可用性原因。原因更可能与占用工作线程而不释放它们的活动有关。比如长时间运行的查询或瓶颈(I/O、阻塞、闩锁等待、网络等待)。最好在更改最大工作线程设置之前找到性能问题的根本原因。

当大量客户端连接到服务器时,线程池有助于优化性能。通常,会为每个查询请求创建一个单独的操作系统线程。但是,对于数百个与服务器的连接,每个查询请求使用一个线程会消耗大量系统资源。max worker threads选项使SQL Server能够创建一个工作线程池来服务更多的查询请求,从而提高性能。

下表显示了根据CPU、计算机体系结构和SQL Server版本的各种组合自动配置的最大工作线程数(当值设置为0时),使用公式:默认最大工作线程数+((逻辑CPU-4)*每个CPU的worker线程数)

Number of logical CPUs 32-bit computer (up to SQL Server 2014 (12.x)) 64-bit computer (up to SQL Server 2016 (13.x) SP1) 64-bit computer (starting with SQL Server 2016 (13.x) SP2 and SQL Server 2017 (14.x))
<= 4 256 512 512
8 288 576 576
16 352 704 704
32 480 960 960
64 736 1472 1472
128 1248 2496 4480
256 2272 4544 8576

截至SQL Server 2016 (13.x) SP1,每个CPU的worker线程数取决于cpu的架构(32位还是64位):

Number of logical CPUs 32-bit computer Note 1 64-bit computer
<= 4 256 512
> 4 256 + ((logical CPU's - 4) * 8) 512 Note 2 + ((logical CPU's - 4) * 16)

从SQL Server 2016 (13.x) SP2和SQL Server 2017 (14.x)起,每个CPU的worker线程数取决于cpu的架构(32位还是64位)和处理器的个数:

Number of logical CPUs 32-bit computer Note 1 64-bit computer
<= 4 256 512
> 4 and <= 64 256 + ((logical CPU's - 4) * 8) 512 Note 2 + ((logical CPU's - 4) * 16)
> 64 256 + ((logical CPU's - 4) * 32) 512 Note 2 + ((logical CPU's - 4) * 32)

当所有工作线程都在长时间运行的查询中处于活动状态时,SQL Server可能会显示为无响应,直到工作线程完成并变得可用。虽然这不是缺陷,但有时可能是不可取的。如果某个进程似乎没有响应并且无法处理新查询,则使用专用管理员连接(DAC)连接到SQL Server,并终止该进程。为防止这种情况,请增加最大工作线程数。

  

【SQLServer】max worker threads参数说明的更多相关文章

  1. 【SQLServer】max worker threads参数配置

    查看和设置max worker threads USE master; //选中你想设置max worker threads的数据库.master表示在实例级别进行设置 GO EXEC sp_conf ...

  2. dfs.datanode.max.transfer.threads

    An HDFS DataNode has an upper bound on the number of files that it will serve at any one time: <p ...

  3. Node.js躬行记(23)——Worker threads

    Node.js 官方提供了 Cluster 和 Child process 创建子进程,通过 Worker threads 模块创建子线程.但前者无法共享内存,通信必须使用 JSON 格式,有一定的局 ...

  4. C/C++ Threads): Creating worker threads that will be listening to jobs and executing them concurrently when wanted

    Suppose we have two workers. Each worker has an id of 0 and 1. Also suppose that we have jobs arrivi ...

  5. 【转】怎样查出SQLServer的性能瓶颈

    怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url]--原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQ ...

  6. SQLServer 维护脚本分享(06)CPU

    --CPU相关视图 SELECT * FROM sys.dm_os_sys_info SELECT * FROM sys.dm_exec_sessions SELECT * FROM sys.sysp ...

  7. 怎样查出SQLServer的性能瓶颈

    怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url]--原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQ ...

  8. 带您理解SQLSERVER是如何执行一个查询的

    原文地址:http://www.cnblogs.com/lyhabc/p/3367274.html 看这篇文章之前,阁下可以先看一下下面的文章 SQLSERVER独特的任务调度算法"SQLO ...

  9. sqlserver日常维护脚本

    SQL code --备份declare @sql varchar(8000) set @sql='backup database mis to disk=''d:\databack\mis\mis' ...

随机推荐

  1. 7 个有趣的 Python 实战项目,超级适合练手

    关于Python,有一句名言:不要重复造轮子. 但是问题有三个: 1.你不知道已经有哪些轮子已经造好了,哪个适合你用.有名有姓的的著名轮子就400多个,更别说没名没姓自己在制造中的轮子. 2.确实没重 ...

  2. Python|range函数用法完全解读

    写在前面的一些过场话: 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至 ...

  3. 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()

    UI自动化中的重要工作就是元素定位了,高效精准的定位方法可以让工作事半功倍. 在过去的一段web自动化经历中,使用的selenium库支持了多种定位方法,我们可以利用这些定位方法来做进一步封装,写出符 ...

  4. 『现学现忘』Git后悔药 — 30、版本回退git reset --hard命令说明

    git reset --hardcommit-id命令:回退到指定版本.(hard:强硬,严格的回退) 该命令不仅移动了分支中HEAD指针的位置,还将工作区和暂存区中数据也回退到了指定的版本. (提示 ...

  5. Linux shell脚本进阶使用

    shell的循环控制语句 - continue:提前结束某次循环,重新开始下一次 - break:提前结束某层循环 范例: #求100以内的奇数和 #!/bin/bash sum=0 for i in ...

  6. 001 Redis 配置

    Redis缓存 1.配置Redis //Redis 配置文件 @Configuration public class RedisConfiguration { @Bean public RedisTe ...

  7. 5-6 Elasticsearch

    Elasticsearch概述 什么是Elasticsearch elastic:富有弹性的 search:搜索 在计算机开发界简称ES 这个软件不是SpringCloud的组件,甚至其他语言都可以使 ...

  8. super与this关键字图解和java继承的三个特点

    java继承的三个特点 java语言是单继承的 一个类的直接父类只能有一个 class A{} class B extends A{}//正确 class C{} class D extends A, ...

  9. js for和while两种99乘法表

    <script type="text/javascript"> for(var i=1; i<=9; i++) { for(var j=1; j<=i;j+ ...

  10. fiddler抓包手机请求(转)

    http://ju.outofmemory.cn/entry/22854 从事前端开发的同学一定对Fiddler不陌生,它是一个非常强大的http(s)协议分析工具,如果你不知道它是什么,可以自行go ...