加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 什么是评估合理缓冲池大小的确定性方法?

发布时间:2020-12-26 07:01:10 所属栏目:编程 来源:网络整理
导读:我试图想出一个理智的方法来理解最大服务器内存(mb)设置是否合适(要么应该更低,要么更高,或保持原样).我知道最大服务器内存(mb)应该总是足够低,以便为操作系统本身留出空间等. 我正在看的环境有几百台服务器;我需要一个可靠的公式,我可以用它来确定缓冲池的当
副标题[/!--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内存.
>当然系统会运行防病毒.请为防病毒留下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的内存配置,您还需要从总物理服务器内存中减去这些服务所需的内存.

在上面配置之后,您需要监视以下计数器

  • SQLServer:Buffer Manager–Page Life Expectancy(PLE):

  • SQLServer:Buffer Manager–CheckpointPages/sec:

  • SQLServer:Memory Manager–Memory Grants Pending:

  • SQLServer:memory Manager–Target Server Memory:

  • SQLServer:memory Manager–Total Server memory

对于SQL Server 2012/2014.

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读