SqlServer 内存篇(六)—— sqlserver 2012内存管理新特性

一、 内存管理器变化

sqlserver 2005和2008时,8K和大于8K的内存分配严格分开,由两个内存分配管理器分别完成,可能导致buffer pool还有内存,但multi-page部分却不足了。sqlserver 2012的重大改进之一就是——所有内存请求都通过新的内存管理器完成。

 

1)新内存管理器支持分配所有大小

至此,single-page allocator和multi-page allocator都将退出历史舞台。不论内存大小,sqlserver内存管理器使用内存的方式只分为:普通页、锁定页、大内存页三种模型。

2)新内存管理器对某些特定负载进行了优化

3)新内存管理器完全支持NUMA

4)虚拟地址空间管理完全动态,包括32位

5)所有通过内存管理器分配的内存均受max server memory参数控制

6)32位实例不再支持AWE

7)Lock page in memory使用方法大大简化

sqlserver 2012开始,不论版本和处理器类型,只要启动账号有Lock page in memory权限,就可以使用该功能。企业版、商业智能版、标准版无需任何实质和trace flag即可直接使用。

如何看是否启用Lock page in memory?

  • sqlserver错误日志会有相应信息
Using locked pages in the memory manager.
  • sys.dm_os_memory_nodes返回信息

  • dbcc memorystatus命令输出

二、 内存相关诊断工具变化

1. 错误日志变化

sqlserver 2012启动时会打印两个非常重要的信息进错误日志,不需要再到处去找。

  • 所有物理内存
  • sqlserver内存管理器使用内存的方式(普通页/锁定页/大内存页)

2. DMV和DBCC命令变化

  • single_page和multi_page的列名均变为page_allocations
  • 之前dmv单位不统一(KB,MB,page等),现在统一使用KB
  • 之前很多内存信息在buffer pool部分输出,现在统一到memory manager下

三、 max server memory变化

直到sqlserver 2008R2,max server memory只是限制了buffer pool或者single-page最大可用内存数。

它不包含以下部分:

  • multi-page allocation
  • CLR allocation
  • sqlserver内部线程使用的栈
  • 加载在sqlserver内部的模块通过VirtualAlloc或HeapAlloc直接向windows获取的内存(例如扩展存储过程、通过sp_OA创建的OLE对象、linked server provider分配的内存等)

从sqlserver 2012开始,它包含了multi-page和CLR allocation,但注意这依然不是sqlserver使用内存的全部。

它不包含以下部分:

  • sqlserver内部线程使用的栈
  • 加载在sqlserver内部的模块通过VirtualAlloc或HeapAlloc直接向windows获取的内存(例如扩展存储过程、通过sp_OA创建的OLE对象、linked server provider分配的内存等)

四、 其他改变

发布了218 篇原创文章 · 获赞 29 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/103917448