Som*_*Guy 6 sql-server best-practices memory clustering configuration
实例在同一节点上的唯一时间是我修补另一个节点时。
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 关联等,具体取决于系统对可用资源量的敏感程度。