资源池“默认”中没有足够的系统内存来运行此查询。关于 SQL

问题描述 投票:0回答:4

我有一个正在运行的服务,每分钟执行 50-100 个查询。而且这些都不是高成本的查询。该服务已经运行了大约 3-4 个月,没有出现任何错误。

几天前突然开始出现“资源池‘默认’中没有足够的系统内存来运行此查询。”偶尔会出现错误。当我调查这个问题时,我发现

sqlservr.exe
使用 ~1.5 GB 内存和 %25 的 CPU(全部为 1/4CPU)。当我重新启动
sqlservr.exe
时,内存从 ~50mb 开始,慢慢增加,直到变成 ~1.5gb,然后导致使用它的应用程序崩溃。

经过一番研究,我发现这是由我使用的sql server版本引起的。这是快速版本,将数量限制为这些。所以我把我的sql server从'2008r2 express'升级到了'2012 enterprise'。当我启动服务时,我以为我的问题终于结束了,因为该服务仅使用约 60mb 的内存,但不幸的是,一个小时后,同样的问题开始发生,但这次我在 Windows 任务管理器上看到的已用内存仍然是约 60mb,不超过任何限制。

我在 wcf 服务中使用

EntityFramework
作为 ORM。除此之外,我还有用于一些缓存操作的
SqlQueryNotification
(代理和其他东西)系统。

我是否遗漏了一些关键的配置点?或者 6GB 内存和我的 4 个 CPU 真的不够用吗?但不可能是这样,因为同样的负载3个月都是这样,当时没有任何错误,代码也没有任何变化。

ram allocated

ram usage

c# sql sql-server wcf
4个回答
36
投票

SQL Server 将根据需要使用尽可能多的内存,然后慢慢增加,直到使用服务器属性中分配给它的所有内存:

在服务重新启动之前,它不会释放任何这些内存;这是设计使然。

通常建议为操作系统留出 2 GB 左右的空间,并且您需要注意与 SQL 在同一服务器上运行的任何其他处理。通常建议在它自己的服务器上安装 SQL Server,而不在那里运行任何其他东西。

也就是说,1.5 GB RAM 对于 SQL Server 来说并不算多。如果您没有更多可用资源,可能是时候添加一些或升级服务器了。

另请参阅: Technet布伦特·奥扎尔


12
投票

我发布这个答案是因为有人可能会发现它有用。

即使使用此查询,您也可以设置

max server memory

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 32768;   -- for 32 GB
GO  
RECONFIGURE;  
GO

您还可以使用此查询来释放内存,无需重新启动服务,只需设置为 2 GB (2048),然后再次更改回 32 GB (32768) 或您想要的值。

请不要将其设置为低于 1 GB,因为这会导致执行查询时出错,因此您需要重新启动服务才能执行查询,甚至此查询会再次增加内存。


7
投票

在我们的例子中,这是因为内存优化表类型,具有大量数据。同时多次调用不同的存储过程,每次调用都使用相同的表类型并在其中加载大量记录(> 100,000)。对于我们的应用程序,有一种方法可以减少插入到内存优化表类型中的记录数量,即,如果将所有选定的项目存储在内存优化表类型中,我们有条件地仅存储未选定的记录。

CREATE TYPE [TestType] AS TABLE (
    [TestOrder]    VARCHAR (1500)    NOT NULL,
    [TestDepartment] UNIQUEIDENTIFIER NULL,
    [TestCourse] UNIQUEIDENTIFIER NULL,
    [TestStudent] UNIQUEIDENTIFIER NULL,
    INDEX IX_Test NONCLUSTERED (TestOrder))
    WITH (MEMORY_OPTIMIZED = ON);

1
投票

就我而言,这只对特定查询失败。所以我将 “每个查询的最小内存更改为 2048”,它开始工作。

© www.soinside.com 2019 - 2024. All rights reserved.