随着公司业务平台不断扩大,原先数据库服务器上 2GB 的物理内存已显得较为吃紧。前段时间,一狠心,在 DELL 下了一个 PowerEdge 2950 架构的单,直接上到 4GB。
数据库服务器最在意的事情就是数据存储的安全可靠。为此我订购了四块 SAS 硬盘,其中一块做系统盘,其余三块组成一个 RAID5 阵列。这机器成本不算低了,好歹性能也跟上去了,于是日子就这么继续……
最近发现服务器的物理内存占用情况比较有意思。无论我何时连上去看,物理内存占用量都在 1.5GB 至 1.75GB 左右,死活超不过 2GB。当然,绝大部分都被 SQL Server 所占用,但没有完全占用所有可用的剩余物理内存。而 SQL Server 被配置为动态地使用所有物理内存选项。整个情况非常神奇,让我禁不住啧啧赞叹……
这神奇的景象就像这样:
网上有文章说只要打开 /3GB 或者 /PAE 开关就可以,这样的说法是不准确的。
首先我们要分析当前操作系统是什么版本,是否需要开启 /3GB 或者 /PAE 开关。具体可以参阅微软的帮助支持中心的这篇文章。我的操作系统是 Windows Server 2003 Enterprise Edition,其本身就支持最高 32 GB 的物理内存,所以不需要打开这些开关。
我个人的理解是:如果机器上的物理内存并未被操作系统所完全识别,则需要根据操作系统的实际情况考虑打开这些开关。
另外,同时使用 /3GB 和 /PAE 开关是没有意义的。物理内存为 3GB 的时候使用 /3GB 开关,大于等于 4GB 就使用 /PAE 开关。关于 /3GB 开关的描述请见这里,关于 /PAE 开关的描述请见这里。
一个需要开启 /PAE 开关的 boot.ini 的实例类似是这样的:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Windows Server 2000 Server" /noexecute=optout /fastdetect /PAE
如微软的文章中所说,检查完系统是否支持当前的物理内存后,然后需要启用 SQL Server 的 Address Windowing Extentions(AWE)支持。
要检查 AWE 是否已启用,请从 SQL 查询分析器运行以下脚本:
sp_configure 'show advanced options', 1
go
reconfigure
go
sp_configure 'awe enabled'
go
如果 run_value 设置为 1,则服务器上启用了 AWE。如果不是,请在 SQL 查询分析器中输入:
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'awe enabled', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'max server memory', 4096
RECONFIGURE WITH OVERRIDE
GO
请注意,这里的 4096 适用 4GB 物理内存的系统。如果是 6GB,这个数字应改成 1024 * 6,其他情况依此类推。
值得特别说明的是,微软的原文介绍使用 RECONFIGURE 命令,而我将之改为强制更新的 RECONFIGURE WITH OVERRIDE 命令。其最终效果是一样的,只不过有些情况下 RECONFIGURE 无法完成工作。
到此为止,理论上 SQL Server 应该可以支持 2GB 以上的物理内存了。但某种情况下,依然不行。为何?我们再来看微软的一篇文章。
这里说到这样一个问题:启用了 AWE 支持,但单个 SQL Server 2000 实例还是只能使用计算机上最多 50% 的物理内存。
很不幸地,这个问题被我遇到了。经过一番折腾后,服务器的内存使用量还是在 1.75GB 左右徘徊。这个属于 SQL Server 早期版本中的一个漏洞,该问题只发生在具有超过 2 GB RAM 的计算机上运行于基于 x86 或基于 x64 的计算机上的 32 位版本的 SQL Server 2000 Service Pack 4 中。要查看此现象,请检查系统监视器中的“SQL Server:内存管理器 / 总的服务器内存(KB)”计数器。在运行 SQL Server Service Pack 3(SP3)的计算机上,该值最大可以为计算机上的物理内存量。在运行 SQL Server SP4 的计算机上,该值永远不会超过物理内存的 50%。
下载一个 8MB 的补丁,打了就好。
实践证明,现在的内存使用量已经达到了我们 BT 的要求了:
这样一番折腾之后,任务管理器可能会变得无法准确提供内存使用信息,原因请见这里。
最后补充,无论是打开 /3GB 或 /PAE 开关,还是开启 SQL Server 的 AWE 支持,还是打 for SQL Server SP4 的修复补丁,系统必须重启才能生效。