深入SQL SERVER 2000的内存管理机制(5)
作者:Ken Henderson 来源:Microsoft 发布时间:2010-04-25 10:52:00
内存管理者
当SERVER运行时,内存管理者检查物理内存的剩余有效容量,以保证WINDOWS和其他的应用程序可以可以平稳的运行.这个有效内存的大小在4MB和10MB直接变化.(在WINDOWS 2003中更接近10MB)并且这个基于系统内核加载和Bpool (缓冲池区)中的页生命周期.如果SERVER上的有效物理内存空间在这个阀值以下,SERVER会减少提交Bpool (缓冲池区)页来收缩内存物理存储的使用(假设动态内存分配是激活的).内存管理者也保证提交的内存页在指定的时间点后空闲,这样在接受到一个新的分配请求时,就不再需要等待内存分配.通过”空闲”,我的意思是:内存页提交后,但没有被使用.没有使用的提交Bpool (缓冲池区)页可以通过一个空闲页清单来跟踪.这样所有得新得页都来自空闲页清单, 内存管理者从Bpool (缓冲池区)预留区提交更多得页直到全部得预留区被提交.你看:Process:Private Bytes Perfmon 计数器缓慢增长(通常是成直线的)就是这个原因.
在多CPU系统中,没一个都有自己单独的空闲页清单,当一个空闲页被要求响应一个应用程序的请求,首先在当前的CPU的空闲页清单中满足分配的空间被检查,然后是其他CPU的空闲页清单.这样更好的利用每个处理器的本地缓存,提高了在多处理器的SERVER上提高稳定性.你可以通过SQL Server:Buffer Partition Perform对象监视指定的Bpool (缓冲池区)区,你可以可以通过SQL Server:Buffer Manager\Free Pages Perform计数器监视所有的Bpool (缓冲池区)区.
因此在SQL SERVER整个运行过程中,SQL SERVER的内存处理器(无论内存线程管理器或同其他的线程服务)监视系统的内存使用状态,确认合理的剩余空闲物理内存的数量给其他的系统和预留合理的空闲页响应新的内存请求.当SERVER使用AWE内存,有些内存状态必需改变. Bpool (缓冲池区)区开始通过SERVER的物理内存中获得和锁定内存,内存锁的数量的变化是根据服务器最大内存是否设置了.如果配置了, Bpool (缓冲池区)区试图根据最大的服务器内存锁住相应数量的内存.如果没有配置, Bpool (缓冲池区)区会锁住接近128MB内存的所有物理内存,只有少量的区域留给其他处理.然后Bpool (缓冲池区)区使用高于3G的物理内存(AWE内存)用作运行数据和索引的页文件. Bpool (缓冲池区)区根据需要映射物理内存和虚拟内存,因此可以被32位的指针引用.
概述
你已经知道了:SQL Server内存管理器是一个难点.理解一个程序是如何分配和管理内存是了解一个程序如何工作的基础.内存是非常重要的资源,它的有效利用是一个可靠应用程序设计的基本因素,懂得一个应用程序内存管理机制会是你的程序设计如虎添翼.
一个开发者,他是如何影响你呢?理解SERVER的内存管理机制赋予你如何写一个高效的应用程序和解决一些和内存相关联问题的洞察力. 比如说,在一个提高客户端连接速度的调试中,你提高SQL Server的默认网络包的大小为8K., 立即,SQL SERVER立刻开始在ERROR LOG中写错误信息,提示预留虚拟内存在MemToLeave (内存释放区)区有问题.在看到这样的信息后你立刻会知道这个改变至少是问题的一部分,因为你知道分配8K或更多的内存是在MemToLeave (内存释放区)区. 这样SQL Server连接相关联的缓存也是来自这个区域,因为你已经配置网络包的大小太高了.配置默认的网络包适合于.NET framework的SQLClinet Provider 8KB.这种情况并不象听起来那么合理.实际上,这是非常常见的问题,由于MemToLeave (内存释放区)缺乏内存空间而引起的,因为网络包的大小太大,至少有些部分是这样的.
同时,了解SQL Server划分内存的方法可以帮助你了解你定制在SQL Server中运行的代码是否在系统资源的临界值,比如数据缓存. 比如说,你建立一个扩展存储过程调用SRV_PRO()函数来分配内存.假设,暂时你代码中分配的缓存小于8KB.根据我们前面的讨论,我们知道扩展存储过程是从Bpool (缓冲池区)来分配内存.—可以用作数据缓存.
了解SQL Server是如何管理内存的,可以帮助我们按大小排列系统的开始顺序.这可以帮助你计算你所需的物理内存的数量和如何分配和分区给SQL SERVER.比如:良好的理解AWE


猜你喜欢
- 问题jupyter notebook读入csv数据时出现错误“SyntaxError: (unicode error) ‘unicodees
- Swin TransformerSwin Transformer是一种用于图像处理的深度学习模型,它可以用于各种计算机视觉任务,如图像分类、
- 本文实例为大家分享了python实现12306图片验证效果的具体代码,供大家参考,具体内容如下思路:在鼠标点击位置加一个按钮,然后再按钮中的
- 复习回顾:Python 对于时间日期操作提供了很多方法,我们前面已经学习了2个模块:基于Unix 时间戳范围限制在1970~2038年的时间
- mysql对列求和mysql中,可以使用SELECT语句配合SUM()函数来对列求和,能够返回指定列值的总和,求和语法为&ldquo
- 导言在前面三节的示例中,GridView和DetailsView控件使用的是绑定列和CheckBoxField(绑定GridView和Det
- 在Linux上有个常用的命令 curl(非常好用),支持curl的就是大名鼎鼎的libcurl库;libcurl是功能强大的,而且是非常高效
- 使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下# -*-coding: utf-8 -*-""
- 本文实例为大家分享了pygame贪吃蛇游戏的具体代码,供大家参考,具体内容如下1.准备工作我们已经初始化了一个400*400的界面,为方便看
- Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名称标识符需要以字母或下
- 如下所示:def is_chinese(uchar): """判断一个unicode是否是汉字"&q
- 今天拉了一个使用了tornado的项目在本地跑,按照源码作者的步骤配置完,运行,直接报错了,要求环境Python3.6+,我装的是Pytho
- PHP扩展开发我准备在此系列博文中总结我有关PHP扩展开发的学习和感悟,力图简单清晰地描述在Linux系统下开发一个PHP扩展应该具备的最基
- 经常到这来抄抄改改代码,也贡献一个代码,主要是讨论研究用,没有封装可以进一步改进<!DOCTYPE html PUBLIC "
- CSS重设就是由于各种浏览器解释CSS样式的初始值有所不同,导致设计师在没有定义某个CSS属性时,不同的浏览器会按照自己的默认值来为没有定义
- Python 绘制箱线图主要用 matplotlib 库里 pyplot 模块里的 boxplot() 函数。plt.boxplot() 参
- github demo: github地址闲聊背景本文主要以 vue-cli3 搭建的项目为例,来聊一下如何在项目中更优雅的使用 svg 。
- 前言上一篇介绍了客户端流式RPC,客户端不断的向服务端发送数据流,在发送结束或流关闭后,由服务端返回一个响应。本篇将介绍双向流式RPC。双向
- 本文实例讲述了Python多线程下载文件的方法。分享给大家供大家参考。具体实现方法如下:import httplibimport urlli
- Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Py