web-dev-qa-db-ja.com

SQL Serverが20コアの制限とアフィニティマスクですべてのNUMAメモリを使用していない

次の仕様の物理SQL Server 2016 SP1マシンがあります。

  • CPUソケット:2
  • ソケットあたりのコア数:44
  • マルチスレッド:はい
  • コア数:88
  • RAM:256 GB
  • SQL Serverの最大メモリ:240 GB
  • NUMA:CPU1 128 GB CPU2 128 GB

コアではなく、SQL Server 2016 Enterprise Edtion CALライセンスを実行しているため、ライセンスの制限により、20(40)コアしか使用できません。デフォルトでは、アフィニティマスクはCPU1の最初の40コアを有効にします。つまり、CPU2とNUMAノードメモリは使用されません。

CPU1とCPU2を有効にするようにアフィニティマスクを変更し、両方のNUMAノードのメモリをSQL Serverで使用できるようにしました。

ALTER SERVER CONFIGURATION

SET PROCESS AFFINITY CPU = 1 TO 20, 65 TO 84;

情報とGlenn Berryからの選択 https://www.sqlskills.com/blogs/glenn/balancing-your-available-sql-server-core-licenses-evenly-across-numa-nodes/

-- SQL Server NUMA node information 

SELECT node_id, node_state_desc, memory_node_id, processor_group, online_scheduler_count, 
   active_worker_count, avg_load_balance, resource_monitor_state FROM sys.dm_os_nodes WITH (NOLOCK) WHERE node_state_desc <> N'ONLINE DAC' OPTION (RECOMPILE);

enter image description here

-- SQL Server schedulers by NUMA node

SELECT parent_node_id,   SUM(current_tasks_count) AS [current_tasks_count], SUM(runnable_tasks_count) AS [runnable_tasks_count],   SUM(active_workers_count) AS [active_workers_count],   AVG(load_factor) AS avg_load_factor FROM sys.dm_os_schedulers WITH (NOLOCK) WHERE [status] = N'VISIBLE ONLINE' GROUP BY parent_node_id;

enter image description here

情報とDavid Alcockからの選択 https://www.sqlshack.com/monitoring-memory-clerk-and-buffer-pool-allocations-in-sql-server/

SELECT TOP 10 [type], SUM(pages_kb) / 1024 AS SizeMb FROM sys.dm_os_memory_clerks GROUP BY [type] ORDER BY SUM(pages_kb) / 1024 DESC

enter image description here

これは、約90 GBのメモリが使用されていることを示しています。

このサーバー上のデータベースの合計は285 GBです。 sys.dm_os_buffer_descriptorsは、バッファープールが65 GBを使用し、10 GBが空であることを報告します。

select * from sys.dm_os_process_memory

enter image description here

physical_memory_in_use_kb large_page_allocations_kb Locked_pa​​ge_allocations_kb total_virtual_address_space_kb virtual_address_space_reserved_kb virtual_address_space_committed_kb virtual_address_space_available_kb page_fault_count memory_utilization_percent0 503 483 503メモリ_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _は_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _はある

すべてのメモリが使用されているかどうかを明確にする方法はありますか?または、4つのノードがオフラインであるという事実は、それが事実であることを意味しますか?

どうもありがとう

1)sys.dm_os_memory_nodesの結果を確認します。 SQL Serverを正しく構成すると、memory_node_id 0および1の行が表示されます。これは、SQL Serverがサーバー上のすべてのメモリにアクセスできることを意味します。

enter image description here

私はmemory_node_id 0と1を持っています。

2)NUMA対応のお気に入りのメモリクラークのsys.dm_os_memory_clerksの結果を確認します。たとえば、バッファープールが複数のNUMAノードに分散しているかどうかを確認できます。

SELECT memory_node_id, pages_kb FROM sys.dm_os_memory_clerks WHERE [type] = N'MEMORYCLERK_SQLBUFFERPOOL';

enter image description here

メモリー・ノード0と1の両方のページが表示される可能性があります。表示されない可能性もあり、必ずしも問題を表しているとは限りません。

これは、ノード0と1の両方のページを示しています。

3)sys.dm_exec_query_resource_semaphoresの結果を確認します。 Target_memory_kbは、最大サーバーメモリの約70〜80%にする必要があります。 192 GBよりも96 GBに近い場合は、問題がある可能性があります。

enter image description here

target_memory_kbは、resource_semaphore_id 0で150〜180 GBです。高い値は、最大サーバーメモリの70%です。

これはすべて、現在使用されていない場合でも、SQL Serverがすべてのメモリを使用できることを示しています。また、バッファプールの使用量は時間とともに増加します。

ありがとう

3
sjappleyard

一般に、SQL Serverは必要な場合にのみ使用メモリを増やします。各NUMAノードには128 GBのメモリがあり、クエリは90 GBのメモリのみが使用中であることをクエリが示唆しているため、NUMAノードにローカルなメモリはSQL Serverで利用できないと結論付けることはできません。構成を検証したい場合は、いくつかの方法を知っていますが、それらすべてが本番環境に適しているわけではありません。すべての場合において、現在得られている結果を、デフォルトのアフィニティーマスクで得られた結果と比較できます。

1) sys.dm_os_memory_nodes の結果を確認します。 SQL Serverを正しく構成すると、memory_node_id 0および1の行が表示されます。これは、SQL Serverがサーバー上のすべてのメモリにアクセスできることを意味します。

2) sys.dm_os_memory_clerks の結果を見て、NUMA対応のお気に入りのメモリクラークを探します。たとえば、バッファープールが複数のNUMAノードに分散しているかどうかを確認できます。

SELECT memory_node_id, pages_kb
FROM sys.dm_os_memory_clerks
WHERE [type] = N'MEMORYCLERK_SQLBUFFERPOOL';

メモリー・ノード0と1の両方のページが表示される可能性があります。表示されない可能性もあり、必ずしも問題を表しているとは限りません。

3) sys.dm_exec_query_resource_semaphores の結果を確認します。 Target_memory_kbは、最大サーバーメモリの約70〜80%にする必要があります。 192 GBよりも96 GBに近い場合は、問題がある可能性があります。

4) TF 834 を起動パラメータとして有効にした後、SQL Serverを再起動します。トレースフラグ834を使用すると、SQL Serverは起動時に、ラージページを使用してバッファープールを最大サイズまで拡張します。ゲストOS内のメモリが断片化されている場合、最大サーバーメモリが表示されないことがあります。このトレースフラグを有効にすると、ワークロードにある程度の影響があるため、このようなテストは非運用シナリオでのみ実行することをお勧めします。ただし、SQL Serverが自分の目でできるすべてのメモリを使用していることを本当に確認する必要がある場合は、このオプションが適している場合があります。

3
Joe Obbish