AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 237749
Accepted
John K. N.
John K. N.
Asked: 2019-05-10 06:40:32 +0800 CST2019-05-10 06:40:32 +0800 CST 2019-05-10 06:40:32 +0800 CST

Windows 操作系统量子与 SQL 操作系统量子

  • 772

简单的问题

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 毫秒。现在会发生什么?

sql-server
  • 2 2 个回答
  • 2195 Views

2 个回答

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2019-05-10T08:07:55+08:002019-05-10T08:07:55+08:00

    即使调度程序不是抢占式的,SQL Server 调度程序仍然坚持一个时间片的概念。与操作系统强制 SQL Server 任务放弃 CPU 相比,它们可以请求定期放入等待队列,并且如果它们已超过内部定义的 4 毫秒时间间隔并且不在操作中间无法阻止,他们自愿放弃 CPU。

    -“ Microsoft SQL Server 2012 内部”,Kalen Delaney 等。人。pp38

    -第 2 章“SQLOS”乔纳森·凯哈亚斯

    因此,SQL Server 中的“量子”概念更像是编程任务的“指南”。IE 当你写一个任务时,比如一个执行表扫描的任务,如果你没有碰到任何页锁存器、IO 锁存器或锁等待一段时间,你应该停止你正在做的事情并要求成为放回可运行队列,以防有其他任务在等待。

    但是这取决于任务程序员来实现,而且每种任务可能不完全是4ms。例如,表扫描任务可能使用基于扫描页数的简单启发式方法来实现屈服点。

    所以

    SQL 操作系统启动一个时间片(4 毫秒),3.5 毫秒后,操作系统时间片决定停止当前的 SQL 操作系统线程,该线程在产生调度之前还有 0.5 毫秒。现在会发生什么?

    如果 SQL Server 线程在任务运行时被 Windows 抢占,它将被暂停,并且当它的线程下一次在 CPU 上调度时,它将从中断的地方继续。大概它将继续消耗其 4ms 量子的余额,因为它不知道有什么区别。但同样,yield 行为是任务的实现细节,而不是 SQLOS 的行为,因此不同的任务在这里的行为可能不同。

    • 14
  2. 3 revsuser126897
    2019-08-29T20:50:46+08:002019-08-29T20:50:46+08:00

    回答最初作为评论留下的贡献

    SQL Server Quantum (4 ms) 如何与 Server OS Quantum (通常为 187.5 ms) 同步?

    它不是,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 编写,但仍然相关):

    先发制人与合作任务

    相比之下,UMS 依赖于线程自愿让步。UMS 采用它所做的方法是为了避免在绝对必要的情况下涉及 Windows 内核。在一个系统中,可以指望工作线程在应该的时候让出,协作调度器实际上比抢占式调度器更有效,因为调度过程可以根据应用程序的特定需求进行定制。正如我之前所说,UMS 比操作系统更了解 SQL Server 的调度需求。

    UMS 如何接管调度

    如果 UMS 是为了处理 SQL Server 的调度需求而不是允许 Windows 这样做,那么 UMS 必须以某种方式阻止操作系统执行它对所有其他进程所做的事情:按照它认为合适的方式在系统处理器上安排线程和关闭线程。你如何在抢占式操作系统中做到这一点?UMS 通过 Windows 事件对象的一些巧妙技巧实现了这一点。UMS 下的每个线程都有一个关联的事件对象。出于调度的目的,Windows 会忽略它认为不可行的线程——因为处于无限等待状态而无法运行的线程。知道这一点后,UMS 通过让线程在其相应的事件对象上调用WaitForSingleObject并将超时值传递给INFINITE将不想被调度的线程置于睡眠状态。

    为了防止 Windows 在同一个处理器上调度多个线程,从而产生上下文切换的开销和费用,UMS 试图让每个处理器只保持一个线程可行,即不处于无限等待状态。

    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve