1
(1.广东邮电职业技术学院 计算机学院,广州 510630; 2.中国电信股份有限公司研究院,广州 510630)
固态硬盘(solid state drive,SSD)的出现,使单硬盘的性能相对机械硬盘提高了几个数量级,从而被广泛用于服务器、磁盘阵列等IT设备中。SSD硬盘主要由NAND闪存颗粒、NAND闪存控制器、接口芯片及接口等组成,这些零部件及相关的软件协议将影响到SSD盘的性能。
机械硬盘读写性能在生命周期内表现稳定,基本上保持一致。然而,固态硬盘在进行垃圾回收时,其写性能与垃圾回收机制产生冲突,用户读写请求的响应时间大大增加,从而出现性能抖动[1]。这种抖动对磁盘阵列的影响不能忽视,尤其是对于安装有多块硬盘的固态盘阵列。Kim等发现,在固态阵列中每块固态盘各自进行垃圾回收,将会放大垃圾回收导致的性能抖动,从而对固态阵列性能产生较大的影响[2]。此外,一些基于主机的固态硬盘在主机系统资源紧张时,也可能引起固态硬盘算法与主机上的业务系统的资源争用,从而产生性能稳定性问题。
而在企业级应用中,固态硬盘常用于读写操作频繁,性能要求高的系统中,如交易型性系统。交易型系统遇到高并发,大流量的访问请求时,固态硬盘的IO读写也随时增大,可能频繁引发垃圾回收机制,从而引发性能抖动,可能引起交易数据延迟甚至出错。因此,研究固态硬盘的性能稳定性对于IT系统具有重要的意义。
目前,闪存存储颗粒的基本技术包括NAND和NOR,其中,SSD主要采用NAND技术。单位体积闪存颗粒数量越多,相同体积的SSD盘容量越大。2D NAND 闪存采用平面型制造工艺制造,其容量的提高需要不断缩小半导体制程的线度,这就严重依赖于光刻技术的进步。在光刻技术进入20 nm后,NAND闪存颗粒的制造成本将大幅度提高,而可靠性和良品率却不断降低。目前,商用光刻工艺已经达到5 nm,但受限于半导体物理极限,再想提高的难度非常大,2D NAND的容量已难以增长。
3D NAND通过垂直方向上堆叠栅极,改变了2D NAND的平面扩展模式,突破了光刻精度的限度。在相同面积上可以堆积更多的存储单元,从而大幅度提高存储密度。3D NAND的主要工艺流程包括交替沉积薄膜形成堆叠层、蚀刻高深宽比通道、填充字线钨金属以及蚀刻阶梯形成独立的接触面[3]。目前,企业级SSD主要采用96层3D NAND工艺。2019年,美光宣布完成128层3D NAND芯片首次流片,海力士宣布量产128层NAND SSD并将在2020年普及[4]。我国长江存储也于2019年宣布已经量产64层 ED NAND闪存[5],并将于2020年开始研发128层堆叠技术。采用3D NAND技术进一步提高层叠层数时,还将面临着叠加层数的增加会引入更多的缺陷、高深宽比通道刻蚀缺陷容易导致短路和字符串干扰以及工艺复杂等问题[6]。
2015年,美光与Intel联合推出3D Xpoint技术。与通过绝缘浮置栅极来捕获不同数的电子的3D NAND不同,3D Xpoint使用阻变类的新型存储材料与双阈值选通器件耦合形成新存储单元结构。基于3D Xpoint的存储器其读写速度略低于内存,但远高于NAND,随机写入速率是NAND的1 000倍。同时,3D Xpoint也能通过堆叠增加容量,密度可以达到内存的8~10倍[7]。限于偏高的成本,3D Xpoint SSD主要用于内存的拓展,或NAND SSD硬盘的缓冲。
在机械硬盘中,操作系统读写数据的单位根据扇区的尺寸单元(512字节)设置的。而在固态硬盘中,闪存的读写单位是4KB或8KB的页,而且闪存以块为单位进行擦除,在未完成擦除之前无法写入。这就导致操作系统的文件系统无法直接管理固态硬盘。为了解决这个问题,固态硬盘通过闪存转换层(flash translation layer,FTL)把对闪存写的读写操作虚拟成为磁盘的独立扇区,从而实现了逻辑地址到物理地址的转换。FTL主要功能包括内存管理、垃圾回收、磨损平衡,对闪存的性能、使用寿命具有重要影响。除了上述的地址映射功能,FTL的主要功能还包括垃圾回收和磨损均衡。
在固态硬盘中,数据不能直接覆盖写入闪存空间,而是需要在写前擦除无效数据。在SSD第一次使用时,由于盘内都还是已擦除状态,数据可以直接写入。在SSD的存储空间已经写满数据时,那就需要通过FTL将新的数据写到空闲的闪存空间中,再把逻辑地址指向新的物理地址。垃圾回收机制(garbage collection, GC)的具体过程包括:找到将要擦除的块,将要擦除的块内的有效页中的数据转移到空闲的块中,再擦除要擦除的块[8]。垃圾回收机制的触发时间和条件主要取决于所使用的算法,目前主要有定期触发、阈值触发、空闲时触发等方式。
闪存中存储单元的寿命主要取决于该存储单元的写操作次数,在达到寿命的写操作次数后,该单元失效形成坏块。磨损平衡是为了使写操作均匀分布在固态硬盘内不同的存储单元中,从而避免某些局部的写入过于频繁而形成坏点。
垃圾回收算法和磨损均衡算法的协作,有利于提高SSD性能,延长SSD的寿命。然而,垃圾回收算法启动时,如果处理不慎,容易引起性能抖动。
企业级SSD的主要接口类型和协议类型如表1所示。
表1 SSD接口与协议算法
SATA/SAS SSD的逻辑协议就为HDD设计的高级主机控制器接口(advanced host controller interface,AHCI),通过HBA控制器与CPU连接。在固态硬盘的单元存储速度已经大幅度提高的情况下, SATA/SAS接口已经成为进一步提高速率的瓶颈。
PCIe(peripheral component interconnect express) SSD直接与CPU通信,路径更短,没有协议转换开销,因此具有比SAS更低的延时。PCIe SSD又分基于设备端(Device Based)和基于主机端(Host Based)两种。Device Based的PCIe SSD由主控芯片实现FTL算法,而Host Base的PCIe SSD由主机端安装的数据管理软件实现FTL处理,接入完成闪存的读写接口,固态硬盘的主控芯片只需要实现ECC(error correcting code,错误检查和纠正)纠错、命令响应和闪存通道控制[9]。因此,Host Base的PCIe SSD占用的主机资源更多,在主机端资源占用率较高时候,可能面临着业务系统和数据管理软件资源竞争,从而有可能造成性能的抖动的问题。此外,传统的PCIe SSD卡还存在着各厂商需要设计对应的驱动程序,难以形成统一的生态圈的问题。
NVMe标准(NVM Express,全名非易失性存储主机控制器接口规范,即Non-Volatile Memory Host Controller Interface Specification)为基于闪存的存储设备设计的,具备低时延和低系统开销的全新规范。通过NVMe协议,符合标准的盘都可以采用相同的驱动程序。NVMe SSD是Device Based PCIe SSD的延伸,性能理论上可以获得和PCIe一样的性能。NVMe的物理接口类型主要是PCIe和U.2。目前,NVMe已经得到了业界的认可,不仅得到了众多硬件厂商的认可,还获得了Redhat、Oracle、微软等软件厂商的支持,已经全面进入商用。
主要指标包括:
1)IOPS(input/output operations per second,每秒输入输出操作数)。IOPS是硬盘性能的重要指标,常用于衡量小数据块的随机写性能。在业务系统中,如数据库等应用,体现在存储端的压力通常是随机读和随机写。
2)延时/QoS(quality of service,服务质量)。延时是接收到服务请求到返回一个指令所消耗的时间,访问延迟增大时,业务系统也会有相应的延迟。QoS可以分析一段时间内的延时表现,可以用一定的数据读写下延迟不大于指定时间的方式来表示[10]。
3)性能稳定性。性能稳定性,又称为性能一致性(performance consistancy),是固态硬盘质量的重要性能指标。在固态硬盘中,垃圾回收机制启动时,垃圾回收操作会与外部读写请求发生访问冲突。因此,需要在垃圾回收完成后才能完成外部读写请求的响应,这就引起了硬盘性能的抖动[1],体现在IOPS值的波动以及延时的增加上。由于固态硬盘经常用于承载核心数据库或其他IO访问量大的应用。例如,性能抖动可能导致交易型存储系统中的交易数据延迟,甚至发生错误[11]。
目前,衡量性能稳定性主要靠人工查看IOPS的性能分布曲线,从定性角度来评价IOPS值的离散度。而在定量评价指标上,各值的定义也不大一致。Intel定义性能稳定性的衡量标准为剔除最低的0.01%的性能最小值以后,取余下数据中性能最小点与平均性能的百分比作为稳定性指标。如,最低IOPS的点为10 000,而平均IOPS为11 000,则性能稳定性指标为10 000/11 000=90.9%。然而这一定义仅能剔除个别性能值较低的数据,且只考虑性能较低值的波动,而并未考虑性能高值的波动。还有一种标准是统计一定IOPS以下的点的数量占总数量的占比,这种方式只考虑数量,并未考虑到每个点和点之间的波动幅度的影响。
鉴于现有性能稳定性指标的缺陷,本文提出能够表征概率分布离散程度的归一化量度的变异系数(CV,coefficientof variation)作为性能稳定性的衡量指标。在比较SSD性能的离散程度时,SSD的性能相差较大,直接使用标准差来进行比较SSD的话,可能出现一些性能较差的SSD标准差偏小的问题。使用变异系数可以消除数值大小的影响,客观反映性能的抖动程度。SSD的变异系数计算公式为:
变异系数=标准偏差/平均值
变异系数越大,表示性能数据的离散程度越大,也就反映出其性能的稳定性越差。
Host Based的PCIe SSD的FTL算法需要加载数据到主机内存资源中进行运算,因而其性能与CPU和内存状况有关。在内存资源紧张的情况下,有可能出现主机业务系统与FTL的资源竞争,从而产生性能波动。
FIO可以根据用户参数设定,产生特定类型IO操作的工具,可以用来模拟I/O负载匹配的作业文件,从而测试磁盘在不同I/O负载下的性能。
Nmon可以采集CPU利用率、内存使用量、磁盘IO等信息。
Memtester用于在主机产生指定强度的压力,消耗内存资源。
测试固态硬盘为MLC PCIe SSD卡,包括有A和B两个样本,分别插到测试主机的PCIe SSD插槽中。测试主机CPU为Intel XEON E7-8870v3系列18核2.1 GHz主频;内存为128 GB,操作系统为RedHat 6.5(X64)。
1)数据模型:在承载核心数据库的应用时,数据块大小主要为4 K。此外,通常情况下,大部分数据库的读写主要是70%的随机读和30%的随机写。为了贴近生产环境,设置数据模型为数据块大小为4 K,读写比例为70%的随机读和30%的随机写。
2)QoS:QoS条件的设定要考虑PCIe SSD本身的读写延时情况和应用对PCIe SSD的延时需求。
如果在PCIe SSD上部署数据库等应用,在实际使用中,大并发混合读写压力(比如70%的随机读和30%的随机写)下低写延时对数据库整体性能至关重要。
综上所述,本文将QoS设定为70%随机读30%随机写的4 K,读延时不超过1 000 μs,写延时不超过200 μs。
性能可靠性测试过程主要包括清空SSD、预热、启动性能可靠性测试。具体测试过程如下:
1)清空SSD:将SSD完整擦除一遍,即可清空SSD盘,从而使全新盘的状态,并静置10 min,保证所有测试的可重复性,也即是从硬盘尚未写入数据开始,降低因为SSD 上已有数据随机度不一致引起的测试误差。
2)预热:使用FIO对SSD全盘顺序写满两遍,然后4K随机写3小时进行预热;
开启读写测试,全盘顺序填充数据两次。执行两遍全盘随机写,将数据全部打乱,保证后面的所有随机读写测试都是全盘随机。
预处理过程1:顺序写两遍
fio --filename=/dev/nvmexx --ioengine=libaio --direct=1 --thread --norandommap --name=init_seq --output=init_seq_1.6T.log --rw=write --bs=128k --numjobs=1 --iodepth=64 --loops=2
预处理过程2: 4K随机写3小时
fio --filename=/dev/nvmexx --ioengine=libaio --direct=1 --thread --name=init_rand --output=init_rand_1.6T.log --rw=randwrite --bs=4k --numjobs=8 --iodepth=32 --ramp_time=60 --runtime=10800 --time_based
3)性能稳定性测试:使用FIO,以70:30的随机读/随机写比例的4K数据块,对SSD盘进行压力测试,持续12小时。代码如下:
用nmon记录12个小时数据
nmon -s 20 -c 2161 -f &
4 K混合随机读写12个小时,前面fio ramp_time 300秒的数据点不统计在内
fio --filename=/dev/nvmexx --ramp_time=300 --runtime=43200s --time_based --ioengine=libaio --direct=1 --thread --norandommap --name=randrw_4K --rw=randrw --rwmixread=70 --bs=4k --numjobs=8 --iodepth=30 --log_avg_msec=2000 --write_iops_log=iops_4K_Steady_1.6 --output=randrw_4K_Sum_Steady_1.6.log --group_reporting
4)数据读取:通过nmon analysis解析生成的nmon文件,在解析得到的excel中DISKXFER页找到对应的测试对象,不统计前面FIO_ramp_time 大于或等于300 s的数据点,取23个小时数据计算IOPS平均值和变异系数升(标准偏差/平均值)。
5)从FIO输出文件中获取读写clat平均延时,要求在限定延时范围内。
内存加压条件下的性能可靠性的测试过程与性能稳定性测试的区别在于,在性能稳定性测试步骤中,使用Memtester对内存持续加压。加压时间以4小时为一个周期,每周期内Memtester分别占用主机0、50%、70%到90%的内存的情况下,对PCIe SSD的性能稳定性进行测试。通过内存加压条件下的性能稳定性测试,可以测试出影响SSD性能的内存使用率,以及SSD的性能稳定性随内存的变化量。Memtester代码示例如下:
nohup memtester 64G > memtest_50_1.6.log &
该代码表示,memtester消耗的内存大小为64 G,即占用50%的内存。
使用上述性能稳定性测试方案,对1.6 T容量的PCIe SSD进行测试,并整理测试结果如下:
从时延来看,A产品的读时延为514 μs,写时延91 s,B产品的读时延为899 μs,写时延为20 μs,均满足QoS要求。
如图1所示, A产品进入稳态的时间较晚,在2小时03分时进入稳态,在2小时03分到3小时43分间产品的曲线比较平滑,整体离散度较小。在3小时43分后,A产品的IOPS曲线产生了持续抖动,整条曲线有毛刺感,从定性分析即可得出,该产品的性能稳定性较差。B产品在测试开始1小时31分钟后进入稳态,随后IOPS的性能曲线比较平滑直到测试结束。
图1 性能可靠性测试
根据变异系数计算公式,选取进入稳态后到结束测试这段时间内的IOPS性能值,计算A产品和B产品的离散度得到,A的变异系数为8.46%,而B的变异系数为0.75%,A的变异系数比B高一个数量级。至此,本方案可以定量地评价固态硬盘的离散程度,其数值可以用于IT系统的存储规划、
从上述测试结果分析可以看出,本文所提出的测试方案,可以定量地评测出SSD的性能稳定性。用户可以根据业务系统需求,在使用成本、SSD性能稳定性和业务系统需求的之间综合考虑,选取适合的SSD。
图2是B产品在不同内存压力下的性能测试结果。在启动测试后的第一个4小时周期内,压力测试工具设置加压为0,在进入稳态后, B产品的变异系数值(CV1)为0.72%。第二个4小时周期内,压力测试工具在主机上产生50%的内存压力,此时B产品的变异系数值(CV2)增加到0.93%。在第三、第四个小时周期内,压力测试工具分别产生70%、90%的内存压力,B产品对应的变异系数值(CV3、CV4)分别为1.03%、1.02%。由此可见,B产品在内存资源消耗加剧时, SSD的变异系数略有增加,但变化不大,具有良好的性能稳定性。
图2 内存压力测试的性能可靠性
本文介绍了企业级固态硬盘在生产工艺、闪存转换层及接口和协议方面的最新进展。针对目前业界定量衡量性能稳定性指标缺失的现状,提出以变异系数作为衡量指标,并指内存资源竞争可能引起性能波动。本文以FIO、Nmon和Memtester等为测试工具,设置数据模型和QoS,并设计了性能稳定性测试方案。实验证明,本方案能够定量地评
价固态硬盘的性能稳定性。本文所提出的固态硬盘测试方案,贴近生产环境,有利于从规划设计环节开始对IT系统进行稳定性评估,保障核心业务系统的部署运营。