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の出力は次のとおりです。
そして、ここに設定されたメモリ制限があります:-
前もって感謝します。
更新:-アーロンが提案したクエリを実行しました
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
これが出力です:-
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
したがって、これはSQL Serverが65GB以上のセットを使用していることを示しているようです。
最大サーバーメモリは、バッファープールとすべてのページサイズの割り当てを制御しますが、 は、直接の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
外でメモリを使用するもののタイプに関するいくつかの良い情報(しかし、実際の使用状況を収集する方法についての良いデータはありません):
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