我有一个运行服务,每分钟有50-100个查询。这些都不是高成本的查询。该服务已经运行了大约3-4个月,没有任何错误。
几天前,它突然开始给“资源池的‘默认’中没有足够的系统内存来运行这个查询。”偶尔出错。当我调查这个问题时,我发现sqlservr.exe
正在使用大约1.5GB的内存和%25的CPU(全部是1/4CPU)。当我重新启动sqlservr.exe
时,内存从大约50 it开始,慢慢增加,直到达到1.5GB,然后导致使用它的应用程序崩溃。
在我做了一些研究之后,我发现这是由我使用的sql server版本造成的。这是特快专递版,把数字限制在那些。因此,我已经将我的sql server从'2008r2 express'升级为'2012 enterprise'。当我启动该服务时,我认为我的问题终于结束了,因为服务只使用了~60 my的内存,但不幸的是,在一个小时内也出现了同样的问题,但这次我在windows任务管理器上看到的内存仍然是60 my,没有超出任何限制。
我在wcf服务中使用EntityFramework
作为ORM。此外,我还提供了一些缓存操作的SqlQueryNotification
(broker等)系统。
我是不是遗漏了一些关键的配置点?或者6GB的内存和我的4 CPU真的不够吗?但这不可能,因为相同的负载是这样的3个月,没有任何错误,当时,也没有任何变化的代码。
发布于 2014-08-12 14:28:42
发布于 2019-12-05 12:18:45
我张贴这个答案是因为有人可能会发现它有用。
即使使用此查询,也可以设置max server memory
:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 32768; -- for 32 GB
GO
RECONFIGURE;
GO
此外,您可以使用此查询释放内存,而无需重新启动服务,只需将其设置为2GB (2048),然后再次更改为32 GB (32768)或您想要的值。
请不要将其设置在1GB以下,因为它将导致执行查询时出错,因此您需要重新启动服务才能执行查询,即使是这个查询也会再次增加内存。
发布于 2020-08-04 14:42:28
在我们的例子中,这是由于内存优化的表类型,拥有大量的数据。同时对不同的存储过程进行多次调用,每次调用都使用相同的表类型,并在其中加载大量的记录(>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);
https://stackoverflow.com/questions/25266663
复制相似问题