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


8

SQL ServerのOOMエラーが定期的に発生しました。SQLServerが自動的にシャットダウンし、常に夜間に発生し、誰も使用しておらず、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のサイズが1 GBを超えることはありません(10 GBに自動拡張するように設定)
  • インデックスはすべて低フラグであり、統計が更新されます
  • バージョン:

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


1
このサーバーでホストされている他のサービス/アプリケーションはありますか?SQL ServerサービスアカウントはLocked Pages in Memoryローカルセキュリティポリシーの一部ですか?Windowsイベントログは、SQL Serverのクラッシュが発生した頃に他の問題を示していますか?
John Eisbrener 2017

-このサーバーでホストされている他のアプリケーションはありません。専用のSQLサーバーです。-SQLサーバーサービスアカウントは、Windows管理者グループの一部です。-一連のVSSエラーが表示される:ボリュームシャドウコピーサービスエラー:IVssWriterCallbackインターフェイスのクエリで予期しないエラーが発生しました。hr = 0x80070005、アクセスが拒否されました。。これは多くの場合、ライターまたはリクエスタープロセスのいずれかの不正なセキュリティ設定が原因です。操作:ライターデータコンテキストの収集:ライタークラスId:{35e81631-13e1-48db-97fc-d5bc721bb18a}ライター名:NPS VSSライターライターインスタンスID:{...}
user132852

1
サーバーはVMですか?もしそうなら、それは「専用の」メモリリソースを持っていますか、それとも他のVMと共有していますか?また、メモリを共有している場合、メモリリソースの配分はオーバーコミットされていますか?これは、メモリが過剰に割り当てられたVMサーバーで(バージョンに関係なく)発生することを確認しました。
SQL_Hacker 2017

3
シャンキーありがとうございます。更新するだけで、監視に追加した後、先週金曜日に問題が見つかりました。アプリケーション(サードパーティ)のアプリ監視セッションの1つが適切に構成されていなかったようです。接続セッションは、OOMの数時間後まで閉じません。それを殺します。
user132852 2017

1
@ user132852あなたはあなたのソリューションを回答に入れて、それを回答済みとしてマークすることができます。
Thomas Kronawitter

回答:


2

SQL Serverは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. 「動的メモリを有効にする」がチェックされていないことを確認します。
  5. VMを起動します。

1

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

  1. 最小メモリ設定を削除します。これは文字通り必要ありません
    • これを変更する理由は、これが設定されている場合、SQL Serverはマークの下のメモリを解放しないためです。メモリ内でページがロックされると、メモリをページングできなくなります。
  2. 調整最大サーバメモリを合計<32ギガバイトまたは合計87.5%> 32ギガバイトの合計の75%。
    • 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

3
これらはかなり標準的なベストプラクティスであることは知っていますが、それらを変更することで、発生しているエラーにどのように役立つかを少し説明できますか?
エリックダーリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.