设为首页 收藏本站
查看: 1179|回复: 0

[经验分享] SQL Server内存架构基础

[复制链接]

尚未签到

发表于 2018-10-12 11:06:39 | 显示全部楼层 |阅读模式
  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内存。
DSC0000.png

  SQL Server“用户地址空间(User address space)”分为两个部分:MemToleaveBuffer Pool
  MemToLeave(MTL)和Buffer Pool(BPool)的大小由SQLServer在启动时决定,如下:

  MTL(Memory to Leave) = (Stack>
  Stack>  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,并需要持续分配。
  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>
  最大服务器内存只控制了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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620703-1-1.html 上篇帖子: SQL Server 环形缓冲区(Ring Buffer) -- RING_BUFFER_RESOURCE_MONITOR 诊断SQL Server内存压力 下篇帖子: Sql server Output 用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表