SQL Server内存架构基础
SQL Server内存架构基础
翻译自:
https://mssqlwiki.com/sqlwiki/sql-performance/basics-of-sql-server-memory-architecture/
1. 32位SQL Server内存架构
在Win32内存架构里,每个进程有4GB的虚拟地址空间。默认情况下,2GB的地址空间可从用户模式访问(应用程序像SQL Server),剩下的2GB可从内核模式访问。
所以,在32位Windows架构里,SQL Server最大可用内存为2GB。
注意:当/3GB开关启用后,用户模式地址空间变为3GB,而内核模式变为1GB。当32位SQL Server运行在64位Windows下(WOW64),它获得4GB的用户地址空间。它也可以在WOW64模式下影响AWE,并可以使用多于4GB内存。
SQL Server“用户地址空间(User address space)”分为两个部分:MemToleave和Buffer Pool。
MemToLeave(MTL)和Buffer Pool(BPool)的大小由SQLServer在启动时决定,如下:
MTL(Memory to Leave) = (Stack size * max worker threads) +Additional space(By default 256 MB and can be controlled by -g)
Stack size = 512 KB per thread for 32 Bit SQL Server
I.e = (256 * 512KB) + 256MB = 384MB
加载DLL的额外空间从SQL Server 2000开始为256MB。该空间用于存储:
COM对象
扩展存储过程
进程中加载的链接服务器的内存分配或者在SQL Server进程中其他DLL的加载
SQL Server内存管理器的内存分配,如果分配大小大于8K需要持续内存(Multiple_pages_kb)。
SQLCLR
注意,加载DLL的额外空间可以使用-g启动参数修改。
在任何机器上,使用少于4个处理器时,最大工作线程(Maximum worker Thread)默认总是为256MB(除非,我们使用sp_configure修改该值)。
SQL Server Buffer Pool为“Phyiscal RAM”和“user modememory(2GB or 3GB) - MTL”的最小值- BUF structures:
BPool = Minimum(Physical memory, User address space – MTL) –BUF structures
为了确保MemToLeave持续分配,SQL Server首先保留MTL,然后是所有的Buffer Pool区域,最后释放MemToLeave区域。
在BPOOL中是什么?
数据页/索引页和SQL Server内存管理器分配的内存,用于以下memory clerk之一。如果内存请求<=8KB。
CACHESTORE_PHDR
CACHESTORE_XMLDBTYPE
CACHESTORE_EVENTS
MEMORYCLERK_SQLSTORENG
MEMORYCLERK_XE
CACHESTORE_XPROC
OBJECTSTORE_SNI_PACKET
CACHESTORE_BROKERRSB
OBJECTSTORE_SERVICE_BROKER
MEMORYCLERK_SQLSERVICEBROKERTRANSPORT
MEMORYCLERK_XE_BUFFER
CACHESTORE_XMLDBATTRIBUTE
MEMORYCLERK_SQLOPTIMIZER
USERSTORE_OBJPERM
USERSTORE_TOKENPERM
CACHESTORE_FULLTEXTSTOPLIST
MEMORYCLERK_SQLGENERAL
MEMORYCLERK_SQLHTTP
CACHESTORE_NOTIF
CACHESTORE_XMLDBELEMENT
OBJECTSTORE_LOCK_MANAGER
MEMORYCLERK_SQLBUFFERPOOL
MEMORYCLERK_SQLSOAP
MEMORYCLERK_TRACE_EVTNOTIF
CACHESTORE_CONVPRI
MEMORYCLERK_QSRANGEPREFETCH
CACHESTORE_BROKERREADONLY
MEMORYCLERK_SQLCLRASSEMBLY
MEMORYCLERK_SOSNODE
CACHESTORE_STACKFRAMES
MEMORYCLERK_SQLCONNECTIONPOOL
MEMORYCLERK_SQLSERVICEBROKER
CACHESTORE_OBJCP
MEMORYCLERK_SQLQUERYPLAN
OBJECTSTORE_SECAUDIT_EVENT_BUFFER
OBJECTSTORE_LBSS
MEMORYCLERK_FULLTEXT
CACHESTORE_TEMPTABLES
CACHESTORE_BROKERTBLACS
MEMORYCLERK_SQLXML
USERSTORE_SXC
MEMORYCLERK_BHF
CACHESTORE_SQLCP
CACHESTORE_SYSTEMROWSET
USERSTORE_SCHEMAMGR
MEMORYCLERK_SQLQUERYCOMPILE
CACHESTORE_BROKERTO
CACHESTORE_BROKERKEK
MEMORYCLERK_SNI
MEMORYCLERK_FULLTEXT_SHMEM
CACHESTORE_BROKERUSERCERTLOOKUP
USERSTORE_DBMETADATA
CACHESTORE_VIEWDEFINITIONS
MEMORYCLERK_SQLQUERYEXEC
CACHESTORE_BROKERDSH
MEMORYCLERK_SQLSOAPSESSIONSTORE
MEMORYCLERK_SQLQERESERVATIONS
MEMORYCLERK_HOST
MEMORYCLERK_SQLXP
MEMORYCLERK_SQLUTILITIES
在MTL(Non-BPool)中是什么?
COM对象
SQL Server CLR
链接服务器OLEDB提供者分配的内存和在SQL Server进程里第三方DLL的加载
扩展存储过程
网络包
内存管理器消耗的内存。如果内存请求>8KB,并需要持续分配。
BUF Structures是什么?
SQL Server对每一页维护着一个BUF结构。该结构用于跟踪与每个buffer相关的状态信息,像buffer latch,一个指向实际8KB页的指针,状态位表明该页是否为脏页,有IO处理。
注意,当AWE启用后,BUF structure维护对于整个RAM调整最大服务器内存不用重启SQL Server。
PAE是什么?
PAE用于增加32位处理器寻址多于4GB物理内存的能力。在boot.ini中,启用/PAE使得操作系统利用多于4GB物理内存。
什么是SQL Server里的AWE?
当AWE启用,32位的SQL Server将能够使用AWE分配器API寻址多于4GB物理内存。
注意,在32位SQL Server里,只有数据页和索引页可以放在AWE内存里。因此,对于其他SQL Server内存对象的可用内存仍然被限制在用户地址空间。
使用AWE分配器API的内存分配不是进程工作集的一部分,因此不能被页交换,在任务管理和perfmon里private bytes或者working set部分不可见。
SQL Server启动账号需要内存中锁定页面权限来使用AWE分配器API。
在64位系统里,如果你有AWE分配器API用于分配内存的SQL Server启动账号的内存锁定页面权限,那sp_configure ‘awe enabled’ 没有任何作用。
/3GB开关是什么?
/3GB开关用于Boot.ini文件。
当我们启用/3GB。SQL Server的用户地址空间或者任何使用IMAGE_FILE_LARGE_ADDRESS_AWARE的应用程序将会增加到3GB,而限制内核模式地址空间为1GB。
当系统中的物理内存超过16GB,并且使用/3GB开关,操作系统将会忽略额外的内存,直到/3GB开关被移除。这是因为内核增加的大小需要支持更多页面表条目(Page table Entries)。
AWE如何工作?AWE分配器API是什么?
AWE API激活程序寻址多于通过标准32位寻址的4GB内存。
AWE API如何使用?
匹配AWE页面分配地址空间。
ADD=VirtualAlloc(lpaddress,size,MEM_RESERVE |MEM_PHYSICAL,PAGE_READWRITE);
分配不能被页交换的物理内存。
bResult=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap,aRAMPages);
匹配一个到你地址空间的页面视图。
bResult=MapUserPhysicalPages(ADD,sizemap,aRAMPages);
2. 64位SQL Server内存架构
在64位Windows里,每个进程获得高达8TB的地址空间,因此SQL Server不需要预留一定的内存地址空间用于Non-Bpool分配。
在64位SQL Server里有三种内存模型:
Conventional – 普通物理页面大小(4/8KB),内存可以页交换,动态的
Locked – 普通物理页面大小(4/8KB),Bpool不能被页交换,动态的,需要SQLServer启动账号有内存中锁定页面权限,内存通过使用AWE API分配
Large – 大物理页面大小(>=2MB),不可页交换,静态,在启动时内存确定,推荐使用“Max server memory”,需要SQL Server启动账号有内存中锁定页面权限和TF834(只在企业版支持,使用>8GB内存)。
内存计算在64位SQL Server是非常明确的。
SQL Server在启动时计算内存大小并保留它,minimum(reserved space, “Max server memory”)用于Bpool。
类似于32位SQL Server,在64位SQL Server也有Bpool外的内存分配,被称为Non-Bpool分配。
在Bpool外谁分配内存?
COM对象
SQL Server CLR
链接服务器OLEDB提供者和在SQL Server进程里第三方DLL加载的内存分配
扩展存储过程
网络包
通过内存管理器消耗的内存。如果内存请求大于8KB并且需要持续分配。
备份
线程的内存(在64位SQL Server里stack size是2MB)
最大服务器内存只控制了Bpool,它不控制Non-Bpool分配,这就是为什么SQLServer内存使用大于“Max server memory”的原因。
总结:
当“内存中锁定页面被使用”操作系统不能页交换出Bpool,而Non-Bpool分配仍可以被页交换。
Sp_configure “awe enabled”选项在64位SQL Server里没有用。
“Max server memory”只限制Bpool,因此SQL Server内存使用将会大于“Max server memory”。
如果你的操作系统是Windows 2003(Windows 2008的话随便你),确保先考虑被其他应用程序、操作系统、驱动、SQL Server Non-Bpool分配等需要的内存,然后设置合适的SQL Server最大服务器内存。
注意:以上架构适用于SQL Server2008 R2及以下版本。SQL Server 2012(Denali)与之前版本相比,内存管理器在有效地方式管理SQL Server内存消耗上做出了很多改变。点击这里,了解SQL Server 2012内存架构。
内存体系结构(SQL Server2008 R2)
https://msdn.microsoft.com/zh-cn/library/ms187499.aspx
转载于:https://blog.51cto.com/ultrasql/1789618
SQL Server内存架构基础相关推荐
- sql server 内存初探
原文:sql server 内存初探 一. 前言 对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在 ...
- SQL Server内存故障排除
翻译自:https://blogs.msdn.microsoft.com/karthick_pk/2012/06/15/troubleshooting-sql-server-memory/ SQL S ...
- SQL Server 2005架构
SQL Server 2005架构 转载自:http://blog.csdn.net/motian_shi/article/details/4071616 SQL Server 2005由协议层.关系 ...
- sql server 内存_SQL Server内存性能指标–第1部分–内存页/秒和内存页故障/秒
sql server 内存 SQL Server performance basics article, we explained why performance monitoring was imp ...
- SQL Server内存性能监视工具
内存压力使查询变慢 (Memory pressure slowing down queries) This article is the sequel in a series about SQL Se ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- SQL SERVER 内存分配及常见内存问题(1)——简介
原文:SQL SERVER 内存分配及常见内存问题(1)--简介 一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解 ...
- SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -1(服务器视角)...
1.需求概括 我们知道,在SQL Server Alwayson 架构中,有多种虚拟IP,例如 WindowsCluster IP,ListenIP,角色高可用性IP(类似于侦听IP).在某些条件下, ...
- SQL Server 内存泄露(memory leak)——游标导致的内存问题
原文:SQL Server 内存泄露(memory leak)--游标导致的内存问题 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/07/01/sql ...
最新文章
- SOFAMosn配置模型
- JVM是怎么判断不可用对象的
- javascript关键字_让我们揭开JavaScript的“ new”关键字的神秘面纱
- 虚存的用法计算机组成原理,5.5虚拟存储器计算机组成原理.pdf
- matplotlib之scatter散点、bar直方图(笔记四)
- java timer 序列化_Java中的定时器Timer使用示例代码
- matlab autocad选哪个,cad哪个版本最好用,如何选择?
- 【Winform】关于Application.DoEvents()的理解
- speedoffice表格的外框线怎么设置?
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
- 《实战 Linux Socket 编程》Warren W.Gay 图解Key-point学习笔记-1
- PwC普华永道——招聘
- 小程序canvas画头像
- java 解析p12_java引用微信支付的p12证书文件
- numpy.around
- Jetpack Compose 深入探索系列一:Composable 函数
- Umijs 的安装部署及快速入门
- 回溯法——电话号码的字母组合
- iFixit是被破拆解Galaxy Fold?Galaxy Fold的问题点
- CorelDRAW多个文件如何批量导出JPG
热门文章
- 【SQL】含有NULL值的排序
- 【Oracle】三种表连接方式
- 关于如何查看 EntityValidationErrors 详细信息的解决方法
- jxl.read.biff.BiffException: Unable to recognize OLE stream解决方法
- 解决Selenium Webdriver执行测试时,每个测试方法都打开一个浏览器窗口的问题
- Win10微软帐户切换不回Administrator本地帐户的解决方法【亲测】
- deepin安装卡在deepin标志界面解决方案
- 如何使用内联onclick属性停止事件传播?
- 分布式事务控制解决方案
- 如何检查PHP数组是关联数组还是顺序数组?