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


10

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

ターゲットサーバのメモリは、時には6ギガバイトで、その後、バックに落ちるの合計サーバーメモリ(約5.3ギガバイト、6ギガバイトに達することはありません)。私が使用committed_kbをしてsys.dm_os_sys_info 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_buffers私が見つかりましたRESOURCE_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であることがわかりました。

回答:


3

最初に、サーバーの最大メモリを6 GBに設定し、合計メモリを8 GBにしたので、OSに2 GBを残しました。多くの場合、SQL以外にWindowsマシンに何もインストールされていなくても、 、OSに提供されているメモリが少なすぎます。ウイルス対策がインストールされているシステムで適切に機能するには、OSに少なくとも4 GBが割り当てられている必要があります。私はすぐにOS用に2GB、AV用に1.5Gを残しています。

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

ターゲットサーバーのメモリは、SQL Serverが理想的なケースで適切に機能するために必要なメモリの量を示します。最大サーバーメモリ値を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は、メモリが必要な場合にのみページを削除すると思います。

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

もう1つ、タスクマネージャでSQL Serverのメモリ消費を確認しないでください。特にSQL Serverサービスアカウントがメモリ内ロックページ権限を持っている場合は、常に正しい値が得られるとは限りません。あなたのケースでは、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は実際に使用される物理メモリまたはコミットされたメモリです。SQL Serverプロセスの一部もディスクにページングされ、仮想メモリまたはページファイルとして構成されます。そのため、SQL Serverによって消費される合計メモリを確認する場合は、物理メモリとページファイルの合計になります。

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

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

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


5

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

Christian Boltonの独創的なProfessional SQL Server 2008の内部とトラブルシューティングからの抜粋:

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

合計とターゲットサーバーのメモリが同じ場合でも、メモリを圧迫していないことを100%確認することはできません。この場合、いくつかのメモリカウンターを起動し、それらのデータも取得して結論に達する必要があります。
Shanky 2016

「合計とターゲットは、しばらくの間実行されているメモリのプレッシャーがないサーバーではほぼ同じでなければなりません。」これについて考えてみましょう。128 GBのRAMを備えた新しいSQL Serverを立ち上げ、1 GBのデータベースを1つ起動します。1か月間実行します。合計と目標がその月の終わりにほぼ同じになると本当に信じているのですか?そうでない場合、サーバーにメモリの負荷がかかっていると思いますか?それを信じるのは難しいと思います。
マイクシェリル「キャットリコール」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.