多实例 SQL Server 2008 R2 群集上的最大内存设置

Som*_*Guy 6 sql-server best-practices memory clustering configuration

  • SQL Server 2008 R2 多实例集群(在 VMware vSphere 5.1 上)
  • 2 个节点,每个节点运行 2 个实例(共 4 个实例)
  • 每个节点 16GB RAM。

实例在同一节点上的唯一时间是我修补另一个节点时。

Brent Ozar 的“最大服务器内存”建议是保留 Windows 4GB 或 10%,以较大者为准。

由于这是一个集群,我应该如何在每个节点上设置最大内存?我应该将每个服务器视为独立服务器吗?这将确保每个节点上的内存不会浪费。但是,在节点故障时,所有 4 个实例的最大内存总量将超过单个节点的系统内存。在我们恢复第二个节点之前,这会在时间范围内导致任何问题吗?是否需要降低 4 个实例的最大内存设置,直到辅助节点恢复?或者 SQL Server 足够聪明以继续工作(如有必要,使用页面文件)。

Aar*_*and 10

当您处于最佳配置时,您绝对应该充分利用硬件,并在处于维护模式时进行调整。是的,当两个(或所有四个?)实例在同一节点上都处于活动状态时,您会遇到问题。由于故障转移会在现在活动的节点上引发服务启动,因此您可以在该事件中使用启动过程调整每个服务器的最大内存。我在这里写了关于这个的博客,但出于不同的原因(故障转移到具有不同内存量的节点):

基本上,您只需要检查两个实例是否在同一个节点上(这将需要在两个方向上设置链接服务器),并相应地进行调整。一个非常快速且完全未经测试的示例,基于我的博客文章,并假设目前每个节点上一次只有一个实例(如果您总共有 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';
Run Code Online (Sandbox Code Playgroud)

当然,在另一个实例上再次创建它,交换使用的链接服务器名称。

如果您必须根据是否与 1、2 或 3 个其他实例共享当前节点进行调整,这会变得更加复杂。

请注意,这将导致其他副作用,例如清除计划缓存(如果其中一个实例只是重新启动或故障转移,在这种情况下计划缓存无论如何都会为空),但这些可以说比让两个实例假设它们仍然有 12 GB 的内存可以使用 - 如果它们都被大量使用,将会有很多颠簸。

您可能还需要考虑其他选项,例如全局 maxdop、NUMA/CPU 关联等,具体取决于系统对可用资源量的敏感程度。