我们的 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)
- 如何知道线程是否可用于新请求或当前正忙于其他请求。
您可以使用 DMV sys.dm_os_schedulers来获取此信息。您必须参考的专栏是work_queue_count。根据 BOL,这意味着
待处理队列中的任务数。这些任务正在等待工人来接走。不可为空。
您可以使用以下查询来检查所有在线调度程序的等待任务数
select work_queue_count from sys.dm_os_scheduler where status='Visible online'
Run Code Online (Sandbox Code Playgroud)
我不确定你想要实现什么,但以下是我从这个博客中得到的内容
select wt.session_id,
ot.task_state,
wt.wait_type,
wt.wait_duration_ms,
wt.blocking_session_id,
wt.resource_description,
es.[host_name],
es.[program_name]
FROM sys.dm_os_waiting_tasks wt
INNER JOIN sys.dm_os_tasks ot
ON ot.task_address = wt.waiting_task_address
INNER JOIN sys.dm_exec_sessions es
ON es.session_id = wt.session_id
WHERE es.is_user_process = 1
Run Code Online (Sandbox Code Playgroud)
- 我可以看到处于暂停状态的计数超过 500。我没有看到任何阻塞
挂起的线程正在等待某些资源并且当前不活动。等待可以是 I/O、网络等。有关更多详细信息,请参阅我分享的博客。
- 我可以使用下面的查询来发现我有工作线程饥饿吗
不,这不是正确的查询。
停止使用 sys.sysprocesses 是旧视图,MS 不建议使用它。而是使用sys.dm_exec_requests
您可以使用 DMV sys.dm_os_scheduler 获取每个调度程序的工作线程数
select current_workers_count from sys.dm_os_scheduler where status='visible online'
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
15330 次 |
| 最近记录: |