在今天的文章里我想谈下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命令。我们来详细看下如何使用它:

 USE master
GO EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
 ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
(
FILENAME = 'd:\ExtensionFile.BPE',
SIZE = 1 GB
)
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/

最新文章

  1. 挤点时间写博客-php&MySQL实践
  2. Python3基础 sum,range 计算1到100的和
  3. GCD时间轴
  4. linux内存——/proc/sys/vm/drop_caches
  5. js(jQuery)获取时间搜集
  6. skynet是什么
  7. java敏感词过滤
  8. 蓝桥杯算法训练<一>
  9. Win32应用程序的基本结构
  10. [LeetCode]题解(python):017-Letter Combinations of a Phone Number
  11. JDBC数据源 使用JNDI连接池实现数据库的连接
  12. RunLoop想入门,看这篇就够了
  13. Python optparser库详解
  14. webstorm使用问题总结
  15. 快速查看linux命令的用法----------TLDR
  16. ubuntu 16.04 国内仓库地址
  17. AOP之配置文件实现
  18. go for range
  19. bind带autocomplete时,最好是从新的tr复制
  20. UVa 1606 两亲性分子

热门文章

  1. 中国大学MOOC-陈越、何钦铭-数据结构-2016秋期末考试
  2. 双击防止网页放大缩小HTML5
  3. Centos6下安装Mono和Jexus部署ASP.NET应用程序(纯干货)
  4. Entity Framework 5.0系列之Code First数据库迁移
  5. Silverlight中异步调用WCF服务,传入回调函数
  6. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
  7. ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇
  8. 自制Unity小游戏TankHero-2D(2)制作敌方坦克
  9. 在同一台服务器上配置多个Tomcat
  10. Atitit  深入理解命名空间namespace  java c# php js