WEB开发网      濠电姷鏁告繛鈧繛浣冲洤纾瑰┑鐘宠壘閻ょ偓銇勯幇鍫曟闁稿鍠愰妵鍕冀閵娧佲偓鎺楁⒒閸曨偄顏柡宀嬬畱铻e〒姘煎灡绗戦梻浣筋嚙濮橈箓顢氳濠€浣糕攽閻樿宸ュΔ鐘叉啞缁傚秹宕滆绾惧ジ寮堕崼娑樺缂佹宀搁弻鐔风暋閻楀牆娈楅梺璇″枓閺呯姴鐣疯ぐ鎺濇晝闁靛牆妫欓蹇旂節閻㈤潧浠﹂柛銊ョ埣楠炴劙骞橀鑲╋紱闂佽宕樼粔顔裤亹閹烘挸浜归梺缁樺灦閿曗晛螞閸曨垱鈷戦柟鑲╁仜婵″ジ鎮楀☉鎺撴珖缂侇喖顑呴鍏煎緞濡粯娅囬梻浣瑰缁诲倿寮绘繝鍥ㄦ櫇闁稿本绋撻崢鐢告煟鎼淬垻鈯曢柨姘舵煟韫囥儳绋荤紒缁樼箖缁绘繈宕橀妸褌绱濋梻浣筋嚃閸ㄤ即宕弶鎴犳殾闁绘梻鈷堥弫鍌炴煕閳锯偓閺呮瑧妲愬Ο琛℃斀闁绘劕妯婇崵鐔封攽椤旇棄鍔ら摶鐐烘煕閺囥劌澧柛娆忕箻閺屽秹宕崟顒€娅g紓浣插亾濠㈣泛顑囩粻楣冩煙鐎涙ḿ绠橀柨娑樼У椤ㄣ儵鎮欓鍕紙闂佽鍠栫紞濠傜暦閹偊妲诲┑鈩冨絻椤兘寮诲☉銏犖╅柕澶堝労閸斿绱撴担绋库偓鍝ョ矓瑜版帒鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘 ---闂傚倸鍊烽悞锔锯偓绗涘厾娲煛閸涱厾顔嗛梺璺ㄥ櫐閹凤拷
开发学院数据库MSSQL Server 深入SQL SERVER 2000的内存管理机制(三) 阅读

深入SQL SERVER 2000的内存管理机制(三)

 2007-11-11 07:36:53 来源:WEB开发网 闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�闂傚倸鍊风粈渚€骞夐敓鐘插瀭闁汇垹鐏氬畷鏌ユ煙閹殿喖顣奸柛搴$У閵囧嫰骞掗幋婵冨亾閻㈢ǹ纾婚柟鐐灱濡插牊绻涢崱妤冃℃繛宀婁簽缁辨捇宕掑鎵佹瀸闂佺懓鍤栭幏锟�濠电姷鏁告慨顓㈠箯閸愵喖宸濇い鎾寸箘閹规洟姊绘笟鈧ḿ褍煤閵堝悿娲Ω閳轰胶鍔﹀銈嗗笂閼冲爼鍩婇弴銏$厪闁搞儮鏅涙禒褏绱掓潏鈺佷槐闁轰焦鎹囬弫鎾绘晸閿燂拷闂傚倸鍊风欢姘缚瑜嶈灋闁圭虎鍠栫粻顖炴煥閻曞倹瀚�  闂傚倸鍊烽懗鑸电仚缂備胶绮〃鍛村煝瀹ュ鍗抽柕蹇曞У閻庮剟姊虹紒妯哄妞ゆ劗鍘ч埥澶娢熼柨瀣偓濠氭⒑瑜版帒浜伴柛鎾寸☉閳绘柨顫濋懜纰樻嫼闂佸憡绋戦オ鏉戔枔閺冣偓缁绘稓浠﹂崒姘瀳闂佸磭绮幑鍥嵁鐎n亖鏀介柟閭﹀墯椤斿倹淇婇悙顏勨偓鏍ь潖婵犳艾鍌ㄧ憸蹇涘箟閹绢喗鏅搁柨鐕傛嫹
核心提示:内存区域sql server(WINDOWS平台上强大的数据库平台)是分2块区域来组织内存分配,分别是Bpool (缓冲池区)和MemToLeave (内存释放区),深入SQL SERVER 2000的内存管理机制(三),如果你使用AWE内存,那么实际上有第三个区:Windows AWE支持的高于3GB的物理内存区,使

内存区域

sql server(WINDOWS平台上强大的数据库平台)是分2块区域来组织内存分配,分别是Bpool (缓冲池区)和MemToLeave (内存释放区),如果你使用AWE内存,那么实际上有第三个区:Windows AWE支持的高于3GB的物理内存区。

缓冲池区是这3块内存区中最卓越的,是sql server(WINDOWS平台上强大的数据库平台)最初分配的缓冲池供最初的数据页和索引页使用,并且被用来分配小于8K的内存。MemToLeave 是由虚拟内存空间组成包括在用户内存空间没有被缓冲池区使用的内存空间之中。Windows AWE调用3GB以上内存空间的函数作为缓冲池区的扩展可以提供额外的内存空间缓存数据页和索引页。

当你启动sql server(WINDOWS平台上强大的数据库平台)时,缓冲池区的上限是根据机器中物理内存推算或用户内存空间的大小。一旦缓冲池区的大小被确定,内存释放区就紧随其后,不至于被后面的缓冲池区保留部分划分成分散的碎片。然后缓冲池区又在内存释放区旁边,使用32块单独的保留区运行DLL文件和其他在缓冲池区被预定时sql server(WINDOWS平台上强大的数据库平台)中使用的虚拟内存空间。当缓冲池区被预留后,内存释放区被释放。这段区域被sql server(WINDOWS平台上强大的数据库平台)内部用来扩展8K的数据页和分配给其他外部应用(就像:内存消费者是sql server(WINDOWS平台上强大的数据库平台)主要引擎以外的sql server(WINDOWS平台上强大的数据库平台)进程),比如:OLE DB providers,COM对象等等.

因此,当sql server(WINDOWS平台上强大的数据库平台)已经启动, Bpool (缓冲池区)就被预留,但不提交,同时在该进程在虚拟内存空间内的MemToLeave (内存释放区)其实是空闲区域.如果你通过性能分析器的 Virtual Bytes Perform 计数器,在sql server(WINDOWS平台上强大的数据库平台)启动后看sql server(WINDOWS平台上强大的数据库平台)的进程,你会看到它可以反映Bpool (缓冲池区)预留区.我看到人们有些惊慌,因为这个数值比较高—毕竟,它反映的不是本机器的总共物理内存就是最大的用户内存空间减去MemToLeave (内存释放区).这是不用担心的,比较而言这只是保留区,没有提交的空间.就如我前面所述,保留空间只是地址空间—并没有真实的物理内存存储直到内存空间被提交. 随着时间的过去,内存空间被提交,Bpool (缓冲池区)将会增加,知道该SERVER原始启动时确定的上限.

监控sql server(WINDOWS平台上强大的数据库平台)虚拟内存的使用

你可以通过 sql server(WINDOWS平台上强大的数据库平台):Buffer Manager\Target Pages Perform计数器跟踪Bpool (缓冲池区)确定的最大空间.因为SERVER不同的部分需要内存, Bpool (缓冲池区)提交8K大小的页(这是原始保留的直到提交的大小到达确定目标).你可以通过 sql server(WINDOWS平台上强大的数据库平台):Buffer Manager\Total Pages Perform计数器跟踪Bpool (缓冲池区)使用的提交虚拟内存, 你可以通过 Pivate Bytes计数器跟踪sql server(WINDOWS平台上强大的数据库平台)进程使用的全部提交的虚拟内存.

因为, 大部分的sql server(WINDOWS平台上强大的数据库平台)的虚拟内存的使用是来自于Bpool (缓冲池区),通过上面2个计数器可以知道. 一般而言增长和平稳是一前一后地.(请牢记:当应用程序启动了对AWE的支持, Pivate Bytes计数器不能反映总体sql server(WINDOWS平台上强大的数据库平台)内存使用情况).如果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(WINDOWS平台上强大的数据库平台)的处理空间中,内存消费者通常是内部的.换句话说,这些内存消费者和对象是sql server(WINDOWS平台上强大的数据库平台)自己的规范需要消耗内存来执行任务,但也不一定都这样.也存在一些外部的消费者,就像我前面锁说的.通常,这些外部的内存消费者调用正常的Win32 API内存函数来分配和管理内存,并且从MemToLeave (内存释放区)分配内存空间,非常明显这是sql server(WINDOWS平台上强大的数据库平台)程序中唯一有效的区域. 可是XPROCS有特殊的异常处理,当一个xproc调用Open Data Services(ODS)  srv_alloc API函数,这完全和其他的内存消费者一样. 一般而言srv_alloc API函数从Bpool (缓冲池区)申请小于8K的内存,对于大的内存从MemToLeave (内存释放区)分配.

1 2  下一页

Tags:深入 SQL SERVER

编辑录入:coldstar [复制链接] [打 印]
赞助商链接