SQL ServerのOOMエラーが定期的に発生し、SQL Serverが自動的にシャットダウンし、夜間は誰も使用しておらず、SQLエージェントジョブも実行されていなかったことがありました。
ここに典型的なエラーがあります:
2017年8月17日19:31:17、spid100、不明、このクエリを実行するには、リソースプール '内部'にシステムメモリが不足しています。
2017年8月17日19:31:17、spid100、不明、エラー:701重要度:17状態:123。
08/17/2017 19:31:17、spid112、Unknown、Error:18056 Severity:20 State:29.(Params :)。フォーマット中にエラーが発生したため、エラーは簡略モードで出力されます。 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)
複数のアイテムをチェックしました:
クイック統計:
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Output:
20 GB
Page Life Expectancy 155932
リソースガバナーが有効になっていません:
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
サーバーはSP3上にあります。SP1でメモリリークの問題があったので、それを除外しました。
誰かがDBCCの結果で注意すべき点に気づきましたか?
SQLステートメントはVMで実行されているため、バージョンステートメントの(hypervisor)
インジケーターで示されているように、ホストサーバー上のVMWare(またはHyper-Vなど)でメモリが確保されていることを確認する必要があります。
メモリ予約は通常、本番環境で使用されるSQL Server仮想マシンのVMに割り当てられたメモリの100%である必要があります。メモリ予約がない場合、ホストサーバーはメモリを「盗む」ことがあります他のVMが使用する「バルーンドライバー」を使用して、仮想マシンからメモリ不足の状態が発生している可能性があります。
VMWare vCenterで、仮想マシンのメモリ予約を設定するには:
メモリ設定を構成する前に、仮想マシンをパワーオフします。
VSphere Clientで、インベントリから仮想マシンを右クリックし、[設定の編集]を選択します。
[仮想マシンのプロパティ]ウィンドウで、[リソース]タブを選択し、[メモリ]を選択します。
[リソース割り当て]パネルで、[すべてのゲストメモリを予約(すべてロック)]チェックボックスをオンにします。
OKをクリックします。
Microsoft Hyper-Vを使用している場合は、Hyper-Vマネージャーで次のプロセスを使用して、VMの動的メモリを無効にします。
私が行う構成変更のカップル:
これを行うには、次のスクリプトを使用できます。
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