MSSQL内存架构及管理

1.  MSSQL内存架构

相比较Oracle,MSSQL的内存区域并没那么清晰,但和Oracle类似,MSSQL内存区域大体也可以分为三个部分:buffer pool,query/workspace memory,其他cache/memory。下面,我们分别对这三个内存区域做简要介绍:

1)  Bufferpool:

Buffer pool 作为MSSQL内存主要组件之一,其包括和管理MSSQL的数据缓冲。其中,buffer pool 中的每个buffer为8k大小的内存页(当然,MSSQL 64位系统上也支持large page,这里不做讨论,感兴趣的同学可以参考其他文档),与数据或索引页大小相同,这样,整个buffer pool就由这种8k大小的buffer组成。可以通过以下SQL语句来查询各数据库的buffer pool信息:

select database_id

,case database_id

when 32767 then ‘resourcedb‘

else db_name(database_id)

end as ‘database‘

,count(*)*8/1024 as ‘cached size (MB)‘

from sys.dm_os_buffer_descriptors

group by db_name(database_id),database_id

order by ‘cached size (MB)‘ desc;

2)  Query/workspacememory:

类似Oracle的PGA,MSSQL中,query memoy(也称为workspace memory)用于存储查询执行时哈希和排序期间的临时结果。虽然大家都知道Oracle的PGA,但MSSQL的query memory也许并没有太多文档可读,因此,也并没有太多人清楚和知道,包括MSSQL的background process,memory components等内部的一些细节和内容,都是这种现状,这也许和多方面因素相关,这里不做太多的探讨。但是,当你仔细的查看MSSQL中SQL语句的查询计划时,你会清楚的看到hash和sort等操作相关的query memory内容。

Query memory的分配出自buffer pool,因为,MSSQL内存管理器非常清楚其内存的整个分配和使用情况,这点也许和Oracle的PGA有点不同,因为,Oracle为进程模型,在其buffer pool和PGA之间转换和分配可能会比MSSQL更加复杂些,这也是MSSQL线程模型的特点和优势,关于这点,大家自己思考吧,这里不做过多的阐述。

Query memory空间可以占到buffer pool大小的25%和75%之间,但是,当buffer pool不存在内存压力时,query memory也可以进一步增长。对于所有代价低于3和query memory需求低于5M的小查询,其query memory可以为之保留整个query memory5%的空间。单个查询最多能占到整个query memory的20%以保证其他查询的正常执行,这点来说,与Oracle的PGA非常类似。可以通过以下SQL语句来获取查询语句的query memory及相关授权情况:

select session_id,sql_handle,grant_time,requested_memory_kb

,granted_memory_kb,used_memory_kb

from sys.dm_exec_query_memory_grants

order bygranted_memory_kb desc;

select sum(isnull(requested_memory_kb,0))requested_memory_kb

,sum(isnull(granted_memory_kb,0))granted_memory_kb

,sum(isnull(used_memory_kb,0))used_memory_kb

from sys.dm_exec_query_memory_grants

orderby granted_memory_kb desc;

3)  其他cache/memory:

MSSQL内存区域,除了上面讲述的buffer pool和query/workspace memory外,剩下的那就是其他cache/memory部分,该部分内存用于MSSQL中所有不能放于前述两个内存区域的内存组件。这部分虽然不像Oracle中定义的那么清晰,但基本相当于Oracle中的SGA中除去buffer pool外的其他组件,这其中,主要是shared pool。该部分区域,虽然占据的内存不多,但包含众多的内存组件,也很重要。我们可以通过以下SQL语句来查询其相关信息:

select [name],[type],pages_kb,entries_count

from sys.dm_os_memory_cache_counters

order by pages_kb desc;

此外,log cache/buffer也是大家比较关心的一个内存组件,相较于Oracle来说,MSSQL对这个内存区域的持比较保守的态度,不管是官网还是其他资料,对这块区域都未曾提及。Oracle中,我们既可以很容易的查看该区域的大小,也可以很容易的对该区域大小进行配置和更改;然而,MSSQL中该区域则是截然相反,我们对该区域既不能查看,也不能修改,真相估计也只有微软内部清楚。纵观所有可以查阅的资料,我们只是知道,MSSQL实例中的每个数据都有一个log cache/buffer,其为一段连续的内存区域,其大小并不固定,最大大小不过60k,用户不能干预该区域的管理和设置,该区域由MSSQL实例自动动态管理,仅此而已,也希望有清楚和知道这部分机制和管理配置方法的同学随时联系和讨论,先谢谢了。

2.  动态内存管理

MSSQL默认的内存管理行为动态内存管理,即在不造成系统层面内存短缺的前提下,尽可能多的获取其所需的内存,MSSQL通过windows的内存通知APIs来实现这点。这点来讲,和Oracle11g的AMM非常相似,只不过,MSSQL几乎一直是这种内存管理方式,而Oracle则是在11g之后的版本才实现,这其中涉及进程模型及内存共享实现方面的内容和细节,这里不再深入探讨。

当MSSQL启动时,将会基于各种因素(像:系统上的物理内存,服务器线程数,以及各种启动参数等)计算MSSQL进程地址空间的大小,MSSQL将会保留这个计算出大小的内存空间,但它仅仅获取当前负载需要的物理内存空间。

接下来,当更多用户连接和运行查询时,为了支撑更多的负载,MSSQL会按需获取另外的物理内存。MSSQL实例会继续获取物理内存,直到达到它的max server memory目标,或者windows通知不再有额外的自有内存可用,此时,如果实例获取的内存大于min server memory且windows通知自由内存短缺时,则MSSQL会释放内存。

Min server memory和max server memory配置选项建立了MSSQL实例所用内存的上下限。MSSQL并不会立即获取min server memory确定大小的内存,开始仅仅获取实例初始化所需大小的内存,此后,随着MSSQL实例上负载的增加,其不断获取内存以支撑这些工作负载,期间,MSSQL实例内存达到min server memory前不会释放任何已获取的内存,一旦达到min server memory值后,MSSQL实例会利用其内部内存相关算法按需获取和释放内存,和之前不同的是,MSSQL实例不再会释放内存至min server memory确定值之下,也不会获取内存至max server memory确定值之上。

实际上,MSSQL2012之前的版本中,min/max server memory并非指MSSQL实例所占用和管理的所有内存,而仅仅是指MSSQL实例中的buffer pool大小,而MSSQL实例的其他内存组件则在此之外,而MSSQL2012之后的版本中,这一切发生了变化,min/max server memory几乎包括了MSSQL实例所占用和管理的所有内存,MSSQL实例完全根据其上负载按需动态的获取和释放内存。

当运行MSSQL实例的同一计算机上其他应用启动时,它们会消耗内存且自由物理内存降到MSSQL内存目标值以下时,MSSQL实例开始调整自己的内存消耗。当其他应用停止且更多内存变得可用时,MSSQL实例开始增加它的内存分配。MSSQL实例每秒钟能释放和获取数MB的内存,以便迅速的调整内存分配。至于MSSQL实例内存使用方面的信息,可以通过以下SQL来查询:

select name,value,value_in_use,[description]

from sys.configurations

where namelike‘%server memory%‘

order by name;

select physical_memory_in_use_kb,locked_page_allocations_kb,

page_fault_count,memory_utilization_percentage,

available_commit_limit_kb,process_physical_memory_low,

process_virtual_memory_low

from sys.dm_os_process_memory;

原文地址:https://www.cnblogs.com/lhdz_bj/p/9253434.html

时间: 2024-10-31 08:34:08

MSSQL内存架构及管理的相关文章

第二十章 内存等空间管理类的实现

                   第二十章   内存等空间管理类的实现      空间.时间对我来说,或许永远是一个迷.即使我曾经深入到原子的最深处,即使人类科学家是自欺欺人,即使我了解到的最深层次的部分真理是正确的:那又能怎样?那都是过去式,在那光明与黑暗一体之地.我的灵魂受伤了:我不得不回到电脑这块充满垃圾的地方修心养性. 或许我的论述方法不好,要完全理解本章是有点难度:你要对简单的空间概念需要一定的理解,即使只是论述1D的线性平面空间中的2个基本方法:分配与释放,但也很复杂.要知道LI

Linux性能及调优指南(翻译)之Linux内存架构

本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译原文地址:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf原文作者:Eduardo Ciliendo, Takechika Kunimasa, Byron Braswell 译文如下: 1.2 Linux内存架构 为了执行一个进程,Linux内核为请求的进程分配一部分内存区域.该进程使用该内存区域作为其工作区并执行

Linux:综合架构批量管理服务(ansible)-- 下

综合架构批量管理服务之--ansible 00. 介绍部分 1) 利用剧本功能简单完成服务一键化部署 2) 主机清单配置 3) 剧本的扩展配置功能 4) 多个剧本如何进行整合 5) 剧本的角色目录??? 01. 知识回顾 1) 将所有模块进行了讲解说明 command 模块: 在远程主机上执行命令操作 默认模块 shell 模块: 在远程主机上执行命令操作 万能模块 PS: 有时剧本不能反复执行!!! script 模块: 批量执行本地脚本 copy 模块: 用于批量分发传输数据信息 fetch

Java内存分配、管理小结

 想写这篇总结酝酿了有个来月了,却始终感觉还差点什么东西,一直未敢动笔. 最近两天连夜奋战,重新整理下前面查阅的资料.笔记,还是决定将它写出来. 现在提出几个问题,如果都能熟练回答的大虾,请您飘过.如以往一样,我是小菜,本文自然也是针对小菜阶层的总结. 首先是概念层面的几个问题: Java中运行时内存结构有哪几种? Java中为什么要设计堆栈分离? Java多线程中是如何实现数据共享的? Java反射的基础是什么? 然后是运用层面: 引用类型变量和对象的区别? 什么情况下用局部变量,什么情况下用

架构与管理相通

架构师与工程师之间的差别并不在于年纪 ,而是在于视角的不同以及各方面积累的差别. 首先是意识.作为架构师,不能仅仅关注怎么去实现一个功能,还得去琢磨为什么这么做.怎样才能做得更好.应该在什么场景采用什么样的技术方案等问题.另外还得去关注测试.部署.项目管理的方式等方面,甚至要去了解用户的需求.公司业务的需求.如果一直考虑这些事情,时间长了.经验多了,就会有比较好的整体概念或视图在脑中,综合素质会得到提升,明白功能只是最基本的,系统的可用性.稳定性.可扩展性更为重要. 其次是积累.IT技术一直在演

Java并发编程里的volatile。Java内存模型核CPU内存架构的对应关系

CPU内存架构:https://www.jianshu.com/p/3d1eb589b48e Java内存模型:https://www.jianshu.com/p/27a9003c33f4 多线程下的缓存一致性问题:https://www.jianshu.com/p/97dc5242c3a6 java volatile关键字解惑:https://www.jianshu.com/p/195ae7c77afe Google-Java Memory Model:https://www.jianshu.

NUMA(非一致性内存架构)

https://blog.csdn.net/vanbreaker/article/details/7492886 一.基本概念 非一致性内存架构(Non-uniform Memory Architecture)是为了解决传统的对称多处理(Symmetric Multi-processor)系统中的可扩展性问题而诞生的.在对称多处理系统中,处理器共享北桥中的内存控制器来达到共同访问外部内存和IO的目的,也就是说所有的处理器对内存和I/O的访问方式和开销都是相同的.在这种系统中,随着更多的处理器被添

Linux学习-内存与磁盘管理

内存与磁盘管理 内存和磁盘使用率查看 常用命令 free 显示内存总的大小,-m以多少m显示,-g以多少g显示.主要查看used使用了多少,available还有多少可用.若开始往swap中写入内存,则说明内存真的不足了,需要扩大. top 查看进程的消息,以及内存的状态和实时变化 查看命令 fdisk 即可以查看磁盘,又能对磁盘分区 fdisk -l 查看磁盘具体信息 ls -l /dev/sd* 查看具体的磁盘,磁盘是块设备,最好谨慎操作.Liunx 划分大小是以扇区进行区分 parted

23. SQL -- SQL Server安装,运行架构,管理SQL

SQL SERVER 2008 安装   SQL SERVER 2008 版本: 版本 说明 精简版: 对于断开客户或单机应用 工作组版 :数据库工作组或分支机构的运营 标准版: 数据库服务器部门级应用(nomirror\partition\db snapshot) 企业版: 高扩展性和可用性的企业级数据库(具体参考文档:2008 版本功能及参数比较) 开发版: 企业版,用于开发和测试许可 Web 版: 允许托管公司提供低成本,高可扩展的托管与低月使用费 移动版:  紧凑型数据库的智能手持设备