多實例 SQL Server 2008 R2 集群上的最大記憶體設置
- SQL Server 2008 R2 多實例集群(在 VMware vSphere 5.1 上)
- 2個節點,每個節點執行2個實例(共4個實例)
- 每個節點 16GB RAM。
實例在同一個節點上的唯一一次是在我修補另一個節點時。
Brent Ozar 的“最大伺服器記憶體”建議是保留 Windows 4GB 或 10%,以較大者為準。
既然這是一個集群,我應該如何設置每個節點的最大記憶體?我應該將每個伺服器視為獨立伺服器嗎?這將確保不會浪費每個節點上的記憶體。但是,在節點故障中,所有 4 個實例的最大記憶體總量將超過單個節點的系統記憶體。在我們恢復第二個節點之前,這會導致時間範圍內的任何問題嗎?是否需要降低 4 個實例的最大記憶體設置,直到輔助節點恢復?或者 SQL Server 是否足夠聰明以繼續工作(必要時使用頁面文件)。
當您處於最佳配置時,您絕對應該充分利用硬體,並在您處於維護模式時進行調整。是的,當兩個(或所有四個?)實例在同一個節點上處於活動狀態時,您會遇到問題。由於故障轉移會在現在處於活動狀態的節點上啟動服務,因此您可以使用啟動過程調整該事件中每個伺服器的最大記憶體。我在這裡寫了一篇部落格,但出於不同的原因(故障轉移到具有不同記憶體量的節點):
基本上,您只需要檢查兩個實例是否在同一個節點上(這將需要在兩個方向上都設置一個連結伺服器),並進行相應的調整。基於我的部落格文章的一個非常快速且完全未經測試的範例,並假設目前每個節點上一次只有一個實例(如果您總共有 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 個其他實例共享目前節點進行調整,這會變得更加複雜。
請注意,這將導致其他副作用,例如清除計劃記憶體(如果其中一個實例不只是重新啟動或故障轉移,在這種情況下計劃記憶體無論如何都是空的),但這些可以說比讓兩個實例都假設它們仍然有 12 GB 的記憶體可供使用 - 如果它們都被大量使用,將會有很多顛簸。
您可能還需要考慮其他選項,例如全域 maxdop、NUMA/CPU 親和性等,具體取決於系統對可用資源量的敏感程度。