转基于SSD固态硬盘的数据库性能优化
NOR和NAND
NOR和NAND都是闪存技术的⼀种,NOR是Intel公司开发的,它有点类似于内存,允许通过地址直接访问任何⼀个内存单元,缺点是:密
度低(容量⼩),写⼊和擦除的速度很慢。NAND是东芝公司开发的,它密度⾼(容量⼤),写⼊和擦除的速度都很快,但是必须通过特定
的IO接⼝经过地址转换之后才可以访问,有些类似于磁盘。
我们现在⼴泛使⽤的U盘,SD卡,SSD都属于NAND类型,⼚商将flashmemory封装成为不同的接⼝,⽐如Intel的SSD就是采⽤了SATA的
接⼝,访问与普通SATA磁盘⼀样,还有⼀些企业级的闪存卡,⽐如FusionIO,则封装为PCIe接⼝。
SLC和MLC
SLC是单极单元,MLC是多级单元,两者的差异在于每单元存储的数据量(密度),SLC每单元只存储⼀位,只包含0和1两个电压
符,MLC每单元可以存储两位,包含四个电压符(00,01,10,11)。显然,MLC的存储容量⽐SLC⼤,但是SLC更简单可靠,SLC读取和写
⼊的速度都⽐MLC更快,⽽且SLC⽐MLC更耐⽤,MLC每单元可擦除1w次,⽽SLC可擦除10w次,所以,企业级的闪存产品⼀般都选⽤
SLC,这也是为什么企业级产品⽐家⽤产品贵很多的原因。
SSD的技术特点
SSD与传统磁盘相⽐,第⼀是没有机械装置,第⼆是由磁介质改为了电介质。在SSD内部有⼀个FTL(FlashTransalationLayer),它相当于
磁盘中的控制器,主要功能就是作地址映射,将flashmemory的物理地址映射为磁盘的LBA逻辑地址,并提供给OS作透明访问。
SSD没有传统磁盘的寻道时间和延迟时间,所以SSD可以提供⾮常⾼的随机读取能⼒,这是它的最⼤优势,SLC类型的SSD通常可以提供
超过35000的IOPS,传统15k的SAS磁盘,最多也只能达到160个IOPS,这对于传统磁盘来说⼏乎就是个天⽂数字。SSD连续读的能⼒相
⽐普通磁盘优势并不明显,因为连续读对于传统磁盘来说,并不需要寻道时间,15k的SAS磁盘,连续读的吞吐能⼒可以达到130MB,⽽
SLC类型的SSD可以达到170-200MB,我们看到在吞吐量⽅⾯,SSD虽然⽐传统磁盘⾼⼀些,但优势虽然并不明显。
SSD的写操作⽐较特殊,SSD的最⼩写⼊单元为4KB,称为页(page),当写⼊空⽩位置时可以按照4KB的单位写⼊,但是如果需要改写某个
单元时,则需要⼀个额外的擦除(era)动作,擦除的单位⼀般是128个page(512KB),每个擦除单元称为块(block)。如果向⼀个空
⽩的page写⼊信息时,可以直接写⼊⽽⽆需擦除,但是如果需要改写某个存储单元(page)的数据,必须⾸先将整个block读⼊缓存,然后
修改数据,并擦除整个block的数据,最后将整个block写⼊,很显然,SSD改写数据的代价很⾼,SSD的这个特性,我们称之为era-
before-write。
经过测试,SLCSSD的随即写性能可以达到3000个左右的IOPS,连续写的吞吐量可以达到170MB,这个数据还是⽐传统磁盘⾼出不少。但
是,随着SSD的不断写⼊,当越来越多的数据需要被改写时,写的性能就会逐步下降。经过我们的测试,SLC在这个⽅⾯要明显好于
MLC,在长时间写⼊后,MLC随机写IO下降得⾮常厉害,⽽SLC表现则⽐较稳定。为了解决这个问题,各个⼚商都有很多策略来防⽌写性
能下降的问题。
wearleveling
因为SSD存在“写磨损”的问题,当某个单元长时间被反复擦写时(⽐如Oracleredo),不仅会造成写⼊的性能问题,⽽且会⼤⼤缩短SSD的
使⽤寿命,所以必须设计⼀个均衡负载的算法来保证SSD的每个单元能够被均衡的使⽤,这就是wearleveling,称为损耗均衡算法。
Wearleveling也是SSD内部的FTL实现的,它通过数据迁移来达到均衡损耗的⽬的。Wearleveling依赖于SSD中的⼀部分保留空间,基本
原理是在SSD中设置了两个blockpool,⼀个是freeblockpool(空闲池),⼀个是数据池(datablockpool),当需要改写某个page时(如
果写⼊原有位置,必须先擦除整个block,然后才能写⼊数据),并不写⼊原有位置(不需要擦除的动作),⽽是从空闲池中取出新的
block,将现有的数据和需要改写的数据合并为新的block,⼀起写⼊新的空⽩block,原有的block被标识为invalid状态(等待被擦除回
收),新的block则进⼊数据池。后台任务会定时从datablock中取出⽆效数据的block,擦除后回收到空闲池中。这样做的好处在于,⼀是
不会反复擦写同⼀个block,⼆是写⼊的速度会⽐较快(省略了擦除的动作)。
Wearleveling分为两种:动态损耗均衡和静态损耗均衡,两者的原理⼀致,区别在于动态算法只会处理动态数据,⽐如数据改写时才会触发
数据迁移的动作,对静态数据不起作⽤,⽽静态算法可以均衡静态数据,当后台任务发现损耗很低的静态数据块时,将其迁移到其他数据库
块上,将这些块放⼊空闲池中使⽤。从均衡的效果来看,静态算法要好于动态算法,因为⼏乎所有的block都可以被均衡的使⽤,SSD的寿
命会⼤⼤延长,但是静态算法的缺点是当数据迁移时,可能会导致写性能下降。
写⼊放⼤
因为SSD的era-before-write的特性,所以就出现了⼀个写⼊放⼤的概念,⽐如你想改写4K的数据,必须⾸先将整个擦除块(512KB)中
的数据读出到缓存中,改写后,将整个块⼀起写⼊,这时你实际写⼊了512KB的数据,写⼊放⼤系数是128。写⼊放⼤最好的情况是1,就
是不存在放⼤的情况。
Wearleveling算法可以有效缓解写⼊放⼤的问题,但是不合理的算法依然会导致写⼊放⼤,⽐如⽤户需要写⼊4k数据时,发现freeblock
pool中没有空⽩的block,这时就必须在datablockpool中选择⼀个包含⽆效数据的block,先读⼊缓存中,改写后,将整个块⼀起写⼊,采
⽤wearleveling算法依然会存在写⼊放⼤的问题。
通过为SSD预留更多空间,可以显著缓解写⼊放⼤导致的性能问题。根据我们的测试结果,MLCSSD在长时间的随机写⼊后,性能下降很
明显(随机写IOPS甚⾄降低到300)。如果为wearleveling预留更多空间,就可以显著改善MLCSSD在长时间写操作之后的性能下降问
题,⽽且保留的空间越多,性能提升就越明显。相⽐较⽽⾔,SLCSSD的性能要稳定很多(IOPS在长时间随机写后,随机写可以稳定在
3000IOPS),我想应该是SLCSSD的容量通常⽐较⼩(32G和64G),⽽⽤于wearleveling的空间⼜⽐较⼤的原因。
数据库IO特点分析
IO有四种类型:连续读,随机读,随机写和连续写,连续读写的IOsize通常⽐较⼤(128KB-1MB),主要衡量吞吐量,⽽随机读写的IO
size⽐较⼩(⼩于8KB),主要衡量IOPS和响应时间。数据库中的全表扫描是连续读IO,索引访问则是典型的随机读IO,⽇志⽂件是连续写
IO,⽽数据⽂件则是随机写IO。
数据库系统基于传统磁盘访问特性来设计,最⼤特点是⽇志⽂件采⽤quentiallogging,数据库中的⽇志⽂件,要求必须在事务提交时写⼊
到磁盘,对响应时间的要求很⾼,所以设计为顺序写⼊的⽅式,可以有效降低磁盘寻道花费的时间,减少延迟时间。⽇志⽂件的顺序写⼊,
虽然是物理位置是连续的,但是并不同于传统的连续写类型,⽇志⽂件的IOsize很⼩(通常⼩于4K),每个IO之间是独⽴的(磁头必须抬起
来重新寻道,并等待磁盘转动到相应的位置),⽽且间隔很短,数据库通过logbuffer(缓存)和groupcommit的⽅式(批量提交)来达到提
⾼IOsize的⼤⼩,并减少IO的次数,从⽽得到更⼩的响应延迟,所以⽇志⽂件的顺序写⼊可以被认为是“连续位置的随机写⼊”,更关注
IOPS,⽽不是吞吐量。
数据⽂件采⽤inplaceuddate的⽅式,意思是数据⽂件的修改都是写⼊到原来的位置,数据⽂件不同于⽇志⽂件,并不会在事务commit时写
⼊数据⽂件,只有当数据库发现dirtybuffer过多或者需要做checkpoint动作时,才会刷新这些dirtybuffer到相应的位置,这是⼀个异步的过
程,通常情况下,数据⽂件的随机写⼊对IO的要求并不是特别⾼,只要满⾜checkpoint和dirtybuffer的要求就可以了。
SSD的IO特点分析
1.随机读能⼒⾮常好,连续读性能⼀般,但⽐普通SAS磁盘好。
2.不存在磁盘寻道的延迟时间,随机写和连续写的响应延迟差异不⼤。
-before-write特性,造成写⼊放⼤,影响写⼊的性能。
4.写磨损特性,采⽤wearleveling算法延长寿命,但同时会影响读的性能。
5.读和写的IO响应延迟不对等(读要⼤⼤好于写),⽽普通磁盘读和写的IO响应延迟差异很⼩。
6.连续写⽐随机写性能好,⽐如1M顺序写⽐128个8K的随即写要好很多,因为随即写会带来⼤量的擦除。
基于SSD的上述特性,如果将数据库全部放在SSD上,可能会有以下的问题:
1.⽇志⽂件quentiallogging会反复擦写同⼀位置,虽然有损耗均衡算法,但是长时间写⼊依然会导致性能下降。
2.数据⽂件inplaceupdate会产⽣⼤量的随机写⼊,era-before-write会产⽣写⼊放⼤。
3.数据库读写混合型应⽤,存在⼤量的随机写⼊,同时会影响读的性能,产⽣⼤量的IO延迟。
基于SSD的数据库优化法则:
基于SSD的优化就是解决era-before-write产⽣的写⼊放⼤的问题,不同类型的IO分离,减少写操作带来的性能影响。
1.将quentiallogging修改为In-pagelogging,避免对相同位置的反复擦写。
2.通过缓存写⼊的⽅式将⼤量的in-placeupdate随机写⼊合并为少量顺序写⼊。
3.利⽤SSD随机读写能⼒⾼的特点,减少写增加读,从⽽达到整体性能的提升。
In-pagelogging
In-pagelogging是基于SSD对数据库quentiallogging的⼀种优化⽅法,数据库中的quentiallogging对传统磁盘是⾮常有利的,可以⼤
⼤提⾼响应时间,但是对于SSD就是噩梦,因为需要对同⼀位置反复擦写,⽽wearleveling算法虽然可以平衡负载,但是依然会影响性能,
并产⽣⼤量的IO延迟。所以In-pagelogging将⽇志和数据合并,将⽇志顺序写⼊改为随机写⼊,基于SSD对随机写和连续写IO响应延迟差异
不⼤的特性,避免对同⼀位置反复擦写,提⾼整体性能。
In-pagelogging基本原理:在databuffer中,有⼀个in-memorylogctor的结构,类似于logbuffer,每个logctor是与datablock对应的。
在databuffer中,data和log并不合并,只是在datablock和logctor之间建⽴了对应关系,可以将某个datablock的log分离出来。但是,在
SSD底层的flashmemory中,数据和⽇志是存放在同⼀个block(擦除单元),每个block都包含datapage和logpage。
当⽇志信息需要写⼊的时候(logbuffer空间不⾜或者事务提交),⽇志信息会写⼊到flashmemory对应的block中,也就是说⽇志信息是分
布在很多不同的block中的,⽽每个block内的⽇志信息是appendwrite,所以不需要擦除的动作。当某个block中的logctor写满的时候,这
时会发⽣⼀个动作,将整个block中的信息读出,然后应⽤block中的logctor,就可以得到最新的数据,然后整个block写⼊,这时,block
中的logctor是空⽩的。
在in-pagelogging⽅法中,databuffer中的dirtyblock是不需要写⼊到flashmemory中的,就算dirtybuffer需要被交换出去,也不需要将它们
写⼊flashmemory中。当需要读取最新的数据,只要将block中的数据和⽇志信息合并,就可以得到最新的数据。
In-pagelogging⽅法,将⽇志和数据放在同⼀个擦除单元内,减少了对flash相同位置的反复擦写,⽽且不需要将dirtyblock写⼊到flash中,
⼤量减少了in-placeupdate的随机写⼊和擦除的动作。虽然在读取时,需要做⼀个merge的操作,但是因为数据和⽇志存放在⼀起,⽽且
SSD的随机读取能⼒很⾼,in-pagelogging可以提⾼整体的性能。
SSD作为写cache-appendwrite
SSD可以作为磁盘的写cache,因为SSD连续写⽐随机写性能好,⽐如:1M顺序写⽐128个8K的随机写要好很多,我们可以将⼤量随机写合
并成为少量顺序写,增加IO的⼤⼩,减少IO(擦除)的次数,提⾼写⼊性能。这个⽅法与很多NoSQL产品的appendwrite类似,即不改写数
据,只追加数据,需要时做合并处理。
基本原理:当dirtyblock需要写⼊到数据⽂件时,并不直接更新原来的数据⽂件,⽽是⾸先进⾏IO合并,将很多个8K的dirtyblock合并为⼀个
512KB的写⼊单元,并采⽤appendwrite的⽅式写⼊到⼀个cachefile中(保存在SSD上),避免了擦除的动作,提⾼了写⼊性能。cache
file中的数据采⽤循环的⽅式顺序写⼊,当cachefile空间不⾜够时,后台进程会将cachefile中的数据写⼊到真正的数据⽂件中(保存在磁盘
上),这时进⾏第⼆次IO合并,将cachefile内的数据进⾏合并,整合成为少量的顺序写⼊,对于磁盘来说,最终的IO是1M的顺序写⼊,顺
序写⼊只会影响吞吐量,⽽磁盘的吞吐量不会成为瓶颈,将IOPS的瓶颈转化为吞吐量的瓶颈,从⽽提升了整体系统能⼒。
读取数据时,必须⾸先读取cachefile,⽽cachefile中的数据是⽆序存放的,为了快速检索cachefile中的数据,⼀般会在内存中为cachefile
建⽴⼀个索引,读取数据时会先查询这个索引,如果命中查询cachefile,如果没有命中,再读取datafile(普通磁盘),所以,这种⽅法实
际不仅仅是写cache,同时也起到了读cache的作⽤。
但是这种⽅法并不适合⽇志⽂件的写cache,虽然⽇志⽂件也是appendwrite,但是因为⽇志⽂件的IOsize⽐较⼩,⽽且必须同步写⼊,⽆
法做合并处理,所以性能提升有限。
SSD作为读cache-flashcache
因为⼤部分数据库都是读多写少的类型,所以SSD作为数据库flashcache是优化⽅案中最简单的⼀种,它可以充分利⽤SSD读性能的优势,
⼜避免了SSD写⼊的性能问题。实现的⽅法有很多种,可以在读取数据时,将数据同时写⼊SSD,也可以在数据被刷出buffer时,写⼊到
SSD。读取数据时,⾸先在buffer中查询,然后在flashcache中查询,最后读取datafile。
SSD作为flashcache与memcache作为数据库外部cache的最⼤区别在于,SSD掉电后数据是不丢失的,这也引起了另外⼀个思考,当数据
库发⽣故障重启后,flashcache中的数据是有效还是⽆效?如果是有效的,那么就必须时刻保证flashcache中数据的⼀致性,如果是⽆效
的,那么flashcache同样⾯临⼀个预热的问题(这与memcache掉电后的问题⼀样)。⽬前,据我所知,基本上都认为是⽆效的,因为要保
持flashcache中数据的⼀致性,⾮常困难。
flashcache作为内存和磁盘之间的⼆级cache,除了性能的提升以外,从成本的⾓度看,SSD的价格介于memory和disk之间,作为两者之间
的⼀层cache,可以在性能和价格之间找到平衡。
总结
随着SSD价格不断降低,容量和性能不断提升,SSD取代磁盘只是个时间问题。
本文发布于:2023-03-10 05:04:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678395859200957.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:ssd什么意思.doc
本文 PDF 下载地址:ssd什么意思.pdf
留言与评论(共有 0 条评论) |