深化SQL SERVER 2000的内存管理机制(三)[MSSQL防范]
本文“深化SQL SERVER 2000的内存管理机制(三)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
内存区域
sql server是分2块区域来组织内存分配,辨别是Bpool (缓冲池区)和MemToLeave (内存释放区),假如你利用AWE内存,那么实际上有第三个区:Windows AWE支持的高于3GB的物理内存区.
缓冲池区是这3块内存区中最出色的,是SQL SERVER最初分配的缓冲池供最初的数据页和索引页利用,并且被用来分配小于8K的内存.MemToLeave 是由虚拟内存空间构成包含在用户内存空间没有被缓冲池区利用的内存空间之中.Windows AWE调用3GB以上内存空间的函数作为缓冲池区的扩大可以供应额外的内存空间缓存数据页和索引页.
当你启动SQL SERVER时,缓冲池区的上限是按照机械中物理内存推算或用户内存空间的大小.一旦缓冲池区的大小被肯定,内存释放区就紧随后来,不至于被背面的缓冲池区保存部份划分成份散的碎片.然后缓冲池区又在内存释放区旁边,利用32块单独的保存区运行DLL文件和其他在缓冲池区被预按时SQL SERVER中利用的虚拟内存空间.当缓冲池区被预留后,内存释放区被释放.这段区域被SQL SERVER内部用来扩大8K的数据页和分配给其他外部利用(就像:内存消费者是SQL SERVER主要引擎以外的SQL SERVER进程),比方:OLE DB providers,COM对象等等.
因此,当SQL SERVER已经启动, Bpool (缓冲池区)就被预留,但不提交,同时在该进程在虚拟内存空间内的MemToLeave (内存释放区)其实是闲暇区域.假如你通过性能解析器的 Virtual Bytes Perform 计数器,在SQL Server启动后看SQL SERVER的进程,你会看到它可以反映Bpool (缓冲池区)预留区.我看到人们有些惶恐,因为这个数值对比高—毕竟,它反映的不是本机械的总共物理内存就是最大的用户内存空间减去MemToLeave (内存释放区).这是不用耽忧的,对比而言这只是保存区,没有提交的空间.就如我前面所述,保存空间只是地址空间—并没有真实的物理内存存储直到内存空间被提交. 随着时间的过去,内存空间被提交,Bpool (缓冲池区)将会增添,知道该SERVER原始启动时肯定的上限.
监控SQL Server虚拟内存的利用
???? 你可以通过 SQL Server:Buffer Manager\Target Pages Perform计数器跟踪Bpool (缓冲池区)肯定的最大空间.因为SERVER差别的部份需求内存, Bpool (缓冲池区)提交8K大小的页(这是原始保存的直到提交的大小到达肯定目标).你可以通过 SQL Server:Buffer Manager\Total Pages Perform计数器跟踪Bpool (缓冲池区)利用的提交虚拟内存, 你可以通过 Pivate Bytes计数器跟踪SQL Server进程利用的全部提交的虚拟内存.
因为, 大部份的SQL Server的虚拟内存的利用是来自于Bpool (缓冲池区),通过上面2个计数器可以知道. 普通而言增长和平稳是一前一后地.(请紧记:当利用程序启动了对AWE的支持, Pivate Bytes计数器不能反映总体SQL Server内存利用情形).假如Total Pages Perform计数器是水平的而Pivate Bytes计数器是向上倾斜的,这普通表示正在从MemToLeave (内存释放区)分配新的内存.这个分配历程会正常完毕—比方:在SERVER中分配相关联的线程仓库作为附加的工作线程,这也有大概是一个内部测COM对象或XPROC的内存泄露.假如一个程序因为MemToLeave (内存释放区)耗尽而用完虚拟内存空间,这是由于内存泄露或内存过度消费.(大概在MemToLeave (内存释放区)中最大闲暇块降低到默许线程仓库0.5MB以下),这样SERVER就不能产生新的工作线程,即便在sp_configure max worker threads 的值没有到.在这种情形下,假如SERVER需求产生新的工作线程来履行一个工作恳求—比方:处理一个对SERVER的新的衔接恳求,这些工作将会耽误,直到SERVER可以产生新的线程或其他的线程可以利用.这样,在有充足的MemToLeave (内存释放区)释放或其他的工作线程可以有效的处理衔接之前,系统会禁止一个用户衔接到SERVER,因为这个衔接会超时中止(time out).
内存分配器
??? 在SERVER中一个内存的消费者初始化一个内存分配器,首先是产生一个内存对象来管理这些恳求.当这个对象来分配这些恳求,他在SERVER的内存管理器中,从Bpool (缓冲池区)或MemToLeave (内存释放区)来实施这些恳求.假如这些恳求小于8K,这些恳求普通在Bpool (缓冲池区) 分配.假如恳求需求8K或以上的内存空间, 这些恳求普通在MemToLeave (内存释放区)分配.因为一个单独的内存对象可以用来履行多次内存分配.所以有大概一次内存分配恰好在8K以下(包含管理对象的消费)的恳求被分配在MemToLeave (内存释放区). 在SQL Server的处理空间中,内存消费者普通是内部的.换句话说,这些内存消费者和对象是SQL Server自己的标准需求损耗内存来履行任务,但也不一定都这样.也存在一些外部的消费者,就像我前面锁说的.普通,这些外部的内存消费者调用正常的Win32 API内存函数来分配和管理内存,并且从MemToLeave (内存释放区)分配内存空间,十清楚显这是SQL Server程序中唯一有效的区域. 但是XPROCS有特别的非常处理,当一个xproc调用Open Data Services(ODS)? srv_alloc API函数,这完好和其他的内存消费者一样. 普通而言srv_alloc API函数从Bpool (缓冲池区)申请小于8K的内存,关于大的内存从MemToLeave (内存释放区)分配.
以上是“深化SQL SERVER 2000的内存管理机制(三)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |