我的新书上市了,敬请关注:《SQL On Linux运维实践2017版从入门到精通》
Linux 上的 SQL 被 高管称为最成功的 SQL 产品。 除了一系列的平台兼容性和大数据兼容性之外,在性能上也有重要的提升。 接下来的几篇文章将介绍SQL On Linux的性能。 提升。
内置扩展性简介
接下来的内容可能有点难以理解。 在设计和实现SQL On Linux时,我们考虑了如何动态扩展和最大化利用CPU、I/O和内存资源,无论是在物理机、虚拟机甚至是容器中。
实现这些扩展的组件是SQLOS,它是一个内置组件,用于调度资源和提供内存服务。 所有 SQL 引擎组件都使用 SQLOS 创建和执行任务,这些任务由工作线程池实现。
SQLOS服务的调度系统是一个非抢占式系统。 这种非抢占式行为(简单来说,没有提权操作)可以最大限度地减少内核上下文切换并最大限度地提高CPU资源利用率。
为了实现这个目标,SQLOS根据发现的逻辑CPU的数量创建一个调度列表(list),并从整个工作线程池中为每个调度程序分配一组工作线程。
当某些操作(例如查询操作)传入数据库时,会生成新的任务来处理这些操作,并将新任务分配给特定调度器的工作线程来执行。
具体内容请参考T-SQL执行内幕(二)-任务、、、、、、
在NUMA架构中,调度系统可以自动检测并利用跨节点的NUMA优势。 SQLOS可以在NUMA节点中的任何CPU上运行工作线程,但避免在当前节点以外的节点上运行,从而减少外部内存访问的开销。 对 NUMA 节点和 CPU 的感知允许 SQL 跨 CPU 执行工作,以最大限度地提高可扩展性。 简单来说,NUMA节点是CPU和内存的一个单元组,工作线程可以在节点内运行。 而节点之间的资源,尤其是CPU,则用来分担负载。 此外,SQL还可以根据节点和CPU对内部数据结构和列表进行分区,以确保代码在高并发负载下尽可能少地出现瓶颈。 不过,作为普通用户,这部分不需要理解得很深。
使用 DMV 查看
前面的部分有点术语化,不太直观,所以让我们使用 DMV 来看看它是什么样子的。
调度、节点和CPU
以下DMV可用于查看此部分信息:
使用以下脚本查看信息
select scheduler_id,cpu_id,status,is_online,current_tasks_count,current_workers_count,active_workers_count,work_queue_count
from sys.dm_os_schedulers
本系列的demo环境结果如下:
从图中第三列可以看到有4个“ ”值。 这些是用于运行 SQL 任务和工作线程的常规调度程序。 然后还有几个,用于一些后台或其他任务,例如备份。
如果有需要可以参考官方文档的完整列表:sys. (-SQL)
任务和线程
您可以使用 sys. 查看最大工作线程的当前值。 该配置值是大多数情况下的最优配置,不建议修改。 不过确实有一些情况是需要手动更改的,后面会提到。
这是SQL 2016以来出现的新特性。这也是开头提到NUMA的原因。 现代硬件架构已经支持每个 CPU 具有超过 8 个物理核心的架构。 过去,单纯使用NUMA架构可能会对新架构造成限制。 为此,SQL引入了Auto Soft NUMA对节点和CPU进行逻辑分区,以提供更好的扩展性。 因为我的环境没有足够的CPU来模拟,所以我无法在这里演示。 我只能从网上盗几张图来用:
下图显示该机器有 96 个逻辑处理器。 一旦SQL发现每个CPU的物理核心数超过8个,它就会自动启动Auto Soft NUMA,然后尝试对NUMA节点进行分区。 使其逻辑 NUMA 节点尽可能接近每个节点 8 个 CPU。
自动执行NUMA和CPU映射:
有关此新功能的技术详细信息,请参阅官方博客:How It Works (It Just Runs): Auto Soft NUMA。 默认情况下,自动软 NUMA 处于打开状态。 如果您认为可能因此而出现问题,可以使用 ALTER 将其关闭。
概括
本文以资源调度为出发点,简单提到了一些以后会用到的术语,比如调度、工作线程、任务等。 它还引入了SQL 2016的核心功能Auto Soft NUMA技术。