我正在看的环境有几百台服务器;我需要一个可靠的公式,我可以用它来确定缓冲池的当前大小是否合适,因为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)的“良好”目标值?
解决方法
对于sql Server 2005到2008 R2
请注意从sql Server 2005到2008 R2最大服务器内存仅控制缓冲池.因此,最大服务器内存配置在这里有点繁琐,并且涉及很少的计算
>对于Windows操作系统,请立即保留2 G内存.
>当然系统会运行防病毒.请为防病毒留下1.5G.请注意Mcafee和sql Server不是齐头并进的,所以请确保您留下足够的空间.
您还可以检查perfmon counter Perfmon Process->专用字节和工作集用于监视AV和sql Server上运行的其他小应用程序的内存使用情况
>考虑驱动程序/固件的内存要求.您必须根据系统上安装的驱动程序的内存要求派生它. RAMMAP工具可以提供帮助
>考虑sql Server的NonbPool(aka MTL或MTR)内存要求.
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添加一些额外的内存.
>考虑作业(包括复制代理,日志传送等)的内存要求以及将在服务器上运行的包.根据运行的作业数量,它可以从MB到GB.对于中型服务器,您可以将其设置为250 MB
>确保有足够的可用空间用于操作系统.
大约(每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.
从sql Server 2012开始,设置最大服务器内存变得简单.因为现在最大服务器内存几乎占所有内存消耗.最大服务器内存控制sql Server内存分配,包括缓冲池,编译内存,所有缓存,qe内存授予,锁管理器内存和CLR内存(基本上是dm_os_memory_clerks中的任何“职员”).线程堆栈,堆,sql Server以外的链接服务器提供程序或“非sql Server”DLL分配的任何内存的内存不受最大服务器内存的控制.
您可以将75-80%分配给sql Server,然后使用perfmon计数器来监视内存使用情况.在sql Server 2012中,已弃用了几个perfmon计数器.不推荐使用缓冲区管理器计数器,您必须使用内存管理器计
关于PLE的价值,我使用了Joanthan的配方,幸运的是它对我有用.