SqlServer 内存篇(六)—— sqlserver 2012内存管理新特性
程序员文章站
2024-03-21 15:10:46
...
一、 内存管理器变化
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分配的内存等)