在数据库服务器中,内存是数据库对外提供服务最重要的资源之一, 不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用. 在Sql Server服务器中,最理想的情况是Sql Server把所有所需的数据全部缓存到内存中,但是这 ...
在数据库服务器中,内存是数据库对外提供服务最重要的资源之一,
不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用.
在Sql Server服务器中,最理想的情况是Sql Server把所有所需的数据全部缓存到内存中,但是这往往也是不现实的,因为数据往往总是大于可用的物理内存
可以说内存是否存在压力能够直接决定数据库能否高效运行,同时,如果内存出现压力,同时也会影响到CPU的使用和存储性能,可以说是一损俱损,具有连带性。
那么,如何识别内存是否存在压力,如何判断一台服务器上是否存在内存瓶颈?
Sql Server 2012之后,对内存的管理进行了大刀阔斧的改革,所有的内存管理都受Max Server Memory的控制
如下截图所示的最大服务器内存设置(当然这个截图是我本机上一个测试实例,这里并不说明内存该怎么配置)
而大多数的内存量化都涉及到Sql Server的Buffer Pool,一个内部的缓存管理器,
可以说,Sql Server2012之后,所有内存的管理都受到Max Server Memory的控制。
同时,Sql Server在运行的过程中,会将各种内存的参数情况记录下来,这对我们去判断Sql Server内存压力有着非常重要的参考意义
下面提到的部分计数器的就存储在sys.dm_os_performance_counters这个系统视图中
我们抽取其中最重要的几个来做解释说明:
- Page Life Expectancy
- Buffer Cache hit ratio
- Page reads / sec
- Page writes / sec
- Lazy writes / sec
- Total Server Memory
- Target Server Memory
- Paging File % Usage
需要注意的是,不能通过上述某一个值就武断地断定内存瓶颈,各个计数器之间是有一定的关系的,要结合多个值来做谨慎的分析判断。
Page Life Expectancy又简称位PLE,含义是内存页面在内存中停留的平均时间,在系统视图sys.dm_os_performance_counters中可以查到,单位是秒,
需要注意的是它不是指某一个page的最大值或者最小值,而是所有由所有页面停留在buffer pool中的时间计算出来的一个平均值
如果这个值越大,说明Sql Server在检索数据时候直接从buffer pool中获取数据的概率越大,
如果Sql Server直接从buffer pool中检索到数据,那么就不用去磁盘中去查询,因为直接从内存中获取数据的效率要远远高出从磁盘中去获取数据
因为从内存中查询数据的延迟是纳秒级的,而从磁盘获取数据的延迟是毫秒级的,这之间差了两个数量级,可见从缓存中获取数据和从磁盘中获取数据,对性能的影响有多大
那么PLE这个值多少位正常呢?我发现很多资料上多这个值都有误解,说是300S,300S是在十多年前的一个参考值,是基于当时的服务器内存受到4GB内存的限制的影响得到的,
目前服务器内存动辄超过100GB的情况下,用同样的标准,显然是不够准确的,这个值的计算是跟具体的服务器内存配置有关的
具体我就不做进一步的解释,可以参考如下链接
https://simplesqlserver.com/2013/08/19/fixing-page-life-expectancy-ple/
一个可供参考的标准算法是 Max Buffer Pool(GB)/4*300(S)
这个值可以通过sys.dm_os_performance_counters 这个系统视图直接查询得出
select * from sys.dm_os_performance_counters where object_name like '%Buffer Manager%' and counter_name='Page life expectancy'
原标题:Sql Server 内存相关计数器以及内存压力诊断
关键词:sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。