SQL Server 2008 R2 资源池“默认”中的系统内存不足,无法运行此查询

use*_*829 6 sql-server sql-server-2008-r2

我有一台运行 SQL Server 2008 R2 (10.50.1617.0) 企业版的 32 位 Windows 2003 企业版 SP2 服务器。该服务器是我们 SharePoint 2007 环境的专用 SQL Server 框。

服务器有 36 GB 的内存,我在 SQL Server 中启用了 AWE。

我在 Windows 事件日志中不断收到错误消息:“资源池‘默认’中的系统内存不足,无法运行此查询”。

我正在运行 perfmon 并监视“目标服务器内存”和“服务器总内存”的 SQL Server 内存管理器计数器以及“可用千字节数”的内存计数器。目前,“服务器总内存”计数器为 5 GB。

我已在 SQL Server 中将“最小服务器内存”配置为 25 GB,将“最大服务器内存”配置为 30 GB。服务器显示 31 GB 的可用内存,但我继续不断收到此错误。

索引创建内存设置为 0 KB(动态内存),每个查询的最小内存设置为 1024 KB。

我已经尝试了每个查询的最小内存值,但它并没有阻止错误的发生。

如果我的服务器有 31 GB 的可用内存(其中 20 GB 可用于 SQL Server),为什么我会收到此错误?

我花了几个小时在表单中搜索,但其他收到此错误的人似乎虚拟内存不足,而我的情况并非如此。

有没有人有任何想法可能导致此错误?

我曾尝试重新启动 SQL Server,甚至重新启动服务器本身,但此错误总是在一两分钟内返回。

我计划在获得批准后立即更新到 Service Pack 1,但我怀疑这是否能解决我的问题。

任何建议将不胜感激。

Cra*_*ein 4

你说你在SQL Server上启用了AWE,但你是否在boot.ini文件中激活了/PAE?

PAE 支持大内存。

在 Windows 32 位企业版中激活 PAE

c:\boot.ini

[boot loader]
timeout=30
default=multi(0)disk(2)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /PAE
Run Code Online (Sandbox Code Playgroud)

http://support.microsoft.com/kb/283037

锁定内存中的页面

作为启用 AWE 的一部分,您还需要授予 SQL Server 服务用户锁定内存页面的权限。在“组策略”对话框 (gpedit.msc) 中启用此选项可防止 Windows 将内存调出 SQL Server 工作集以满足其自身的需要,特别是当 Windows 上的内存开始不足时。

http://msdn.microsoft.com/en-us/library/ms190730.aspx

监控 AWE 内存使用情况

为了测试 AWE 的使用情况,我设置了 Windows 2003 Enterprise SP2,并在 boot.ini 中启用了 PAE。我使用的是 SQL Server 2005 32 位标准 SP4。

总物理内存为8192Mb。SQL Server 的最大内存设置配置为8192,最小内存设置为2048

SQL Server 在启动时是否看到 AWE。

2012-02-09 07:27:51.35 服务器地址窗口扩展已启用。这只是一条信息性消息;无需用户操作。

SQL Server 是否使用锁定页作为缓冲池

根据一些博客,我应该看到此消息,但我没有。

使用缓冲池的锁定页。这只是一条信息性消息;无需用户操作。

通过 AWE 分配内存

SELECT  SUM(awe_allocated_kb) / 1024 AS awe_allocated_mb
FROM    sys.dm_os_memory_clerks ;
Run Code Online (Sandbox Code Playgroud)

[3648]

分配给多页内存的内存。

select sum(multi_pages_kb)/1024 as [MultiPage Memory, MB] from sys.dm_os_memory_clerks
Run Code Online (Sandbox Code Playgroud)

[14]

多页内存不能使用AWE分配的内存

内存在缓冲池之外使用

SELECT sum(multi_pages_kb 
 + virtual_memory_committed_kb + shared_memory_committed_kb) AS
 [Memory used outside BPool, mb]
FROM sys.dm_os_memory_clerks 
WHERE type <> 'MEMORYCLERK_SQLBUFFERPOOL'
Run Code Online (Sandbox Code Playgroud)

[24]

按组件划分的总体内存分配

SELECT type, (single_pages_kb)/1024 as Single_Pages_MB, (multi_pages_kb)/1024 
AS Multi_Pages_MB, (awe_allocated_kb)/1024 as AWE_allocated_MB
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY 2 DESC
Run Code Online (Sandbox Code Playgroud)

这将向您展示每个组件如何使用单页和多页内存。它还会告诉您哪一个能够从 AWE 中受益。

多页:当请求超过8Kb时

单页:当请求小于或等于8Kb时

附带说明一下,我发现 sp_whoisactive 对于查找缓慢查询、内存占用以及 SQL Server 中发生的几乎所有问题非常有帮助。以下是 Brent Ozar 提供的有关如何设置和使用它的链接。

http://www.brentozar.com/archive/tag/sp_whoisactive/