sql-server – 什么是评估合理缓冲池大小的确定性方法?
副标题[/!--empirenews.page--]
我试图想出一个理智的方法来理解最大服务器内存(mb)设置是否合适(要么应该更低,要么更高,或保持原样).我知道最大服务器内存(mb)应该总是足够低,以便为操作系统本身留出空间等. 我正在看的环境有几百台服务器;我需要一个可靠的公式,我可以用它来确定缓冲池的当前大小是否合适,因为RAM是按每个服务器分配的GB计算的.整个环境都是虚拟化的,分配给VM的“物理”RAM可以轻松地上下移动. 我有一个特定的SQL Server实例,我现在看的是PLE为1,100,052秒,相当于12.7天(服务器启动的时间).服务器的最大服务器内存设置为2560MB(2.5GB),其中实际只提交了1380MB(1.3GB). 我读过几个项目,包括Jonathan Keheyias(post)和Paul Randal(post)以及其他几个项目. Jonathan主张监测每4GB缓冲池低于300的PLE太低.对于上面的SQL Server实例,300 *(2.5 / 4)= 187导致非常低的目标PLE低于300.此实例具有290GB的SQL Server数据(不包括日志文件),并且仅用于集成测试.假设过去12天代表此服务器的典型用法,我会说可以降低最大服务器内存(mb)设置. 在规模的另一端,我有另一个集成测试服务器,PLE为294,最大服务器内存(mb)设置只有1GB.此服务器只有224MB的SQL Server数据,不包括日志,并且正在运行一些BizFlow数据库.此服务器可能受益于更高的最大服务器内存(mb)设置. 我认为对于可能被分配了太多内存的目标来说,一个很好的起点可能包括: SELECT RamMB = physical_memory_in_bytes / 1048576,BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576,BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576,PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed) / bpool_commit_target) * 100) FROM sys.dm_os_sys_info; 如果BufferPoolCommitTargetMB / BufferPoolCommittedMB大于1,则服务器不使用整个缓冲池.如果相关机器的PLE大于“x”,那么它可能是减少最大服务器内存(mb)的良好候选者. 由于缓冲区管理器:懒惰写入/秒性能计数器跟踪SQLOS由于内存压力而在检查点之间将页面写入磁盘的次数,这可能是另一个值得关注的好处. DECLARE @WaitTime DATETIME; SET @WaitTime = '00:00:15'; DECLARE @NumSeconds INT; SET @NumSeconds = DATEDIFF(SECOND,@WaitTime); DECLARE @LazyWrites1 BIGINT; DECLARE @LazyWrites2 BIGINT; SELECT @LazyWrites1 = cntr_value FROM sys.dm_os_performance_counters dopc WHERE ( dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS ) AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),SERVERPROPERTY('InstanceName')) + ':Buffer Manager'; WAITFOR DELAY @WaitTime; SELECT @LazyWrites2 = cntr_value FROM sys.dm_os_performance_counters dopc WHERE ( dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS ) AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),SERVERPROPERTY('InstanceName')) + ':Buffer Manager'; SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds; 上面的代码假设服务器在运行15秒内处于负载状态,否则将报告0;这可能是误导性的假阴性. 我是否还应该将PAGELATCHIO_ *等待统计数据或其他等待类型视为内存压力的指标,或者是否存在? 我的问题是,如何可靠地确定PLE和最大服务器内存(mb)的“良好”目标值? 解决方法正如您已经知道的那样,没有计算最大服务器内存的通用公式,您可以做一些快速数学运算并达到一个值,但最后仍需要Perfmon计数器的帮助来监控内存使用情况并相应地进行更改.我知道下面的通用公式,我也使用它.我从 This Link开始学习这个公式对于SQL Server 2005到2008 R2 请注意从SQL Server 2005到2008 R2最大服务器内存仅控制缓冲池.因此,最大服务器内存配置在这里有点繁琐,并且涉及很少的计算 >对于Windows操作系统,请立即保留2 G内存. >考虑驱动程序/固件的内存要求.您必须根据系统上安装的驱动程序的内存要求派生它. RAMMAP工具可以提供帮助 select sum(multi_pages_kb)/1024 as multi_pages_mb from sys.dm_os_memory_clerks 最大工作线程* 2MB 在大多数情况下,直接Windows分配的内存大约为0到300 MB,但如果在SQL Server进程中加载??了许多3方组件(包括链接服务器dll,第三方备份dll等),则可能需要增加它. 如果您正在使用CLR,请为CLR添加一些额外的内存. 大约(每GB 100 MB到4G)(每增加一个GB 50 MB,直到12 GB)(每增加一个GB为25 MB,直到你的RAM大小) 如果您有任何其他特定于您的环境的内存要求. 最大服务器内存=物理内存总量 – (1 2 3 4 5 6 7) 我没有包含SSIS.SSRS,SSAS的内存配置,您还需要从总物理服务器内存中减去这些服务所需的内存. 在上面配置之后,您需要监视以下计数器
对于SQL Server 2012/2014. (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |