1.3 线程内存
为每个线程分配0.5MB的内存
1.4 第三方代码申请的内存
如用户定义的CLR,Linked Server分布式查询从远程数据库取回大量数据。
2. 按申请方式分类
申请方式是指要先预先Reserve一块大的内存,然后再一小块一小块的commit。对Database Cache是会先Reserve,再commit。
其他所有内存使用,基本都是直接commit,都叫Stolen。
3. 按申请大小分类(上面的内存图就是这种分类)
有二种内存申请单位: 一种是小于或等于8KB的,称为Buffer Pool,一次一个页面的这种分配,被称为single page allocation.
一种是大于8kb的,称为Multi-page(以前叫MemToLeave),这种分配,被称为 Multiple Page Allocation.
注意这里的很大一部分内存不受 sql server本身控制.因为第三方代码申请的内存都放在Multi-page里.
内存分类方法之间的关系
类型 |
Database cache 数据页面缓冲区 |
Consumer 功能组件 |
3 Party code 第三方代码 |
Threads 线程 |
Reserved/Commit |
是 |
一般不是 |
一般不是 |
不是 |
Stolen |
不是 |
是 |
是 |
是 |
Buffer Pool (single- page) |
所有 |
绝大部分 |
没有 |
没有 |
MemToLeave (Multi -page) |
没有 |
一小部分 |
所有 |
所有 |
五.sql server 2012 内存
在 sql server 2012里,single page allocator 和multi page allocator 统一起来了,叫做any size page allocator。max server memory 不再像以前的版本那样,只控制buffer pool的大小,也包括那些大于8kb 的内存请求。也就是max server memory 能够更准确地控制SQL Server 的内存使用了。
如下图所示:
使用dmv 来查看当前实例的总内存空间,以及占用内存空间
--Target Server Memory (KB)最多能申请的内存量
--Total Server Memory (KB) 目前使用了多少内存量
从下面的空间占用也可以看出来, 给sql server有分配多少内存, 它就会占用多少内存,以达到性能的最优。
select counter_name, ltrim(cntr_value*1.0/1024.0/1024.0)+'G' as memoryGB from master.sys.dm_os_performance_counters where counter_name like '%target%server%memory%'or counter_name like '%total%memory%'
六 总结
当您启动Microsoft SQL Server时,SQL Server内存使用量可能会继续稳步增长,而不是减少,即使服务器上的活动很低。此外,任务管理器和性能监视器可能显示,计算机上可用的物理内存会逐渐减少,直到可用内存在4 MB到10 MB之间。这种行为本身并不表示内存泄漏。这种行为是典型的,并且是SQL Server缓冲池的预期行为。
默认情况下,SQL Server根据操作系统报告的物理内存负载动态地增长和缩小缓冲池(缓存)的大小。只要有足够的内存(4 MB和10 MB)可以防止分页,那么SQL Server缓冲池就会继续增长。当与SQL Server在同一台计算机上分配内存时,SQL Server缓冲管理器将根据需要释放内存。SQL Server可以每秒释放数兆字节的内存。这允许SQL Server快速地适应内存分配更改。
您可以为SQL Server数据库引擎使用最小服务器内存和最大服务器内存配置选项使用多少内存(缓冲池)设置上限和下限
请注意,通过上图设置内存最大 max 只限制SQL Server缓冲池的大小。不限制SQL Server为其他组件分配的剩余未保留内存区域,如扩展存储过程、COM对象、非共享dll、EXEs和MAPI组件。由于之前的分配,SQL Server私有字节的数量超过了最大服务器内存配置。
后面章节在详细介绍内存的查看分析
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
参考文献:
- SQL Server Memory and Troubleshooting
- Microsoft SQL Server企业级平台管理实践
- SQL Server 2012 内存管理 (memory management) 改进