web-dev-qa-db-ja.com

SQL Server 2012 SP3でのメモリ不足の問題

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通知などのトレースはスキップされます。

サーバー情報は次のとおりです。

  • 10GB MIN SQLサーバーメモリ
  • 21GB MAX SQLサーバーメモリ
  • サーバー上の4つのDBのみ
  • サイズはそれぞれ1〜2 GBです
  • Tempdbのサイズが1GBを超えることはありません(10GBに自動拡張するように設定)
  • インデックスはすべて低フラグであり、統計が更新されます
  • バージョン:

    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)
    

複数のアイテムをチェックしました:

  • DBCCメモリーステータス
  • クイック統計:

    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の結果で注意すべき点に気づきましたか?

8
user132852

SQLステートメントはVMで実行されているため、バージョンステートメントの(hypervisor)インジケーターで示されているように、ホストサーバー上のVMWare(またはHyper-Vなど)でメモリが確保されていることを確認する必要があります。

メモリ予約は通常、本番環境で使用されるSQL Server仮想マシンのVMに割り当てられたメモリの100%である必要があります。メモリ予約がない場合、ホストサーバーはメモリを「盗む」ことがあります他のVMが使用する「バルーンドライバー」を使用して、仮想マシンからメモリ不足の状態が発生している可能性があります。

VMWare vCenterで、仮想マシンのメモリ予約を設定するには:

  1. メモリ設定を構成する前に、仮想マシンをパワーオフします。

  2. VSphere Clientで、インベントリから仮想マシンを右クリックし、[設定の編集]を選択します。

  3. [仮想マシンのプロパティ]ウィンドウで、[リソース]タブを選択し、[メモリ]を選択します。

  4. [リソース割り当て]パネルで、[すべてのゲストメモリを予約(すべてロック)]チェックボックスをオンにします。

  5. OKをクリックします。

Microsoft Hyper-Vを使用している場合は、Hyper-Vマネージャーで次のプロセスを使用して、VMの動的メモリを無効にします。

  1. VMがオフになっていることを確認します。
  2. VMを右クリックし、[設定]を選択します
  3. 左側のペインから「メモリ」を選択します。
  4. [動的メモリを有効にする]がnotにチェックされていることを確認します。
  5. VMを起動します。
2
Max Vernon

私が行う構成変更のカップル:

  1. 最小限のメモリ設定を削除します。文字通り 必要なし があります。
    • これを変更する理由は、これを設定すると、SQL Serverがマークの下のメモリを解放しないためです。メモリ内でページがロックされると、メモリをページングできなくなります。
  2. 最大サーバーメモリ を合計の75%に合わせて合計<32GBまたは合計87.5%> 32GBに調整します。
    • SQL Serverだけがマシンで実行されていると仮定して、適切に動作するための十分なメモリをOSに付与した後、残っているメモリを消費させます。

これを行うには、次のスクリプトを使用できます。

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
1
pimbrouwers