简单的问题
SQL Server Quantum (4 ms) 如何与 Server OS Quantum (通常为 187.5 ms) 同步?
简单问题解释
在使用了 184 毫秒的 OS 时间片(对应于 46 个完整的 SQL 时间片)之后,OS 时间片有 3.5 毫秒的时间才能将计划移交给不同的进程。SQL 操作系统启动一个时间片(4 毫秒),3.5 毫秒后,操作系统时间片决定停止当前的 SQL 操作系统线程,该线程在产生调度之前还有 0.5 毫秒。现在会发生什么?
深入了解 OS Quantum
在接下来的几节中,我将写出到目前为止我发现的关于 OS 量子以及如何计算量子持续时间的内容。操作系统“量子”的持续时间基于“滴答”,“滴答”本身的持续时间基于“时钟间隔”,通常为 15.625000 毫秒。但是让我详细说明一下...
打钩
在博客文章Know Thy Tick中,作者 Jim 解释了时钟间隔(又名“滴答声”)的基础知识以及它们的用途。
当我读到“时钟间隔……对于大多数 x86 多处理器来说大约是 15 毫秒”之类的内容时,我不得不确定我的时钟或“滴答”间隔的值。幸运的是,我读到这句话的书,Windows Internals Fourth Edition 提供了帮助我解决痛苦的参考。... 上述书籍的作者 Mark Russinovich 慷慨地在他的网站上提供了实用程序ClockRes 。运行这个实用程序,我能够确定我的 x86 多处理器 PC 上的时钟间隔是 15.625000 毫秒。有趣,但我好奇的心想知道更多。
量子
当然,滴答间隔重要的真正原因是它影响线程调度。Windows 调度程序在允许具有相同优先级的另一个任务运行之前,给每个线程一个“量子”的执行时间。调度程序分配给线程的量程是滴答间隔的倍数。为特定线程选择的特定量子值有点超出我想在本文中讨论的范围。
好的,所以我知道量子是什么,但不知道量子会运行多长时间。
现在,让我们检查一下 XPe 中前台线程的默认量子值。在这种情况下,Windows 调度程序分配 18 或 6 个滴答间隔。(是的,要将量子转换为滴答间隔,必须除以 3....,但倍数的原因是允许调度程序能够“充电”线程以执行导致其挂起的操作。)
我们现在知道时钟间隔(滴答声)应该在 15.625000 毫秒左右,并且在默认时间片为 18 的 Windows 桌面操作系统上,这将导致 6 个滴答声或 93.750000 毫秒(18 / 3 * 15.625000 毫秒)。
在 Windows Server 操作系统上,默认量程是不同的。“处理器调度”设置设置为“后台服务”
可以通过“系统设置|高级(选项卡)|性能(部分)|设置...”找到此设置,这将打开“性能选项|高级(选项卡)|处理器调度”
然后,默认量程设置为 36(背景)到 36(前景)。量子更大,因此更长。这是 Windows 桌面操作系统上 18(6 滴答)量子前台设置的 93.750000 毫秒的两倍,在为后台服务设置的服务器操作系统上约为 187.500000 毫秒。
观察/解释
当您在服务器或桌面上将设置从“后台服务”更改为“应用程序”时,注册表中的HKLM\SYSTEM\CurrentControlSet\Control\PriorityControl\Win32PrioritySeparation键将从 0x18 更改为 0x02。0x02 的默认量子值是多少?这可以在评论中找到:
值 0x02 表示“Short vs. Long”和“Variable vs. Fixed”字段是操作系统的默认值。
XPe 和 XP Pro 的这些字段的默认值是:Short 和 Variable,这与设置以下位相同:0x24。
将此值与 0x02 进行或运算得到 0x26,您可以在本文的表格中找到该值。
参考:对“掌握你的量子”的评论(MSDN 博客)
解释同一篇文章中的量子设置的表格:
Win32PrioritySeparation Foreground Background
0x28, 0x29, 0x2A 18 18
0x18, 0x19, 0x1A 36 36
0x24 6 6
0x25, 0x14 12 6
0x26 18 6
0x15 24 6
0x16 36 6
OS Quantum 的简短摘要
根据以上信息和文章引用,我们知道量程不是固定大小,而是源自系统属性中的操作系统设置。数量取决于Win32PrioritySeparation
注册表中的设置,该设置通常对应于“系统属性”(“后台服务”或“应用程序”)中的设置之一。
操作系统级别的量子是
- 对于“应用程序”设置
- 前台应用程序为 18(即 6 个滴答声)(93.75 毫秒)
- 6(即 2 个滴答声)用于后台应用程序(31.25 毫秒)
- 对于“后台服务”设置
- 36(即 18 个滴答声)用于前台应用程序(187.5 毫秒)
- 36(即 18 个滴答声)用于后台应用程序(187.5 毫秒)
因此,现在我们知道要针对后台服务进行优化的 Windows Server 设置上的操作系统量是...
36 / 3 * 15.625000 ms = 187.5 ms
SQL OS 量子
本节列出了我在 SQL OS 量子...
SOS_SCHEDULER_YIELD 等待类型
来自 Paul Randall 对 SOS_SCHEDULER_YIELD 等待类型的描述:
这种等待类型是当一个线程能够执行其完整的线程量子(在所有版本的 SQL Server 中为 4 毫秒,不可更改),因此自愿让出调度程序,移动到其调度程序中可运行队列的底部。
参考:SOS_SCHEDULER_YIELD(SQLSkills.com 等待类型)
SQL Server DMV 中的调度程序
在关于 sys.dm_os_schedulers DMV 的 SQL Server DMV 的说明中。
[...] Windows 使用抢占式调度机制,并为每个线程分配一定的 CPU 时间,当一个线程消耗它的时间时,它被发送到队列,其他线程被授予执行。
相反,当线程可以自愿放弃其时间量时,SQL Server 使用协作调度机制(当您具有 SOS_SCHEDULER_YIELD 等待类型时,您可以看到此行为)。这允许 SQL Server 优化 CPU 利用率,因为当一个线程被发出执行信号但尚未准备好运行时,它可以产生有利于其他线程的时间量。
参考:了解 SQL Server 调度程序、工作程序和任务(MSSQLTips.com)
检测 SQL Server CPU 压力
这是一篇关于 SQL Server 中的 CPU 压力的文章的一小部分。
当一个任务自愿让出调度程序以供其他任务执行时发生。在此等待期间,任务正在等待其量程被更新。
参考:检测 SQL Server CPU 压力(MSSQLTips.com)
sys.dm_os_schedulers (Microsoft Docs)
我想下面的引用是我能找到的关于 SQL OS 量子的最重要的信息片段:
quantum_length_us bigint Identified for informational purposes only. Not supported. Future compatibility is not guaranteed. Exposes the scheduler quantum used by SQLOS.
参考:sys.dm_os_schedulers (Transact-SQL) (Microsoft | Docs)
我的难题
Server OS Quantum 规定了授予 SQL Server 服务执行“任务”的时间。SQL Server OS Quantum 定义为 4 ms。如果我将 187.5 毫秒除以 4 毫秒,则剩下 3.5 毫秒。
我们甚至还没有开始讨论何时将时钟间隔设置为默认值 15.625000 毫秒以外的其他值....
简单的问题
SQL Server Quantum (4 ms) 如何与 Server OS Quantum (通常为 187.5 ms) 同步?
简单问题解释
在使用了 184 毫秒的 OS 时间片(对应于 46 个完整的 SQL 时间片)之后,OS 时间片有 3.5 毫秒的时间才能将计划移交给不同的进程。SQL 操作系统启动一个时间片(4 毫秒),3.5 毫秒后,操作系统时间片决定停止当前的 SQL 操作系统线程,该线程在产生调度之前还有 0.5 毫秒。现在会发生什么?
-“ Microsoft SQL Server 2012 内部”,Kalen Delaney 等。人。pp38
-第 2 章“SQLOS”乔纳森·凯哈亚斯
因此,SQL Server 中的“量子”概念更像是编程任务的“指南”。IE 当你写一个任务时,比如一个执行表扫描的任务,如果你没有碰到任何页锁存器、IO 锁存器或锁等待一段时间,你应该停止你正在做的事情并要求成为放回可运行队列,以防有其他任务在等待。
但是这取决于任务程序员来实现,而且每种任务可能不完全是4ms。例如,表扫描任务可能使用基于扫描页数的简单启发式方法来实现屈服点。
所以
如果 SQL Server 线程在任务运行时被 Windows 抢占,它将被暂停,并且当它的线程下一次在 CPU 上调度时,它将从中断的地方继续。大概它将继续消耗其 4ms 量子的余额,因为它不知道有什么区别。但同样,yield 行为是任务的实现细节,而不是 SQLOS 的行为,因此不同的任务在这里的行为可能不同。
回答最初作为评论留下的贡献
它不是,SQL Server 不使用抢占式调度。工作项目预计会达到屈服点,如果没有,你会得到
NONYIELDING
调度程序之类的东西。没有平价。SQL Server 不分配时间。它使某些线程对 Windows 具有吸引力以进行调度,而 Windows 会对其进行调度。量子只是一段时间的命名法。而已。SQL Server 不是抢占式的,它是运行在整个代码中的任何东西的责任。——肖恩·加拉迪当操作系统时间片到期时,线程被强制取消调度。这对 SQL Server 是透明的。SQLOS 无法检测到何时发生这种情况。没有用于此的 Win32 API。调度对用户模式线程是透明的。Windows 调度程序不知道也不关心用户模式线程在做什么。Windows 只看到可运行的线程,并让它们运行到其操作系统时间段结束或直到它们阻塞。-用户
在尼古拉·迪米特里耶维奇(Nikola Dimitrijevic)的如何处理 SQL Server 中过多的 SOS_SCHEDULER_YIELD 等待类型值中,术语“量子”本质上是指“任务实际分配给工作人员的时间”,但这与 Windows 量子的含义不同,这是操作系统将从 CPU 中删除线程的一段时间。它们只是不同的概念。如果操作系统因为已达到操作系统量程而强制线程结束执行,则会发生上下文切换。SQL Server 的线程被挂起,就像任何其他程序一样。– David Browne - 微软和George.Palacios。
文档摘录:在 SQL Server 2000 用户模式调度程序内部(为 SQL Server 2000 编写,但仍然相关):