就如何将SSD运用得恰到好处,我的想法是以身为存储系统架构师的视角阐述一番这儿文中所提及的“存储系统”,它所指的是全闪阵列,或者是全闪分布式块,是这样的情况,没错吧 。
我做zStorage时曾遇问题,性能测试时间拉长,写入SSD的数据量增多,写性能便降低。那时我推测,大概率是SSD后台开启GC(垃圾收集),致使写性能下降。因无证据,所以只是推测。自去年起,我耗费诸多时间钻研SSD,如今我能确切讲,就是SSD的后台GC影响了写性能。
本文并非准备详细阐释“为何SSD要进行GC”,同样也不会讲述“SSD是怎样做GC的”,这些方面网上有之数量众多,不知悉的读者自行去百度抑或是Deepseek那边查找,在此郑重向大家推荐Deepseek喔。本文着重讲述的是那些以往我并不知晓却对存储系统实际运作产生影响效果的SSD所具备的特性因素哟 !
SSD有着写性能比读性能差的状况,出现随机写性能比顺序写性能差出许多的情况。当下运用PCIe Gen5 x4这种的NVMe SSD,主机接口的带宽能够达到15.7GB/s,顺序读能够达到14.5GB/s,需要去除一些命令开销 。下面是详情的表格:
由上表能够看出,4KB 随机写时,PCIe 带宽利用率仅仅只能跑到 15% 。非常明显,PCIe 接口并非是瓶颈,那么瓶颈究竟在什么地方呢?
实际上,NAND Flash是SSD写性能瓶颈所在区域。当下企业SSD里最常使用的TLC Nand Flash,通常有此要求,即一次性往同一个WL写入3个页,要是每个页为8KB,那3个页合起来就是24KB。写入这3个8KB的页大概需花费700us。这意味着,一个Flash芯片的写性能仅能达到24KB除以700us,也就是35MB每秒,若要实现10GB每秒的性能,一个SSD得配置大概300个Nand Flash芯片。看网上的SSD照片,似乎没有那么多Flash芯片?
在事实上,通常单个Flash芯片的内部会去封装好多独立的Die(也就是切割好的硅片),每一个Die的内部又存在多个Plane,多个Plane能够一同去执行写命令。这也就是说,在实际上并非是300个芯片,而是300个Plane。依照每个die容量1Tb来进行计算,15.36TB的SSD大概是需要配置140个die的,每个Die里面有2个Plane,其顺序写性能大概就是10GB/s。怎么会读性能那般高呢?因读一个Flash页仅需40us,那么,又为何随机写性能,其带宽利用率为14%,比顺序写性能,其带宽利用率为7某低那么多呢?
随机写时,性能低的主要缘由在于,GC致使的写放大(WAF)相当高。要是为顺序写,那么Nand Flash上的数据会被顺序覆盖,而且一个GC回收单元里的所有Flash数据会一同被覆盖,尽管存GC流程,然而一个GC回收单元里的所有页面都被覆盖,不存在有效数据页,进而无需拷贝数据,所以不存在写放大(WAF = nand_write_bytes / host_write_bytes = 1.0)。若是进行4KB随机写操作,一个GC回收单元内部存在诸多有效数据页,这些数据得被复制到Nand Flash的新位置,才能够删除GC回收单元,此复制过程会引发写放大。要是运用fio开展4kb随机写测试,有些型号的SSD在极限状况下写放大(WAF)能够达到4.5甚至5.0,即nand flash里写入5TB数据,仅有1TB是主机写入SSD盘的,另外写入的4TB数据是由GC复制流程所产生的。
比如说,在上表里头,SSD顺序写性能是10GB/s,4KB随机写性能为52万IOPS,如此一来,这个型号的SSD在4KB随机写处于极限情形的时候,写放大就是WAF = 10*1E9 / (52 * 1E4 * 4096) = 4.7。GC致使的写放大,不但会造成随机写性能低下,而且还会对SSD的寿命产生影响。这是由于致使Nand Flash芯片磨损的主要因素是擦写循环的次数,亦即往Nand Flash写入的数据量。
一种易于想到的办法为就存储系统而去降低写放大是否存在相关办法而言有的状态是,即:将针对SSD所作的随机写通通地改为顺序写,可以问下,对于这个想法,我的观点呈现为:没必要由于减小成SSD写放大而有如此行为的原因是。设若你的系统原本就是朝着追加写(Append - Only)而去实施其设计的状况时,那么针对SSD那实际上就是自然地转为属于了顺序写的程度了,举例地给出是:RocksDB或者ZFS这类属于追加写的系统,其对应的是不需要专门地去开展什么设计的结果的。若存储系统采用原地写即Update - In - place的设计,将其改成追加写,的确能够减少SSD内部的写放大现象,不过却无法减小整个系统端对端的写放大,也就是说写入Nand Flash的数据量并未呈现减少的状况。这是由于改成对SSD追加写之后,存储系统需要增添GC流程,这意味着把写放大从SSD内部转移到了存储系统软件之中。从更上层应用方面来看,整体的写放大并未出现减少的情况。
上面所采用的那种做法,还存在着另外的一个益处,那便是存储系统能够决定在何时开启GC流程。倘若你清楚在什么时候业务压力处于较低状态,那么就在业务压力低的那个时候开启GC流程,如此一来能够将GC对于性能所产生的负面作用降低至最小程度。SSD内部的GC流程,一直都趋向于尽量往后延迟启动,原因在于晚一些启动GC流程的话,就会有更多的数据页被覆盖,这样子需要进行复制的有效页就会少一些,写放大也就会小一些。依我个人的看法,这个好处并非足够之大,不值得为了这个而把存储系统改成追加写。

还有一个要点得留意,那就是:要是你打定主意改成追加写的那种模式,那就务必要做得周全些,追加写的数据块的长度得尽可能地大 。
通常来讲,当下企业SSD内部都在Flash芯片之间开展RAID操作,如此一来,一旦遭遇LDPC无法纠正的相关错误(比如die失效这种情况),便能够借助RAID去恢复数据。企业SSD的GC回收单元是Super Block,构成一个RAID群的所有die各自对应的Block共同形成一个Super Block,在这个Super Block里有一个Block是专门用以存放parity的,其余的Block则用于存放用户数据。Super Block一个会是被GC流程给整体回收擦除掉的。RAID致使GC回收单元尺寸是相当大的状态,就好比物理Flash芯片的Block大小为64MB,要是构成一个RAID的Super Block里存有300个Block,那么Super Block的大小是64MB乘以300等于19GB 。若存储系统改成追加写后,存储系统运用8MB的回收单元去做GC,对于有着19GB大小GC回收单元的SSD而言,此上层存储系统依旧是随机写,并非顺序写。当SSD进行GC时,一个19GB大小的回收单元里,会存在诸多8MB的空洞,同时也会有诸多8MB的有效数据。SSD的GC仍旧得做数据复制,不能发挥出降低SSD写放大的作用。
对于降低WAF而言,除了按顺序写能起到相应作用外,TRIM同样可以使其显著降低。当GC挑选出一个Super Block开展回收操作时,若该Super Block里存在诸多数据页,这种数据页实际上处于无效状态,然而既未被新数据所覆盖,又没有借助TRIM命令将其删除,那么GC流程就不得不把它当作有效数据页来进行复制。要是有TRIM命令将这个页面标记为无效,GC流程便无需对其进行复制,如此便减小了写放大。Linux的ext4文件系统,其有个mount命令,该命令存在一个参数,此参数为-o discard。当mount时添加了这个参数,那么就会给SSD下发TRIM命令。
除顺序写与TRIM 之外,增大OP空间页(Over Provisioning)可使WAF减小,因OP空间增大,GC流程启动可延迟,SSD能先处理更多写及TRIM命令,GC选中回收的super block中有效页面更少,需复制的页面更少,WAF更小。
存在一种可降低写放大的方式,这方式是FDP。存储系统会先去预测哪些数据呈现寿命短的状态,哪些数据展现寿命长的情形,并借助FDP来讲预测所获的数据寿命传导给SSD。SSD于写入数据之际,会把寿命相同的数据放置到一个Super Block里,如此一来,当某一个Super Block被选定进行回收之时,这个里面需要被复制的有效数据页就会特别少,进而WAF就会相对较小。
颇多企业级Solid State Drive内部的Flash Translation Layer粒度为4KB,即一个Flash Translation Layer表项指向一个4KB的与非闪存物理地址。要是存储系统下达的写操作之内有诸多小于4KB的写请求,像512字节的,那么Solid State Drive就得先将4KB数据读出,修改512字节,接着再把4KB写回去。这同样会对性能产生影响,与此同时还引发了另一种写放大。然而要是512字节的连续写,比如写预写式日志,这是不造成影响的。主机将写到企业SSD的512B数据,因其中附带内存备电电容,所以会先暂时放置于内存里,在此凑齐了4KB之后才去写入Flash。这就意味着,存储系统应当竭尽全力去规避不足4KB的随机写操作。此外,当前市面上存在一些超大容量(像30TB、60TB等等)的QLC SSD,其FTL粒度并非4KB,而有可能是16KB或者更大的,针对这类SSD就得避免不足16KB的随机写。
存在一些存储系统,在数据被写入SSD之后,会马上进行读出操作,以此来做一个校验,目的是确保数据被正确写入了。对于SSD而言,这样的做法是非常不好的。原因在于,如果立刻去读出Nand Flash刚写入的数据,在这个时候,Nand处于不稳定的状态,其误码率会比较高,这种情况可能会对性能产生影响,也有可能致使SSD内部读电压调整算法出现误动作。所以,存储系统应当尽量地去避免在写入数据之后立刻进行读操作。
固态硬盘会不会出现坏道呢?答案是肯定的,然而固态硬盘产生坏道的缘由与机械硬盘并不相同。当下的TLC/QLC Nand Flash介质存在着很高的误码率,而这些误码率之中有一些甚至能够达到10E-4,简单来讲就是当一串4KB的数据页面被写入Nand Flash之后,当其再度被读取出来的时候,几乎必然地会出现几个bits上的数据是错误的情况。这些出现错误的数据页面事实上就是要依靠着LDPC算法和RAID算法来进行恢复的,可是固态硬盘却并不能够确保数据一定能够被成功恢复。一旦碰到那种没办法恢复的情形,那就只好将这个LBA地址所对应的数据标记成坏道。不同于HDD的坏道之处在于,把这个坏道LBA地址重新写一遍,状态便恢复了,也就不再属于坏道了,。
我在搞zStorage之际,碰上某个问题为之烦恼:当读取SSD时碰到坏道,这是否就代表该SSD里存在诸多坏道?是否得对这个SSD开展一次全盘扫描?是否要将此SSD从系统中剔除?事实上,NVMe标准给出了一个命令LBA status,此命令能将这个SSD的全部坏道返还给主机,主机仅需针对这些坏道数据进行恢复且重写即可,无需对整个SSD做全盘扫描。因全盘扫描颇为耗费时间,且会对性能有所影响,SSD自身亦会于启动内部任务时在后台开展扫描,还会将无法恢复的数据块予以标记出来。当然,存储系统每隔一段时期实施一次全盘扫描,亦是具备必要性的,毕竟自身才是最为可靠的。倘若能够充分运用LBA status这个命令,那么这全盘扫描的时间间隔便能够长一些。
存在这样一点情况,工作温度对于SSD而言影响颇为巨大,当温度呈现升高态势之时,Nand Flash的误码率将会出现升高的状况,这种状况会对SSD的性能产生影响,原因在于恢复数据需要耗用更多的时间。除此之外,工作温度对于SSD的寿命同样存在负面的影响,高温会促使Flash Cell的隧穿氧化层加速老化。
我能想到的,就这么多了。
本文不代表任何组织。文章内容也许有错误,欢迎批评指正。

CopyrightC 2009-2025 All Rights Reserved 版权所有 芜湖人才网 本站内容仅供参考,不承担因使用信息、外部链接或服务中断导致的任何直接或间接责任,风险自担。如有侵权,请联系删除,联系邮箱:ysznh@foxmail.com 鄂ICP备2025097818号-15
地址: EMAIL:qlwl@foxmail.com
Powered by PHPYun.