我有一个运行服务,每分钟可以获得50-100个查询。这些都不是高成本的查询。此服务已运行约3-4个月,没有任何错误。
突然几天前它开始提供“资源池中没有足够的系统内存'默认'来运行此查询。”偶尔会出错。当我调查这个问题时,我看到sqlservr.exe
正在使用~1.5 gb ram和%25的CPU(全部为1 / 4CPU)。当我重新启动sqlservr.exe
时,ram从~50mb开始并慢慢增加直到它变为~1.5gb然后导致使用它的应用程序崩溃。
在我进行了一些研究后,我发现它是由我使用的sql server版本引起的。这是限制数字的快速版本。所以我已将我的sql server从'2008r2 express'升级到'2012 enterprise'。当我启动服务时,我认为我的问题终于结束了,因为服务只使用了大约60mb的内存,但不幸的是在一小时内同样的问题开始发生,但这次我在Windows任务管理器上看到的已用内存仍然是~60mb,没有超出任何限制。
我在wcf服务中使用EntityFramework
作为ORM。与此同时,我有SqlQueryNotification
(经纪人和东西)系统进行一些缓存操作。
我错过了一些关键的配置点吗?或者6GB的内存和我的4个CPU真的不够用吗?但它不可能是因为同样的负载就像3个月一样,并且当时没有任何错误,并且代码也没有任何变化。
答案 0 :(得分:18)
SQL Server将根据需要从尽可能多的内存开始,然后慢慢升级,直到它使用在服务器属性中分配给它的所有内容:
在重新启动服务之前,它不会释放任何内存;这是设计的。
通常建议为操作系统留下2 GB的GB,并且需要注意在与SQL相同的服务器上运行的任何其他处理。通常建议在其自己的服务器上安装SQL Server,而不运行任何其他服务器。
也就是说,SQL Server的1.5 GB RAM并不是那么多。如果您没有更多可用,可能是时候添加一些服务器或升级服务器了。
另见: Technet,Brent Ozar
答案 1 :(得分: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);
答案 2 :(得分:0)
我发布此答案是因为有人可能会觉得有用。
即使使用此查询,您也可以设置 string shopid = "";
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult kosarba([Bind(Include = "Id,Name,Price,Men,Akcios,Akcioszazalek")]Parfum parfum) {
if (ModelState.IsValid)
{
if (shopid == "") {
shopid = Guid.NewGuid().ToString();
}
ShoppingCart kosarcucc = new ShoppingCart();
kosarcucc.itemID = parfum.Id;
kosarcucc.instanceID = shopid;
if (parfum.Akcios)
{
double szam = parfum.Price;
double akciosar = Math.Floor((100 - parfum.Akcioszazalek) * szam / 100);
kosarcucc.osszeg = Math.Floor(akciosar);
}
else {
kosarcucc.osszeg = parfum.Price;
}
db.ShoppingCart.Add(kosarcucc);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(shopid);
}
:
max server memory
此外,您只需设置为2 GB(2048),然后再次更改回32 GB(32768)或所需的值,即可使用该查询释放内存而无需重新启动服务。< / p>
请不要将其设置为1 GB以下,因为这将导致执行查询时出错,因此,您将需要重新启动服务才能执行查询,甚至该查询也要再次增加内存。
答案 3 :(得分:0)
就我而言,这仅对特定查询失败。因此,我将“每个查询的最大查询数更改为 2048” 并开始工作。