这些天看了一篇微软官方发布的MS SQL Server2008性能问题处理及优化的英文文档,里面知识点介绍地很详细,在现实工作中也很实用,遂产生了想把它翻译一下的念头。翻译的过程,既可以帮助自己复习一下这些技术,也可以向其他还不熟悉这一块的朋友介绍一些新的知识,何乐而不为呢。只是这篇文章有点长,我会分成几篇随笔去介绍,所以,不光是对我耐性的考验,也是对你的考验哦!
--------------------------------------------
这一章主要专注于内存不足的情况,诊断各种各样的内存错误,导致错误的可能原因,以及解决的办法。
背景
我们习惯地把各种内存资源统称为一种形式:内存。这是因为存在着很多不同种类的内存资源,那么了解各种内存资源的区别及各自特点就很重要了。
虚拟地址空间及物理内存
在windows操作系统中,所有的进程都拥有自己的虚拟地址空间(很多时候简写为VAS)。进程中所有可用的虚拟地址集合构成了虚拟空间的大小。虚拟地址空间的大小取决于架构(32位还是64位)以及操作系统。在处理问题的过程中,一定要记住虚拟地址空间是一个可消耗的内存资源并且应用程序可以溢出它,特别是在32位平台上当物理内存依然可用时。
关于更多有关虚拟地址空间的信息,可以查阅:http://msdn.microsoft.com/zh-cn/library/ms189334.aspx。
地址窗口化扩展控件,锁定的页面,以及SQL Server
地址窗口化扩展控件(Address Windowing Extensions)是一个API,它允许32位的应用程序修改物理内存超过4Gb的限制。AWE的机制不需要再64位的平台上使用。是这样的,但是,直到现在,在64位平台上通过AWE机制分配出来的内存页依然被称之为被锁定的页。
在32位及64位平台上,经由AWE分配出来的内存不能被移出分页。这样对于应用程序是有好处的。(这也是在64位平台上使用AWE机制的原因之一)。这样同样会影响系统可用的RAM数量及其它的应用程序,可能会有不利的影响。对于这个原因,为了使用AWE,在内存中锁定内存的特权一定要赋予运行SQL Server的账户。
从解决问题的角度去看,很重要的一点是SQL Server缓冲池使用AWE分配的内存;然而,只有数据库(hashed)页可以映射或取消映射从AWE额外分配的内存。AWE机制分配的内存不会被呈现在任务管理器或Process:Private Bytes计数器。你需要使用针对SQL Server特定的计数器或者动态管理视图去获取这些信息。
关于更多AWE映射内存,请参阅:Managing Memory for Large Databases及http://msdn.microsoft.com/en-us/library/ms187499.aspx。
下面的这张表摘要出了SQL Server对应的最大内存支持选项(请注意特定版本的SQL Server或者Windows可支持的内存数目)。
Table 1
Configuration |
User VAS |
Max physical memory |
AWE/locked pages support |
Native 32-bit on 32-bit operating system with /3GB boot parameter[1] |
2 GB 3 GB |
64 GB 16 GB |
Yes Yes |
32-bit on x64 operating system (WOW) |
4 GB |
64 GB |
Yes |
32-bit on IA64 operating system (WOW) |
2 GB |
2 GB |
No |
Native 64-bit on x64 operating system |
8 terabytes |
2 terabytes |
Yes |
Native 64-bit on IA64 operating system |
7 terabytes |
2 terabytes |
Yes |
现在最大的内存限制取决于Windows的版本及补丁版本。更多信息,请查阅:Memory Limits for Windows Release