【问题标题】:There is insufficient system memory in resource pool 'default' to run this query. on sql资源池“默认”中的系统内存不足,无法运行此查询。关于 sql
【发布时间】:2014-10-05 15:53:09
【问题描述】:

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

几天前它突然开始给出“资源池'default'中的系统内存不足,无法运行此查询。”偶尔出现错误。当我调查这个问题时,我看到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(broker and stuff) 系统用于一些缓存操作。

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

【问题讨论】:

  • 您只是从 Express 升级到 Enterprise?免费?我在哪里可以买到这么棒的交易?!
  • 显示你的代码,你一定是因为不清理连接而耗尽了服务器上的资源???
  • 如果你有公司,微软会提供 bizspark 程序。我建议你检查一下。
  • MaxMemory for SQL Server 设置为什么?这是 32 位还是 64 位?
  • 每次连接数据库时,我都在使用Using 语句。所以我确信我不会让任何连接保持打开状态。我的系统是64位的。而 6144mb 是最大服务器内存,我是从服务器属性中设置的。

标签: c# sql sql-server wcf


【解决方案1】:

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

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

通常建议为操作系统保留 2ish GB,并且您需要注意在与 SQL 相同的服务器上运行的任何其他处理。通常建议将 SQL Server 放在自己的服务器上,而不在那里运行其他任何东西。

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

另请参阅: Technet, Brent Ozar

【讨论】:

  • 不不,事实并非如此。在这台机器上,我现在有 12gb 的内存,而且我有很多可用的内存。我可以随时轻松增加内存。有趣的是现在 sqlervr.exe 似乎从来没有使用超过 70MB。
  • 但它仍然会在大约 1 小时内因内存异常而崩溃。
  • @TolgaEvcimen 此服务器上是否有其他程序正在运行? resmon.exe 说你使用了多少物理内存?
  • @TolgaEvcimen sys.dm_os_sys_info 和 sys._dm_os_performance_counters 指示 sql 正在使用多少内存以及有多少可用内存?
【解决方案2】:

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

即使使用此查询,您也可以设置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,因为它会导致执行查询时出错,因此您需要重新启动服务才能执行查询,即使此查询再次增加内存。

【讨论】:

  • 小心使用此命令,您可能仍需要重新启动服务,尽管作者声称,它只是在生产系统上发生在我身上。
【解决方案3】:

在我们的例子中,这是因为内存优化的表类型具有大量数据。同时对不同的存储过程进行了多次调用,每次调用都使用相同的表类型并在其中加载大量记录(>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);

【讨论】:

  • 我从SP向表类型插入了大量数据(大约100万),然后导致了这个问题。你能告诉我你是怎么跳过插入数据的吗?
【解决方案4】:

就我而言,这仅对特定查询失败。所以我将“每个查询的最大查询次数更改为 2048” 并开始工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多