SQL Server On Linux(15)—— SQL Server On Linux性能(1)——内置特性(1)——内置扩展性

本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》

在这里插入图片描述

SQL Server on Linux被微软高管称为最成功的的SQL Server产品,除了一系列的平台兼容和大数据兼容之外,性能方面也有很重要的提升,接下来的几篇会介绍关于SQL Server On Linux性能方面改进。

内置扩展性简介

  接下来的内容可能有点不好理解。SQL Server On Linux在设计和实现时,就考虑了如何动态扩展和最大化CPU、I/O及内存资源的使用,不管是在实体机还是虚拟机甚至容器中。
  实现这些扩展的组件是SQLOS,它是内置的组件,用于调度资源和提供内存服务。所有的SQL Server引擎组件都使用SQLOS来创建和执行任务,这些任务又由工作线程池来实现。
  SQLOS服务的调度系统是非抢占式的系统,这种非抢占式的行为(简单来说就是不提权操作)可以最小化内核上下文切换和最大化CPU资源利用。
  要实现这种目标,SQLOS会根据已发现的逻辑CPU数量创建一个调度列表(schedulers list),并从整个工作线程池中分配一组工作线程给每个调度器。
  当有一些如查询操作传入数据库时,就会产生新任务来处理这些操作,新任务会被分配到特定调度器的一个工作线程中执行。

具体内容可以参考T-SQL执行内幕(2)——Tasks、Workers、Threads、Scheduler、Sessions、Connections、Requests

  在NUMA架构中,调度系统可以自动侦查并通过节点来利用NUMA的优点。SQLOS可以把工作线程运行在NUMA节点中的任何CPU中,但是避免在非当前节点之外的节点上运行,从而减少外部内存访问的开销。对NUMA节点和CPU的识别使得SQL Server可以跨CPU执行工作从而最大化扩展性。简单来说NUMA 节点是CPU和内存的一个单元组,工作线程可以在一个节点内进行运作。并且列用节点之间的资源特别是CPU来分摊负载。另外SQL Server还可以按照节点和CPU对内部数据结构和列表进行分区,以确保高并发负载情况下代码尽可能少地出现瓶颈。不过作为普通用户,这部分不需要了解的非常深入。

使用DMV查看

  前面的部分略微术语化,不是很直观,那么我们使用DMV来看一下到底是什么样子。

调度、节点和CPU

  下面的DMVs可以用于查看这部分的信息:

  • sys.dm_os_schedulers:列出SQL Server用于工作线程调度的调度器,并且包括这些调度器的一些统计信息。

  使用下面脚本查看信息

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

  本系列的演示环境结果如下:
在这里插入图片描述
  从图的第三列可以看到有4个“VISIBLE ONLINE”值,这些是常规调度器,用于运行SQL Server任务和工作线程。然后有数个HIDDENT ONLINE的schedulers,用于一些后台或其他任务比如备份。

  有需要的可以参考一下官方文档的完整列表:sys.dm_os_schedulers (Transact-SQL)

  • sys.dm_os_nodes:列出所有已侦测的NUMA节点,如果没有NUMA架构则会有node_id=0的值,另外node_id=64是专用于DAC的节点。
    在这里插入图片描述

任务、worker和线程

  • sys.dm_os_workers:列出SQL Server所有工作线程,工作线程由scheduler创建,用于执行特定的任务,默认情况下,max worker threads=0,即动态,由SQL Server根据配置 max worker threads 服务器配置选项中的公式创建:

在这里插入图片描述
  可以使用sys.dm_os_sys_info来查看当前最大工作线程的值。这个配置值大部分情况下是最优配置,不建议修改,但是确实会有一些情况下会需要手动变更,在后续有机会在提及。

  • dm_os_tasks:每个SQL Server工作单元就是一个任务(task),比如登录、查询和后台任务等。说白了就是SQL Server执行的一个操作。任务由工作线程来执行,当工作线程繁忙时,任务就需要等待空闲工作线程。这种情况下,sys.dm_os_waiting_tasks中的wait_type会显示THREADPOOL。如果出现大量这种值,就应该关注SQL Server的性能问题。关于这个问题可以参考一下国外专家的两篇文章:https://www.sqlskills.com/help/waits/threadpool/
    和https://blogs.msdn.microsoft.com/psssql/2009/11/24/doctor-this-sql-server-appears-to-be-sick/。

Auto Soft NUMA

  这是从SQL 2016开始出现的新特性,这也是为什么一开始会提及NUMA,现代硬件架构已经支持超过每个CPU拥有8个物理核心的架构,过去简单使用NUMA架构可能会对新架构造成限制,为此SQL Server引入Auto Soft NUMA用于对节点和CPU进行逻辑分区从而提供更好的扩展性。因为本人环境没有足够的CPU数量可以模拟,所以这里没法演示。只能从网上偷几个图来用一下:
  下图显示机器有96个逻辑处理器,SQL Server一旦发现每个CPU有超过8个物理核心,就会自动启动Auto Soft NUMA,然后尝试对NUMA节点进行分区。使其逻辑NUMA节点尽可能接近每个节点8个CPU。
在这里插入图片描述
  自动经行NUMA和CPU的映射:
在这里插入图片描述

  关于这个新特性的技术细节可以参考官方博客:How It Works (It Just Runs Faster): Auto Soft NUMA,Auto Soft NUMA是默认开启,如果你觉得可能因此出现问题,可以使用ALTER SERVER CONFIGURATION来关闭。

小结

  本文以资源调度为切入点,简要提及一些在后续会用到的术语,比如调度、工作线程、任务,另外也介绍了一个SQL 2016的心特性Auto Soft NUMA技术。

发布了192 篇原创文章 · 获赞 1268 · 访问量 250万+

猜你喜欢

转载自blog.csdn.net/DBA_Huangzj/article/details/88060287