web-dev-qa-db-ja.com

バッファプール外のSQL Server 2012メモリ消費

SQL Server 2012 SP2 Enterprise Editionのインスタンスを使用しており、最大よりも20 GB高いメモリを消費しています。メモリ制限。インスタンスは65GBに制限されていますが、以下のクエリで使用されている物理メモリは86GBを示しています

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

サーバーは2つのNUMAノードを持つ物理的なものです。バッファプールの外でメモリを消費しているものを見つける方法はありますか(それが起こっていると想定しています)?

DBCC MEMORYSTATUSの出力は次のとおりです。

output of DBCC MEMORYSTATUS

そして、ここに設定されたメモリ制限があります:-

screen shot of memory limit

前もって感謝します。

更新:-アーロンが提案したクエリを実行しました

SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC

これが出力です:-

MemoryClerkOutput

Pages_kbの合計は〜60GBになります

更新2:-DBCC MEMORYSTATUSの完全な出力はこちら:- http://Pastebin.com/nGn6kXEc

更新3:-ここにExcelファイルでのShankyのスクリプトの出力:- http://jmp.sh/LKRlH4K

更新4:-次の出力のスクリーンショット:-

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO

PhysMemInUse Screenshot

したがって、これはSQL Serverが65GB以上のセットを使用していることを示しているようです。

9
dbafromthecold

最大サーバーメモリは、バッファープールとすべてのページサイズの割り当てを制御しますが、 は、直接のWindows割り当て(リンクサーバー、sp_OA、XP)、スレッド/スレッドスタックに必要なメモリなどを制御しません

これはNUMAの方が高いと予想できます(20 GBが正常かどうかはわかりませんが)。ポイントは、最大サーバーメモリがSQL Serverのインスタンスによって使用されるメモリを完全に制御することを期待できないことです。インスタンス全体(バッファープール、プランキャッシュ、CLRだけでなく)が64GBを超えないようにする場合は、最大サーバーメモリをより低い値に設定する必要があります。

これを追跡するためのいくつかの潜在的なアイデア(私はすべてをMBに正規化します):

  • パフォーマンスカウンター

    何かが過度に大きいものとしてここから飛び出すかどうかを確認します。

    SELECT counter_name, instance_name, mb = cntr_value/1024.0
      FROM sys.dm_os_performance_counters 
      WHERE (counter_name = N'Cursor memory usage' and instance_name <> N'_Total')
      OR (instance_name = N'' AND counter_name IN 
           (N'Connection Memory (KB)', N'Granted Workspace Memory (KB)', 
            N'Lock Memory (KB)', N'Optimizer Memory (KB)', N'Stolen Server Memory (KB)', 
            N'Log Pool Memory (KB)', N'Free Memory (KB)')
      ) ORDER BY mb DESC;
    
  • トップ20の店員

    これはすでに完了していますが、完全を期すために:

    SELECT TOP (21) [type] = COALESCE([type],'Total'), 
      mb = SUM(pages_kb/1024.0)
    FROM sys.dm_os_memory_clerks
    GROUP BY GROUPING SETS((type),())
    ORDER BY mb DESC;
    
  • スレッドスタックサイズ

    まず、これがゼロであり、カスタム番号ではないことを確認してください(0でない場合は、理由を調べて修正してください)。

    SELECT value_in_use
      FROM sys.configurations 
      WHERE name = N'max worker threads';
    

    ただし、次のコマンドを使用して、スレッドスタックが使用しているメモリ量を確認することもできます。

    SELECT stack_size_in_bytes/1024.0/1024 
      FROM sys.dm_os_sys_info;
    
  • サードパーティのモジュールが読み込まれました

    SELECT base_address, description, name
      FROM sys.dm_os_loaded_modules 
      WHERE company NOT LIKE N'Microsoft%';
    
    -- you can probably trace down memory usage using the base_address
    
  • メモリ関連のDMV

    また、これらのDMVを見て通常とは異なる何かを見つけることができる場合もあります。

    SELECT * FROM sys.dm_os_sys_memory;
    SELECT * FROM sys.dm_os_memory_nodes WHERE memory_node_id <> 64;
    

この記事はSQL Server 2012より前に作成されたため、一部の列名と計算を調整する必要がある場合がありますが、他にも試してみる方法があります。

そのサイトの他の記事にもいくつかの良い背景があります:

max server memory外でメモリを使用するもののタイプに関するいくつかの良い情報(しかし、実際の使用状況を収集する方法についての良いデータはありません):

11
Aaron Bertrand

SQL Server 2012の最大サーバーメモリが何を制御するかについて、ボブドーアから以下の定義を得ました。詳細については Books Online もご覧ください。

最大サーバーメモリは、バッファープール、コンパイルメモリ、すべてのキャッシュ、QEメモリ許可、ロックマネージャーメモリ、CLRメモリ(基本的にはdm_os_memory_clerksにある「クラーク」)を含む、SQL Serverメモリの割り当てを制御します。スレッドスタックのメモリ、メモリヒープ、SQL Server以外のリンクサーバープロバイダー、または「非SQL Server」によって割り当てられたメモリDLLは最大サーバーメモリによって制御されません。

スレッドスタック、サードパーティDLL、Microsoft以外のリンクサーバープロバイダー(MySQL.PostgreSQLなど)に割り当てられたメモリ、またはSQL以外のSQL Serverアドレス空間にロードされたDLLサーバーは最大サーバーメモリの外部に割り当てられています。SQLServer 2012のIIRCバックアップ操作も、バッファープールの外部のメモリに割り当てられています。

リンクサーバーを使用して他のRDBMSをクエリしていますか?同じWindowsマシンにインストールされているその他のソフトウェア。次のクエリの出力をいくつかの共有場所に投稿できますか

select type,
sum(pages_kb)/1024 as [Memory utilized in MB],
sum(awe_allocated_kb)/1024 as [Memory allocated though Windows API]
 from sys.dm_os_memory_clerks
 group by type
 order by [Memory utilized in MB] desc
 Go
-------

 select (virtual_address_space_committed_kb/1024) as virtual_address_space_committed_MB,
 (locked_page_allocations_kb/1024) locked_page_allocations_MB,
 (pages_kb/1024) [memory allocated MB]
  from sys.dm_os_memory_nodes
  Go
-------
SELECT SUM (pages_in_bytes)/1024 as 'KB Used', type 
FROM sys.dm_os_memory_objects
GROUP BY type 
ORDER BY 'KB Used' DESC;
GO
--------
select name,
type,
sum(pages_kb)/1024 as [Mem MB],
sum(entries_count) as [Total Entry count] from sys.dm_os_memory_cache_counters
group by
type, name
order by [Mem MB] desc
Go
-----
select * from sys.dm_os_loaded_modules where company <> 'Microsoft Corporation'
go

いくつかの共有場所に完全なDBCC MMEMORYSTATUS出力をアップロードして、リンクをここに投稿することもできますか?これは、どのコンポーネントがメモリを使用しているかを理解するのに役立ちます

編集:dbcc memorystatusの出力に従って、2つのNUMAノードを確認でき、各ノードで使用されるメモリはおよそ

Node 1 : VM Committed 33554380

Node 2: VM Committed  33554420

Total is approx 64 G. 

ここでも、memorystatus出力でメモリマネージャが表示された場合、

Memory Manager                           KB
---------------------------------------- -----------
VM Reserved                              260726964
VM Committed                             **67108820**

コミットされたVMは、実際にはSQL Serverによってコミットされた仮想メモリであり、このメモリがコミットされているため、physical memory backing itになります。これも、SQL Serverが最大サーバーメモリの設定で65Gを使用していると思います

これが最大サーバーメモリです。したがって、メモリは両方のノード間で適切に分散されているため、以下のクエリジュットの出力を追加して確認することもできます。スクリーンショットを追加してください

SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
3
Shanky