首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server线程状态

Server线程状态
EN

Database Administration用户
提问于 2015-09-08 12:03:08
回答 2查看 18.2K关注 0票数 6

我们的SQL配置为使用704个线程的最大值,有时我们会收到警报,说明只剩下10个线程,因此我无法理解SQL是否使线程保持打开状态,因为再次创建一个新线程是很昂贵的。

,所以我的问题是

  1. 如何知道线程是否可用于新请求或当前正在处理其他请求。
  2. 我试图将task_address从sys.dm_exec_requests链接到sys.dm_os_tasks和worker_address,如下所示,select *来自sys.dm_exec_requests ec,加入sys.dm_os_tasks tsk on tsk.task_state=ec.task_address,连接sys.dm_os_workers wrk on wrk.worker_address=tsk.worker_address

我没有看到任何输出,这是否意味着我可以假设所有线程都是空闲的

  1. 目前,下面是我的工作线程的状态,这个挂起意味着什么?我可以看到有500多个挂起的线程,我没有看到任何阻塞。

4.我是否可以使用下面的查询来发现我有工作线程饥饿

代码语言:javascript
复制
select status from sys.dm_Exec_requests

如果状态挂起,我是否可以假定SQL正在等待新的辅助线程?

  1. 目前我看到一个会话,在sysprocesses中有超过250个行,当我查询sys.dm_os_Waiting_tasks时,我可以看到超过2186行,其中90%用于相同的session.So --我在这里的问题是,一个查询如何跨越这些多个线程
  1. 我会使用下面的查询获得可用的员工计数吗,对吗?选择(从max_workers_count选择sys.dm_os_sys_info )-(从sys.dm_os_Schedulers中选择sum(active_workers_count) )
EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-09-08 12:50:27

  1. 如何知道线程是否可用于新请求或当前正在处理其他请求。

您可以使用DMV sys.dm_操作系统_调度器获取这些信息。您必须引用的列是work_queue_count。根据BOL的意思是

挂起队列中的任务数。这些任务正在等待一个工人来接他们。是不可空的。

您可以使用下面的查询来检查所有在线调度程序的等待次数。

代码语言:javascript
复制
select work_queue_count from sys.dm_os_scheduler where status='Visible online'
  1. 我不知道你想要实现什么,但下面是我从这个博客 select wt.session_id,ot.task_state,wt.wait_type,wt.wait_duration_ms,wt.blocking_session_id,wt.resource_description,es.主机_名字得到的,从程序_名字 sys.dm_os_waiting_tasks wt内连接sys.dm_os_tasks ot ON ot.task_address = wt.waiting_task_address内连接es.session_id = wt.session_id,其中es.is_user_process =1

  1. 我能看到有500多个有悬吊状态的人,我没有看到任何堵塞

挂起的线程正在等待某些资源,目前不活动。等待可以是I/O、网络等。关于更多细节,请看我分享的博客。

  1. 我是否可以使用下面的查询来发现我有工作线程饥饿

不,这不是正确的查询。

  1. 停止使用sys.sysprocesses是遗留视图,MS不建议使用它。而是使用sys.dm_exec_requests
  2. 您可以使用DMV sys.dm_os_scheduler获取每个调度程序的工作线程数,从sys.dm_os_scheduler中选择current_workers_count,其中状态=‘可见在线’
票数 2
EN

Database Administration用户

发布于 2015-09-12 10:50:02

我做了一些测试,在这里几乎没有发现我的question.Adding说明。

1.如何知道线程是否可用于新请求或当前是否忙于其他请求.

server将根据此公式分配线程,在sys.dm_os_sys_info中也可以找到相同的线程,默认情况下,SQL以初始线程开始,并将根据load.Point将线程上限提高到最大值,请注意,一旦创建了SQL就不会杀死线程,因为再次创建它们是昂贵的。

在我的例子中,我们过去只收到通知,说明只有1o线程可用,但我无法确定是否有可用的线程来服务请求。

因此,使用基于此博客的O应激工具进行小测试,并发现可用线程可以在任何时候使用下面的查询找到。

代码语言:javascript
复制
select (select max_workers_count from sys.dm_os_sys_info) as 'TotalThreads',sum(active_Workers_count) as 'Currentthreads',(select max_workers_count from sys.dm_os_sys_info)-sum(active_Workers_count) as 'Availablethreads',sum(runnable_tasks_count) as 'WorkersWaitingfor_cpu',sum(work_queue_count) as 'Request_Waiting_for_threads' 
from  sys.dm_os_Schedulers where status='VISIBLE ONLINE'

2.我正在尝试将task_address与sys.dm_exec_requests的sys.dm_os_tasks和worker adress联系起来,如下所示

如果我的问题不清楚,很抱歉,但我想检查查询是否并行运行。

任何并行查询都将在sys.dm_os_tasks + sys.sysprocesses中有一个条目,因此要运行哪些查询是并行运行的,我们可以在dmv下面使用。

代码语言:javascript
复制
select
 er.session_id,
 er.status,
 er.command,
 er.blocking_session_id,
 er.wait_type,
 ot.exec_context_id,
 ot.task_state,
 st.text
from
 sys.dm_exec_requests er
 join sys.dm_os_tasks ot on (er.session_id = ot.session_id)
 cross apply sys.dm_exec_sql_text(er.sql_handle) st
where er.session_id in
 (select session_id
 from sys.dm_os_tasks
group by session_id
having count(exec_context_id)>1)

3.下面是我的工作线程的状态,这个挂起意味着什么?我可以看到有500多个挂起的线程,我没有看到任何阻塞

由于许多原因,线程可以挂起,我选择了等待类型,所有的线程都在等待CXpacket。

4.我是否可以使用下面的查询来发现我有工作线程饥饿

若要了解是否正遭受工作线程饥饿的困扰,请使用以下查询。

代码语言:javascript
复制
select sum(work_queue_count) from sys.dm_os_schedulers
select * from sys.dm_os_tasks

select * from sys.dm_os_waiting_tasks where wait_type='threadpool'

目前我看到一个会话,在系统进程中有超过250个行,当我查询sys.dm_os_Waiting_tasks时,我可以看到超过2186行,其中90%是用于同一个session.So的--我在这里的问题是,一个查询如何跨越这些多个线程

根据我的理解,SQL在使用并行性时会产生许多线程,如果它们是可用的,并且线程的数量不限于CPU内核的数目,这就是在我的例子中发生的情况,所以我们将尝试检查为什么SQL认为这个查询成本很高,并将对其进行测试。

感谢网上的资源,我有一个误解,当一个线程被异步i/O阻塞时,我认为SQL会尝试将这项工作卸载到OS线程,但事实并非如此。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/114455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档