SQL Server 2000内存管理内幕
2007-05-19 09:40:34 来源:WEB开发网Allocations
SQL Server中的内存请求者在初始化内存请求时,先创建一个内存对象管理当前的请求,当内存对象执行请求时,它调用SQL Server中相应的内存管理器从BPool或者是MemToLeave区域获取内存。请求小于8KB时,通常从BPool中获取内存;当请求8KB或者更大的连续空间时,通常从MemToLeave区域中获取。因为一个内存对象可能会产生多个分配请求,因此有可能会从MemToLeave区域中分配小于8KB的分配请求。向SQL Server进程空间请求内存一般情况下都是内部请求者,就是说SQL Server的内部对象需要内存以执行某个任务,当然不是绝对的,象上面提到过的也有可能是外部请求者。通常,这些外部请求者使用Win32内存API函数分配和管理内存,因此是从MemToLeave区域中分配,因为(对于操作系统而言,译者注)SQL Server进程中只有MemToLeave区域可用(BPool区域被SQL Server保留,译者注)。但对于扩展存储过程是个特殊情况,扩展存储过程调用ODS的srv_alloc API函数实现,这使得它同SQL Server内部请求者被同等的处理,通常srv_alloc请求小于8KB的内存时从BPool中分配,大的内存分配则来自MemToLeave区域。
The Memory Manager
服务器运行时,内存管理器进行检查,以确保为服务器预留了一定数量的可用物理内存,使Windows和服务器上其它应用程序能够继续平稳的运行。这个数量从4M到10M左右(Windows Server 2003上接近10M),基于系统负载和BPool中内存页生命期得出。如果服务器上可用物理内存开始低于这个极限值,服务器释放BPool中的部分内存页,以收缩BPool的内存使用量(假设SQL Server的动态内存配置被启用)。内存管理器也确保任何时候保留了一定数量的空闲内存页,以使新的分配请求到达时,不必等待内存分配。这里的空闲,意思是指这些内存页被提交了,但是未使用。被提交但未被使用的BPool内存页通过一个空闲列表跟踪,当列表中的页被使用时,内存管理器从BPool的预留中分配更多的内存页,直到整个BPool预留被提交。你将看到Process:Private Bytes Perfmon计数器由于这个行为而逐渐的增长(通常是线性增长)。
系统中对应每一个CPU都有一个单独的空闲列表,当需要使用空闲页用于满足一个分配请求时,先检查和当前分配请求CPU相关的空闲列表,然后再检查系统中其它CPU相关的列表。这在多处理器系统上,有利于各个处理器更好的使用本地缓存,提高扩展性。你可以使用SQL Server:Buffer Partition Perfmon计数器监控特定的BPool分区,通过SQL Server:Buffer ManagerFree Pages Perfmon计数器监控所有分区的空闲列表。
整个运行过程中,SQL Server内存管理器进程(可能运行在内存管理器线程或其它服务器线程中)监控系统内存状态,为系统其它应用程序保留合理数量的空闲物理内存,为新的内存分配请求预留一个安全数量的内存页。当在服务器上使用AWE时,其中的某些方面必须改变。在使用AWE时,BPool一开始就获取并锁定机器的物理内存,锁定的内存数量根据是否设置了maximum server memory确定。如果设置了,BPool尝试锁定由maximum server memory确定的数量;如果没有设置,BPool只留出大致128M,供其它进程使用,锁定机器上其余的全部物理内存。然后,BPool使用3GB之上的内存(AWE内存)作为数据和索引的分页文件(paging files),它将这些区域(3GB之上)的物理内存页映射到适当的虚拟内存地址空间中,使32位指针能够引用到。
作为一个丈夫和父亲的Ken Henderson,居住在德克萨斯州的达拉斯郊区。他是8本不同技术主题书籍的作者,包括最近发行的《The Guru's Guide to SQL Server Architecture and Internals》。Ken Henderson是达拉斯小牛队的球迷,业余时间喜欢看着他的孩子们玩闹,喜欢体育运动、园艺。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接