web-dev-qa-db-ja.com

SQL Serverがすべてのメモリを使用していない

SQL Server 2014でmax memoryを6GBに設定しています(物理メモリは8GB)。

Target Server Memoryは6GBになることがあり、その後Total Server Memoryに戻ります(約5.3GB、6GBに達することはありません)。 sys.dm_os_sys_infocommitted_kbを使用して、SQL Serverが使用するメモリを確認しました。

sys.dm_os_buffer_descriptors を監視すると、ページがキャッシュから削除されているのがわかりますが、700MBのメモリが残っています。何もメモリを必要としない場合、ページがキャッシュから削除されるという事実をどのように説明しますか? SQL Serverは、メモリが必要な場合にのみページを削除すると思います。

割り当て解除された一時テーブルは、このサーバーでは問題になりません。私のPLEは3632です。プロシージャキャッシュは2182 MBです。

メモリが残っていない場合にのみページがドロップされると思いますが、700MBの空きがあるか、これを誤解していますか?

誰かがこの動作を説明してみてください。

SQL Serverもディスクから読み取っているので、必要なすべてのページがメモリにあるとは限らないと思います。

さらに調査を行ったところ、ディスクからメモリに大量のページを読み取ったところ、読み取り中にタスクマネージャに何かがあったことに気づきました。

  • 使用中のメモリは、7.0GB-> 7.2GB-> 7.0GB-> 7.2GB-> ...
  • Sqlservr.exeは5.3GB-> 5.5GB-> 5.3GB-> 5.5GB-> ...

これは、Windowsがsqlservr.exeを6GBに拡張できないようにしています。

Shankyから提供されたクエリを実行しました。

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

これにより、次の結果が得られました。

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Total_Memory_in_MBが6144(最大メモリ)に等しくないのはなぜですか?

sys.dm_os_ring_buffersRESOURCE_MEMPHYSICAL_LOWを見つけたので、Windowsのメモリが不足していて、SQL Serverはいくつかを返す必要があると思います。しかし、約1GBのメモリが利用可能です=>なぜWindowsはメモリが不足していると言っているのですか?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

更新
なぜ1GBのメモリが常に利用できるのかをさらに調査した後、何かを見つけたと思います。
SQL Serverは空きメモリのみを割り当てることができ、その利用可能なメモリは無視される可能性はありますか? Process Explorer(Sysinternals)を実行すると、空きメモリが0であることがわかりました。

10

まず、max server memoryを6 GBに設定し、total memoryを8 GBに設定したので、 OS用に2 GB。多くの場合、WindowsマシンにSQL Server以外に何もインストールされていなくても、OSに提供されるメモリが少なすぎます。アンチウイルスがインストールされているシステムで正常に機能するには、少なくとも4 GBのOSが必要です。私はすぐにOS用に2GB、AV用に1.5Gを残しています。

ターゲットサーバーのメモリが6 GBになることもあり、その後、サーバーの合計メモリに戻ります(約5.3 GB、6 GBに達することはありません)。

Target server memoryは、理想的な場合にSQL Serverが適切に機能するために必要なメモリ量を示します。 max server memoryの値を6 GBに設定したため、ターゲットサーバーのメモリは6 GBにしようとしています。許可されているすべてのメモリを消費しようとしています。

合計サーバーメモリは、SQL Serverが実際に消費できる量です。これはコミットされたメモリであり、物理RAMによってサポートされます。この場合、これは最大5.5 GBです。

SQL Serverはメモリ消費量を増加させようとしていますが、5.3または5.5 GBに達した後、OSはSQL Serverにメモリ消費量をこれ以上増加させないように要求しており、実際にはメモリ不足通知にフラグを立てている可能性があります。これは、上記のようにOSがメモリ不足に直面しているために発生しています。 SQLOSは、Windows OSがキャッシュの消費を削減するようにキャッシュに要求することで、メモリ不足に直面した場合に応答します。 クエリリングバッファ により、メモリ不足の通知が通知されたかどうかを確認できます。 DMVを追加する必要がありますsys.dm_os_ring_bufferは文書化されていませんが安全です。

ページがキャッシュから削除されているのがわかります-まだ700MBのメモリが残っています。何もメモリを必要としない場合、ページがキャッシュから削除されるという事実をどのように説明しますか? SQL Serverは、メモリが必要な場合にのみページを削除すると思います。

あなたが空きメモリを探しているなら、私はお勧めしませんあなたはDMVsys.dm_os_buffer_descriptorsを見るようにします。 OSカウンターAvailable Mbytesは、コンピューターで実行されているプロセスが使用できる物理メモリの量をバイト単位で示します。 賢明なバッファプールサイズを評価するための決定論的方法とは何ですか? を参照し、 SQL ServerにRAMがさらに必要か を確認して、RAM SQL Serverが必要で、SQL Serverがメモリ不足に直面している場合。ページからバッファプールから削除されていることが確かである場合、SQL Serverはスペースが必要なため、ページを移動する必要があると感じています。新しいページに対応するために700 MBの空き容量をどのように計算したかわかりません。

もう1つ、タスクマネージャでSQL Serverのメモリ消費を確認しないでください。特にSQL Serverサービスアカウントにlock pages in memory特権がある場合は、常に正しい値が得られるとは限りません。あなたのケースでは、SQL Serverの最大サーバーメモリが6 GBであっても、OSに2 GBしか与えられていないため、SQL Serverでは2 GBが少ないため、SQL Serverは消費を増やしません。システムで実行されているSQL Server以外に何かありますか?

SQL Serverのメモリ消費量を計算する場合は、次を使用してください:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Total_Memory_in_MBが6144(最大メモリ)に等しくないのはなぜですか。

Total_Memory_in_MBは、SQL Server(RAM +ページファイル)によって使用される合計メモリを示します。 RAMは実際に使用される物理メモリまたはコミットされたメモリです。SQLServerプロセスの一部もディスクにページングされ、仮想メモリまたはページファイルとして構成されているため、TOTAL SQL Serverによって消費されるメモリは、物理メモリとページファイルの合計になります。

Physical_Memory_usedby_Sqlserver_MBは、使用されている物理メモリ(physical RAMまたはコミットされたメモリによってサポートされているメモリ)です。これが両方が異なる理由です実際の列が最初に表示される場合、1つは使用されている物理メモリで、もう1つはコミットされている仮想メモリです。

Total_Memory_in_MBPhysical_Memory_usedby_Sqlserver_MBの違いになるページメモリを表示する場合。

注:使用される合計メモリは、使用される物理メモリよりも大きくなります。

3
Shanky

SQL Serverは、バッファキャッシュ以外の多くのキャッシュを使用しますが、これは明らかに最大です(明白な例はプランキャッシュです)。 _DBCC MEMORYSTATUS_とさまざまなDMVを使用して、メモリを詳しく調べることができます。ターゲットメモリと合計メモリは、特にバッファプール/キャッシュを参照します。

Christian Bolton の独創的な Professional SQL Server 2008 Internals and Troubleshooting からの抜粋:

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB)
    これは、バッファプールの現在のサイズを示します。
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB)
    これは、バッファープールの理想的なサイズを示します。 TotalとTargetは、しばらくの間実行されているメモリのプレッシャーがないサーバーではほぼ同じです。 TotalTargetを大幅に下回る場合、SQL Serverはメモリのプレッシャーが原因でバッファプールを拡張できない可能性があります。さらに調査できます。
5
Mark Broadbent