web-dev-qa-db-ja.com

マルチインスタンスSQL Server 2008 R2クラスターの最大メモリ設定

  • SQL Server 2008 R2マルチインスタンスクラスター(VMware vSphere 5.1)
  • それぞれ2つのインスタンスを実行する2つのノード(合計4つのインスタンス)
  • 16GB RAMノードあたり。

インスタンスが同じノード上にあるのは、他のノードにパッチを適用しているときだけです。

Brent Ozarの「最大サーバーメモリ」 推奨 は、Windows 4GBまたは10%のうち、どちらか大きい方をそのままにします。

これはクラスターなので、各ノードの最大メモリをどのように設定すればよいですか?それぞれをスタンドアロンサーバーとして扱う必要がありますか?これにより、各ノードのメモリが無駄になりません。ただし、ノード障害では、4つのインスタンスすべての最大メモリの合計が単一ノードのシステムメモリを超えます。これにより、2番目のノードが回復するまでの時間枠で問題が発生しますか?セカンダリノードが復旧するまで、4つのインスタンスの最大メモリ設定を下げる必要がありますか?または、SQL Serverは機能し続けるのに十分スマートです(必要に応じてページファイルを使用します)。

6
SomeGuy

最適な構成でハードウェアを最大限に活用し、メンテナンスモードで調整する必要があります。そして、はい、両方(または4つすべて?)のインスタンスが同じノードでアクティブになっているときに問題が発生します。フェイルオーバーによって現在アクティブなノードでサービスが開始されるため、起動手順を使用して、そのイベントでの各サーバーの最大メモリを調整できます。私はこれについてここでブログに書いたが、別の理由(メモリ量の異なるノードにフェイルオーバーする)のために:

基本的に、両方のインスタンスが同じノード上にあるかどうかを確認し(そして リンクサーバー を両方向に設定する必要があります)、それに応じて調整する必要があります。私のブログの投稿に基づいており、現時点では各ノードにインスタンスが1つだけあると仮定して、非常に迅速で完全にテストされていない例(2つのインスタンスまたは4つのインスタンスがある場合、問題は少しあいまいです):

CREATE PROCEDURE dbo.OptimizeInstanceMemory
AS
BEGIN
   SET NOCOUNT ON;

   DECLARE
     @thisNode      NVARCHAR(255) = CONVERT(NVARCHAR(255),
                                  SERVERPROPERTY('ComputerNamePhysicalNetBIOS'),
     @otherNode     NVARCHAR(255),
     @optimalMemory INT = 12288, -- 12 GB
     @sql           NVARCHAR(MAX);

  SET @sql = N'SELECT @OtherNode = CONVERT(NVARCHAR(255), 
                        SERVERPROPERTY(N''ComputerNamePhysicalNetBIOS''));';

  EXEC [SERVER\INSTANCE].master..sp_executesql @sql, 
    N'@OtherNode NVARCHAR(255) OUTPUT', @OtherNode OUTPUT;

  IF @thisNode = @otherNode
  BEGIN -- we're on the same node, let's make everyone happy
    SET @optimalMemory = 6144;
  END

  SET @sql = N'EXEC sp_configure N''max server memory'', @om;
    RECONFIGURE WITH OVERRIDE;';

  EXEC                   master..sp_executesql @sql, N'@om INT', @optimalMemory;
  EXEC [SERVER\INSTANCE].master..sp_executesql @sql, N'@om INT', @optimalMemory;
END
GO

EXEC [master].dbo.sp_procoption 
  N'dbo.OptimizeInstanceMemory', 'startup', 'true';

もちろん、他のインスタンスで再度作成して、使用するリンクサーバー名を入れ替えます。

現在のノードを1つ、2つ、または3つの他のインスタンスと共有しているかどうかに応じて調整する必要がある場合、これは少し複雑になります。

これは、プランのキャッシュをクリアするなどのその他の副作用を引き起こすことに注意してください(インスタンスの1つが再起動またはフェイルオーバーしなかった場合、どちらの場合もプランキャッシュは空になります)が、両方のインスタンスを残して、まだ12 GBのメモリがあると想定するよりも間違いなく優れています。両方を頻繁に使用すると、大量のスラッシングが発生します。

また、システムが利用可能なリソースの量にどれだけ敏感であるかに応じて、グローバルmaxdop、NUMA/CPUアフィニティなどの他のオプションを検討することもできます。

10
Aaron Bertrand

元々質問のコメントとして残された部分的な回答を集めたコミュニティWiki回答


...(必要に応じてページファイルを使用)。

Jon Seigel :はい、そうですが、- あなたはそれをしたくない です。私が聞いた(Brentからも)最高のアドバイスは、最良のシナリオの最大値を設定し、最悪のシナリオの最小値を設定することです。

Kin :これらのリンクは、スクリプトの作成に役立ちます。

Mark :参照 Dynamic Memory Management (TechNet)

2
Paul White 9