我正在查看查询存储等待统计信息并获得高并行等待类型。这只是重命名的 CX_packet 等待类型吗?
干杯
亚历克斯
我正在查看查询存储等待统计信息并获得高并行等待类型。这只是重命名的 CX_packet 等待类型吗?
干杯
亚历克斯
我正在阅读有关 SOS_SCHEDULER_YIELD 的内容,并且在阅读了大量有关内部结构(如时钟间隔、线程和量子)的内容后,我对它的工作原理有了很好的理解。
但是还有一个基本问题困扰着我——为什么工作线程会在 4ms 量子之后自愿让出处理器?根据我的理解,因为它是非抢先的:
如果它正在运行,它应该完成任务
如果它需要资源,它将返回等待队列。
这不像线程每 4 毫秒在 RUNNING 和 RUNNABLE 状态之间跳转,对吧?但正如我们所知,在某些情况下它会产生效果,我不确定为什么会发生这种情况。在决定将其从 RUNNING 状态中删除时,线程发生了什么。
编辑:我意识到有很多关于这种等待类型的问题,但我现在不考虑故障排除,而是我想了解什么可以使假设的运行线程产生 CPU。
关于SOS_SCHEDULER_YIELD
使用时的问题sys.dm_os_wait_stats
:
不应该与等待类型signal_wait_time_ms
完全相同吗?wait_time_ms
SOS_SCHEDULER_YIELD
对于其他等待类型,信号等待是指工作线程在调度程序的可运行队列中等待。因此,我得出结论,信号等待应该与总等待时间(= wait_time_ms
)SOS_SCHEDULER_YIELD
相同sys.dm_os_wait_stats
。
所以我的问题是,对于这个特定的等待类型,提到的两列在这个 DMV 中应该具有相同的值。
更具体地说,我正在研究一个signal_wait_time_ms
大于 wait_time_ms
的情况,我想解释一下这种差异。
我正在查看的示例来自 Van de Laar 的《Pro SQL Server 2019 等待统计》一书。在第 120 页的屏幕截图中,对于SOS_SCHEDULER_YIELD
.
我们看到应用程序超时,在 First Responder Kit 的帮助下,我捕获了详细信息。引起我注意的一件事是:
检测到毒药等待:线程池
所以我运行了以下查询:
---get thread pool waits---thread pool wait query
SELECT count(*) FROM sys.dm_os_waiting_tasks
where wait_type ='threadpool'
-- get threads available--Threads available query
declare @max int
select @max = max_workers_count from sys.dm_os_sys_info
select
@max as 'TotalThreads',
sum(active_Workers_count) as 'CurrentThreads',
@max - sum(active_Workers_count) as 'AvailableThreads',
sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
sum(work_queue_count) as 'RequestWaitingForThreads' ,
sum(current_workers_count) as 'AssociatedWorkers',
Getdate() as 'DateLogged'
from
sys.dm_os_Schedulers where status='VISIBLE ONLINE'
当我运行“线程池等待”查询时,线程池等待出现在上述结果(有时,超过 20 个结果)中的几分之一秒,然后在我再次运行时消失。但我可以通过“可用线程”查询在第二个结果集中看到 400 多个可用线程。
我无法理解为什么我在THREADPOOL
运行第一个查询时看到等待,但第二个查询显示线程仍然可用。任何人都可以解释一下吗?
我收到了一张来自 SolarWinds 的图表,其中显示了按天细分的顶级等待事件。在过去的 2 天里,每日颜色编码条的一部分代表 ASYNC_NETWORK_IO 总共 3 小时。仍在尝试查看我是否可以访问 Solar Winds 面板以尝试查看它是否可以深入了解图表。
在过去的 2 个小时里,我一直在搜索谷歌、网站和文档,但几乎没有发现任何结果告诉我如何深入研究这 3 个小时。
它是一个大块吗,是不是一天中的几分钟,它是否与任何特定的高 I/O 活动窗口(数据仓库刷新或其他东西)相匹配。
我所拥有的只是“在这里,昨天和前一天总共等待了 3 个小时,现在告诉我为什么” - 我必须承认我真的不知道如何进一步深入研究。
我读过各种关于“嗯,它通常是一个设计不佳的应用程序”或类似内容的文章。
有趣的是这是最后 7 天的,前 5 天都清楚。没有这种等待的迹象。突然有一大块。我需要知道如何挖掘更多。
据我所知,没有用户抱怨系统性能。
有DMV或什么可以帮助吗?
任何人都可以给我一些指示?
谢谢
由于我在 SQL Server 2014 (12.0.2370.0 (X64)) 上遇到了一些性能问题,因此我正在处理大量不同的等待类型。
前 5 种等待类型之一是“DIRTY_PAGE_POLL”。
我读过这种等待类型只会在我激活“间接检查点”功能时出现,该功能自 sqlserver 2012 以来就是 sql server 的一部分。
我的数据库都没有设置目标恢复时间。
那么,为什么我的 SQL Server 在没有间接检查点功能的情况下轮询脏页?
我目前正在查看我的等待统计信息。我遵循了Paul Randal解释的最佳实践,并仔细阅读了他引用的文档。
看看我现在每天一次从所有生产服务器获取的统计切片,我看到 Avg_Wait_S 的值非常高,这意味着总等待秒数除以 WaitCounts 的关系。与所有其他等待类型(最低)相比,等待计数的值非常低,但在我的每台服务器上,这种类型的 AvgWait_S 介于 120 到 2493 秒之间!这看起来像是一个巨大的等待时间。
我读到这无论如何可能是由备份引起的。但我想知道这是否是一种“正常”价值?如何获得有关它的更多详细信息?
这是我的等待统计数据的示例结果集:
WAITTYPE Wait_S Resource_S Signal_S WaitCount Percentage AvgWait_S AvgRes_S AvgSig_S
BACKUPIO 46151.80 45093.07 1058.74 22819151 26.55 0.0020 0.0020 0.0000
CXPACKET 45057.81 27926.59 17131.22 20387211 25.92 0.0022 0.0014 0.0008
BACKUPBUFFER 16658.83 15867.71 791.12 8993341 9.58 0.0019 0.0018 0.0001
PAGEIOLATCH_SH 15326.95 15284.65 42.30 2131848 8.82 0.0072 0.0072 0.0000
ASYNC_IO_COMPLETION 14203.17 14203.17 0.00 9 8.17 1578.1303 1578.1303 0.0000
WRITELOG 8570.20 8377.81 192.39 2136964 4.93 0.0040 0.0039 0.0001
PAGEIOLATCH_EX 7691.32 7673.31 18.01 1777069 4.43 0.0043 0.0043 0.0000
SOS_SCHEDULER_YIELD 4548.90 43.44 4505.47 13294384 2.62 0.0003 0.0000 0.0003
LCK_M_S 3018.76 3018.06 0.71 1704 1.74 1.7716 1.7712 0.0004
ASYNC_NETWORK_IO 2678.83 2147.78 531.05 4372825 1.54 0.0006 0.0005 0.0001
LCK_M_SCH_S 2612.09 2612.08 0.01 37 1.50 70.5971 70.5968 0.0003
我正在运行这篇文章中的查询:
http://sqlity.net/en/708/why-cxpacket-waits-are-not-your-performance-problem/
查看我的线程在等待类型为 CXPACKET 的挂起查询方面正在等待什么。
然而,对于有问题的 SPID,正在运行的线程显示等待类型为 NULL,而其他每个线程都处于 SUSPENDED 状态,等待类型为 CXPACKET。
我期待其中一个线程具有除 CXPACKET 以外的某种等待类型,谁能向我解释在这种情况下发生了什么?
谢谢
我正在尝试解决我们在生产 SQL Server 上看到的一些间歇性 CPU 峰值。我们正在运行具有 28 GB RAM 和 4 个 CPU 内核的 SQL Server 2008 R2 标准版。发生这种情况时,我们注意到大量的 RESOURCE_SEMAPHORE_QUERY_COMPILER 等待,持续大约一两分钟然后停止,然后 CPU 使用率恢复正常。
经过研究,我了解到这通常是由编译大量不可重用的执行计划引起的,我们目前正在对我们的应用程序进行更改以解决这些问题。
由于内存压力,计划缓存驱逐也会触发此行为吗?如果是这样,我将如何检查这个?我正在尝试查看是否有任何短期补救措施,例如升级服务器 RAM,直到我们部署应用程序修复程序。我能想到的唯一其他短期选择是将一些最繁忙的数据库移动到不同的服务器上。