How to definitely fix this error: .NET Framework execution was aborted by escalation policy because of out of memory?
How to definitely fix this error: .NET Framework execution was aborted by escalation policy because of out of memory?
首先,这是我们的设置:
- SQL Server 2014 SP2 标准版 64 位
- 128GB RAM(标准版允许的最大值),其中 120GB 分配给 SQL 服务器
- 服务器目前托管约 5000 个数据库,这些数据库都是相似的(相同的表、存储过程等),总共 690GB 的数据(仅限 mdf 文件)
现在会发生什么:
有时,在服务器启动一段时间后,我们在对某些数据库执行查询时收到此错误:
.NET Framework execution was aborted by escalation policy because of out of memory
当我们使用 Red Gate SQL Multi Script 执行所有客户端数据库的更新(当我们启动功能时)时,此错误更常发生。在大约 5000 个 DBS 中,我们在其中 70 个上有错误。 运行 再次更新脚本,部分发生错误,依此类推,直到我们正确更新了所有数据库。这很烦人。
这个错误很久了。我们的服务器有 64GB 的 RAM,所以我们只是添加了更多内存以最大化 SQL 服务器标准编辑器,但几天后错误仍然出现。我们认为该错误可能是其他问题的征兆。
一些可能有助于获得答案的事情:
- 我们的SQL服务器版本是64位的,所以我们认为我们不必处理Virtual Address Space Reservation
- 当 运行 来自用 PHP/Linux 编写的客户端应用程序时也会发生错误,所以我们不是在谈论客户端代码的 .NET 框架
- 在我们的数据库中,我们制作的 .NET 框架的唯一用途是 GROUP_CONCAT、a.NET 具有用户定义函数的 CLR 程序集,它帮助我们模拟 MySQL GROUP_CONCAT总计的。我们的 5000 个客户数据库中的每个数据库都有一个程序集的副本。
- 我们已经尝试降低
max server memory
设置(至 96GB),但我们仍然遇到这些错误
如果需要更多信息,我会更新我的问题。
我尝试修复已经4个月了,我没有再遇到这个错误。尽管如此,我仍然没有关于这个错误的确切解释,但这是我尝试过的并且似乎有效:
我的猜测是,我们的 5000 多个数据库中的每一个都具有相同的 .NET CLR 程序集可能是问题所在,并以某种方式增加了 .NET 的内存使用量。
- 我创建了一个名为
DotNetClrUtils
的新数据库
- 我在这个数据库中复制了
GROUP_CONCAT
的 .NET CLR 程序集
- 我在所有客户端代码和存储过程中更改了
GROUP_CONCAT
的所有用法,以引用 DotNetClrUtils
数据库中的单个实例(这样调用它:DotNetClrUtils.dbo.GROUP_CONCAT_D(col, ',')
)
就这些,现在这个问题没有了!
首先,这是我们的设置:
- SQL Server 2014 SP2 标准版 64 位
- 128GB RAM(标准版允许的最大值),其中 120GB 分配给 SQL 服务器
- 服务器目前托管约 5000 个数据库,这些数据库都是相似的(相同的表、存储过程等),总共 690GB 的数据(仅限 mdf 文件)
现在会发生什么:
有时,在服务器启动一段时间后,我们在对某些数据库执行查询时收到此错误:
.NET Framework execution was aborted by escalation policy because of out of memory
当我们使用 Red Gate SQL Multi Script 执行所有客户端数据库的更新(当我们启动功能时)时,此错误更常发生。在大约 5000 个 DBS 中,我们在其中 70 个上有错误。 运行 再次更新脚本,部分发生错误,依此类推,直到我们正确更新了所有数据库。这很烦人。
这个错误很久了。我们的服务器有 64GB 的 RAM,所以我们只是添加了更多内存以最大化 SQL 服务器标准编辑器,但几天后错误仍然出现。我们认为该错误可能是其他问题的征兆。
一些可能有助于获得答案的事情:
- 我们的SQL服务器版本是64位的,所以我们认为我们不必处理Virtual Address Space Reservation
- 当 运行 来自用 PHP/Linux 编写的客户端应用程序时也会发生错误,所以我们不是在谈论客户端代码的 .NET 框架
- 在我们的数据库中,我们制作的 .NET 框架的唯一用途是 GROUP_CONCAT、a.NET 具有用户定义函数的 CLR 程序集,它帮助我们模拟 MySQL GROUP_CONCAT总计的。我们的 5000 个客户数据库中的每个数据库都有一个程序集的副本。
- 我们已经尝试降低
max server memory
设置(至 96GB),但我们仍然遇到这些错误
如果需要更多信息,我会更新我的问题。
我尝试修复已经4个月了,我没有再遇到这个错误。尽管如此,我仍然没有关于这个错误的确切解释,但这是我尝试过的并且似乎有效:
我的猜测是,我们的 5000 多个数据库中的每一个都具有相同的 .NET CLR 程序集可能是问题所在,并以某种方式增加了 .NET 的内存使用量。
- 我创建了一个名为
DotNetClrUtils
的新数据库
- 我在这个数据库中复制了
GROUP_CONCAT
的 .NET CLR 程序集 - 我在所有客户端代码和存储过程中更改了
GROUP_CONCAT
的所有用法,以引用DotNetClrUtils
数据库中的单个实例(这样调用它:DotNetClrUtils.dbo.GROUP_CONCAT_D(col, ',')
)
就这些,现在这个问题没有了!