use*_*852 8 sql-server memory sql-server-2012
我一直有定期的 SQL Server OOM 错误,有一次 SQL Server 自行关闭并且总是在夜间发生,当时没有人使用它,并且当时没有运行 SQL 代理作业:
这是典型的错误:
08/17/2017 19:31:17,spid100,Unknown,资源池“内部”中的系统内存不足,无法运行此查询。
08/17/2017 19:31:17,spid100,未知,错误:701 严重性:17 状态:123。
08/17/2017 19:31:17,spid112,未知,错误:18056 严重性:20 状态:29。(参数:)。错误以简洁模式打印,因为格式化过程中出现错误。跟踪 ETW 通知等将被跳过。
这是服务器信息:
版本:
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)我检查了多个项目:
快速统计:
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Output:
20 GB
Page Life Expectancy 155932
Run Code Online (Sandbox Code Playgroud)没有启用资源调控器:
select pool_id, cache_memory_kb, used_memory_kb,
out_of_memory_count,used_memgrant_kb
from sys.dm_resource_governor_resource_pools
Output:
pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
--------+-----------------+----------------+---------------------+-----------------
1 | 295368 | 641416 | 0 | 0
select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory
Output:
Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
----------------------------------------------------------------------------------------------------------------------------------------
20553 | 20393 | 134217727 | 0 | 0
Run Code Online (Sandbox Code Playgroud)服务器在 SP3 上,我知道 SP1 中存在内存泄漏问题,因此排除了该问题。
有人注意到 DBCC 结果中有什么我应该关注的吗?
我会做一些配置更改:
您可以使用以下脚本来完成此操作:
use master;
go
-- MIN Server Memory
exec sys.sp_configure
'min server memory (MB)'
,0;
-- MAX Server Memory
declare
@systemMemory int
,@maxServerMemory int;
select
@systemMemory = total_physical_memory_kb / 1024
from
sys.dm_os_sys_memory;
set @maxServerMemory = floor(@systemMemory * .75);
if @systemMemory >= 32768
begin
set @maxServerMemory = floor(@systemMemory * .875);
end;
exec sys.sp_configure
'max server memory (MB)'
,@maxServerMemory;
reconfigure;
go
Run Code Online (Sandbox Code Playgroud)