内容简介:本人新书上市,请多多关照:SQL Server on Linux被微软高管称为最成功的的SQL Server产品,除了一系列的平台兼容和大数据兼容之外,性能方面也有很重要的提升,接下来的几篇会介绍关于SQL Server On Linux性能方面改进。
本人新书上市,请多多关照: 《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技术。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 写扩展性好的代码:函数
- 如何借助 Proxy 代理,提升架构扩展性
- AI公司的练级之道:如何更具扩展性?
- 漫谈分布式系统(十五):扩展性的最后障碍
- 漫谈分布式系统(七):扩展性?切就完了
- Sentinel 1.7.2 发布,完善开源生态及扩展性
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。