zoukankan      html  css  js  c++  java
  • SQL Server 2014里的缓存池扩展

    在今天的文章里我想谈下SQL Server 2014里引入的缓存池扩展(Buffer Pool Extensions)。我们都知道,在SQL Server里,缓存池是主要的内存消耗者。当你从你存储里读取数据时,数据会在缓存池里缓存。SQL Server在计划缓存里缓存执行计划,也是缓存池的一部分。你拥有的物理内存越多,你的缓存池就会越大(通过【最大服务器内存】设置配置)。

    很多SQL Server用户会碰到数据库服务器里物理内存受限的问题:所有内存槽都被占用了,因此你如何想给物理服务器增加额外的内存?当然,你可以迁移到更大的服务器,但那是另外一回事……这个特定问题的解决方案是SQL Server 2014里引入的缓存池扩展。在缓存池扩展的帮助下,SQL Server在内存层级里引入了另外一层。我们来看下面的图片:

     

    如你所见,在顶部是缓存池本身,它是非常快的(根据响应时间(latency times)),在底部你会看到我们的传统存储,它是比较慢的。缓存池扩展刚好落户在2者之间——传统缓存池和我们存储之间。缓存池苦熬占本身是包含一个简单文件(所谓的扩展文件(Extension File)),它应该存储在非常快的存储上——例如SSD硬盘。扩展文件大体上和Windows系统的页文件一样。不用在你的数据库服务器增加额外的物理内存,你只要配置在SSD硬盘上配置扩展——就可以了!

    在我讨论配置并启用缓存池扩展前,我想简单谈下缓存池扩展的架构和背后的设计。SQL Server传统的缓存池总是在干净页和脏页间区分的。干净页就是内存里的内容和存储里的内容一样的页。脏页是在内存里改变的页,但还没有写回到存储。大约每分钟所谓的检查点(CHECKPOINT)过程会把脏页写回到存储,意味着脏页变成了干净页。

    如果SQL Server的缓存池陷入内存压力,缓存池扩展本身就会被使用。内存压力指的是SQL Server需要比当前可用更多的内存。在那个情况下,缓存会从缓存池驱逐页,那些页是最近刚使用过的。SQL Server这里使用的是近期最少使用算法(Least Recently Used Policy (LRU))。如果现在你配置了扩展文件,SQL Server会把这些页写到扩展文件,而不是把它们直接写入我们缓慢的存储。如果页是脏的,这些页也会并发写入物理存储(通过异步I/O操作)。因此当你使用缓存池扩展时,你不会丢失任何数据。到一定时间点你的扩展文件也会完全存满。在那个情况下SQL Server又会从扩展文件驱逐老页(也是通过LRU算法),最后把它们写入传统存储。扩展文件充当缓存池和存储本身之间的额外一层。

    现在我们来看下在SQL Server 2014里如何配置缓存池扩展。SQL Server这里提供你ALTER SERVER CONFIGURATION SET BUFFER POOL EXTENSION命令。我们来详细看下如何使用它:

    1 USE master
    2 GO 
    3 
    4 EXEC sp_configure 'show advanced options', 1
    5 RECONFIGURE WITH OVERRIDE
    6 GO
    1 ALTER SERVER CONFIGURATION
    2 SET BUFFER POOL EXTENSION ON
    3 (
    4    FILENAME = 'd:ExtensionFile.BPE',
    5    SIZE = 1 GB
    6 )
    7 GO

    这里你会碰到的第1个限制是扩展文件必须和缓存池本身一样的大小,如果你指定了比它小的文件大小,你会从SQL Server收到如下的错误信息:

    Msg 868, Level 16, State 1, Line 1
    Buffer pool extension size must be larger than the current memory allocation threshold 1596 MB. Buffer pool extension is not enabled.

    下一个你肯定会碰到的限制是,在SQL Server运行期间,你不能修改扩展文件的大小。例如,当你想修改扩展文件到更大的大小,你需要停用缓存池扩展,然后再次启用。在此操作期间,你的性能会下降,因为你刚刚停用了SQL Server一个重要的缓存层!

    当你计划为你的生产环境部署缓存池扩展时,你一定要意识到这点!!!

    另外你不能缩小扩展文件的大小,文件必须要比先前的大。不然你还会收到如下的错误信息:

    Msg 868, Level 16, State 1, Line 3
    Buffer pool extension size must be larger than the current memory allocation threshold 4096 MB. Buffer pool extension is not enabled.

    缓存池扩展的整个配置也可以通过DMV sys.dm_os_buffer_pool_extension_configuration来查询到。

    什么时候你应该使用缓存池扩展?微软建议在你的服务器工作负荷是少读多写(write-heavy)时,例如OLTP工作负荷。当你处理DWH/BI相关的工作复核时,你不应该考虑缓存池扩展——这里启用扩展文件没任何意义。并且当我们讨论扩展文件时,你应该为它配置好非常快的SSD!传统旋转硬盘(机械硬盘)就算了吧!

    参考文章:

    https://www.sqlpassion.at/archive/2014/03/11/buffer-pool-extensions-in-sql-server-2014/

  • 相关阅读:
    LintCode-35.翻转链表
    LintCode-159.寻找旋转排序数组中的最小值
    LintCode-73.前序遍历和中序遍历树构造二叉树
    LintCode-9.Fizz Buzz 问题
    NOI 2018 归程 (Kruskal重构树)
    模板 NTT 快速数论变换
    模板 FFT 快速傅里叶变换
    BZOJ 3510 首都 (LCT)
    BZOJ 4530 [BJOI2014]大融合 (LCT)
    BZOJ 3282 Link Cut Tree (LCT)
  • 原文地址:https://www.cnblogs.com/woodytu/p/4641593.html
Copyright © 2011-2022 走看看