【IT168 专稿】在SQL Server正常的操作周期中,数据库从磁盘读入内存,这就是所谓的“Clean”数据,在内存中的数据页被修改后,该页就会被标记为“Dirty”。最终,所有的脏数据库都会被写回磁盘并将所有页重新标记为“Clean”,当数据缓冲区面临压力时,会将“Clean”数据从数据缓冲区中清除掉,当下次有查询涉及到相关数据时,再从磁盘中将数据读入缓冲区。
当频繁活动的“热”数据量小于缓冲区大小时,这种机制没有任何问题。但如果频繁活动的“热”数据量大于缓冲区大小时,则会给IO子系统带来不小的压力。
SQL Server 2014中的一个新特性,可以将SSD虚拟成缓冲区的一部分,来供SQL Server数据页缓冲区使用,这种机制就是所谓的缓冲区扩展(BPE)。缓冲区扩展的理念不仅仅是利用快速、低延迟的持久化存储扩展缓冲区,而且是利用磁盘针对SQL Server存储“Clean”数据,尤其是被内存缓冲区Page-Out出来的数据。通过使用SSD来扩展数据缓冲区(Buffer-Pool),可以使得大量随机的IOPS由SSD缓冲区扩展来承载,从而大量减少对于IO子系统的压力。
一、为什么需要缓冲区扩展
SSD是固态存储,不像传统的磁盘有磁头移动的部分,因此随机读写的IOPS远远大于传统的磁盘。将SSD作为Buffer Pool的延伸,缓冲区的大小就不仅仅局限于物理内存,还可以使用更加低成本的SSD存储扩充缓冲区。传统的模式是只利用内存作为缓冲区容纳热数据,从而在缓冲区不足以容纳热数据时,造成比较大的Page-Out,给IO子系统带来较大压力,如图1所示。
▲图1.大量随机的IOPS需要由磁盘阵列所承担
由图1可以看出,数据库系统会将随机IO操作和顺序IO操作(OLAP或日志)分离,热数据(Working Set)在缓冲区和IO子系统之间交换。在热数据大于物理内存很多时,额外的压力将会由IO子系统承担,从而影响了整个数据库系统的吞吐量。
如果考虑到将SSD加入数据库缓冲区的存储体系中,此时缓冲区以非常低的成本扩展到热数据,此时缓冲区的压力不会波及到IO子系统,而是相较于内存成本更低廉的SSD存储,如图2所示。
由图1和图2的对比可以看出,扩展后由于缓冲区的压力不会波及到IO子系统,对IO子系统的吞吐量和IOPS要求降低,因此IO子系统可以使用成本更加低廉的SATA存储替代SAS存储阵列。此外,该特性对应用程序透明,无需应用程序做任何修改。
前文提到,SQL Server的BPE功能不仅仅是像虚拟内存那样对内存做一个简单的扩充,而是针对SQL Server和SSD特性的做了优化。首先,SSD存储写的寿命是有限的,因此SQL Server BPE通常只利用SSD存储“ Clean”页,从而SSD会承载更多的读负载而不是写负载,延长SSD的寿命。另一点是SSD存储相对于内存更容易损坏,利用SSD存储“Clean”页,这样一来即使SSD块出现损坏,只需要从IO子系统重新读取数据即可,不会造成数据丢失。
最后,BPE对于NUMA进行了特别优化,即使拥有超过8个Socket的系统,CPU也能无障碍的访问内存。
二、如何使用缓冲区扩展
在SQL Server 2014中,启用缓冲区扩展的方法非常简单,使用一个需要拥有SysAdmin角色权限的管理员账号,执行如图3所示的T-SQL语句即可。其中,语句中指定缓冲区扩展文件的存储位置和大小。
启用完成后,可以在相应的物理磁盘中看到该扩展文件,该文件的存在形式和Windows的虚拟内存文件非常类似,如图4所示。
值得注意的是,启用的缓冲区扩展无法小于数据库服务器的物理内存大小或阈值,否则会报错,如图5所示。
对于该功能,SQL Server引入了一个全新的DMV用于监控相关的参数,并在原有查看缓冲区信息的DMV上加了一列,来描述缓冲区数据页所在位置是物理内存还是扩展缓冲区,如图6所示。
此外,还在Windows性能计数器引入了一组缓冲区扩展相关的计数器,以方便监控缓冲区扩展相关的参数。
三、小结
SQL Server 2014的缓冲区扩展特性提供了以更低成本来满足更高企业级数据库需求的技术,结合新的内存数据库特性,将会帮助企业在关键任务系统中表现的更为出色。
作者简介
宋沄剑,微软SQL server最有价值专家,《SQL Server 2012管理高级教程》译者,SQL Server专家协会北京分会创始人之一,目前就职于北京格瑞趋势科技有限公司任数据库高级顾问,专注于帮助大型企业用户设计数据库方案和解决数据库问题。