SQL Serverの最大および最小メモリ構成


8

このユースケースでの最小メモリと最大メモリの正しい設定は何ですか?

サーバーには、Windows Server 2008 R2 / SQL Server 2008 Standard Editionを実行する8GBのRAM、デュアルIntel Xeonプロセッサーが搭載されています。30GBから5GBのサイズのデータ​​ベースをいくつか実行しています。

当初、メモリ使用量はデフォルト設定に設定されていました(min = 0 max = 2,147,483,647)。これらの設定では、ほとんどのメモリ使用量がsqlservr.exeによって占められ、最終的にサーバーは1〜2日ごとに再起動する必要があります。最初は正常に実行されますが、1日以内に、主キーを使用してレコードを検索するなどの単純な操作でタイムアウトが開始されます。

min = 4,096とmax = 6,144を変更しました。これにより、メモリ使用量は1.4GBのみになります。ただし、現在は4つすべてのCPUが常に50〜60%のCPU使用率で実行されています。サーバーの方がはるかに安定していますが、タスクの実行には約3分の1時間がかかります。


RAMを追加購入し、最大値をデフォルトのままにします。
Remus Rusanu 2013

4
@RemusRusanu私はあなたがをデフォルトにするつもりだったと思います!
Kin Shah

人々が慣習を忘れると、非常によく似たユースケースと同様の問題(SQLがすべてを取得するためにOSにメモリがない)があります。私たちの習慣は、0を最小、半分を最大として使用することです。
ポール

@kinいいえ、つまりmaxです。私は最小値と最大値の両方をデフォルト値のままにしておくと言われるべきですが、なぜとにかく誰もがなぜ最小値を変更するのか理解できませんでした...
Remus Rusanu 2013

1
@RemusRusanuあなたが持っている内部の知識の量+あなたの優れた答えのように、私はそれがタイプミスであると思いました。私は最大メモリをデフォルトのままにすることに同意しません。
キンシャー

回答:


10

この特定のサーバのためのあなたのRAMば可用性を見て、あなたがしている30ギガバイトから5ギガバイトまでの範囲の複数のデータベースを実行している、あなたは間違いなく、このサーバー上のより多くのRAMを必要としています。

これがスタンドアロンインスタンスであるか、このサーバーでSQLサーバーの複数のインスタンスが実行されていることについては言及していません。

最大メモリ設定は、8GB RAMを搭載したサーバーでは問題ないようです。Glenn Berryの推奨ベストプラクティス設定をご覧ください。

以下のPERFMONカウンターを使用して環境のベースラインを作成し、メモリ構成の適切な値を取得することを強くお勧めします。

  • SQL Server:Buffer Manager \ Page Life Expectancy
  • SQL Server:Buffer Manager \ Page読み取り/秒
  • 物理ディスク\ディスク読み取り/秒
  • メモリー\利用可能なメガバイト
  • SQL Server:メモリマネージャー-合計サーバーメモリ
  • SQL Server:メモリマネージャー-ターゲットサーバーのメモリ

合計サーバーメモリ:SQL Serverに割り当てられているメモリの合計ではなく、現在バッファプールに割り当てられているメモリの量

ターゲットサーバーのメモリ:インスタンスの最大メモリに対応するバッファプールの理想的なサイズ。

注: [サーバーの合計メモリ]> [ターゲットサーバーのメモリ]の場合は、メモリ不足を示唆しています。

以下のスクリプトは、sys.dm_os_ring_buffersシステムヘルスセッションからのメモリ不足通知またはメモリ不足通知を見つけるのに役立ちます。

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

いくつかの良い参考文献:


2
合計とターゲットの比較を間違った方法で行っていますが、いずれの場合も、サーバーが外部メモリの負荷にさらされているかどうかを判断するためのより良い方法があります。
ポールホワイト9

@paulwhite私の回答を改善できるように、もう少し明確にしていただけますか?ご覧いただきありがとうございます。
キン・シャー

これは、スタンドアロンインスタンスだ
sa555
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.