利用PyNVMe3测试SSD盘的可靠性

描述

经历了近十几年的快速发展,SSD已在众多领域取代了HDD。消费级SSD的规格趋于稳定,成本要求不断提高,技术和市场的格局已基本固定。所以,许多初创团队和大厂开始将研发重心放在了企业级SSD上。在这个大背景下,我们开发了一套NVMe SSD的测试软件PyNVMe3。通过最近三年多的推广,我们和众多OEM厂商、SSD厂商建立了良好的合作关系。很多厂商使用我们的产品和服务,并取得了良好的效果:以前抓不到的问题可以抓到了,以前不能测的特性可以测了。

快是王道

为什么PyNVMe3能找出更多的bug?原因在于,PyNVMe3对性能有极致的追求。对于企业级SSD来说,最基本的要求就是稳定。我们对性能的极致追求并不是为了性能测试的结果,而是要最大化对测试盘的压力,提供最紧凑的时序,这样才有可能在有限的开发周期内压出各种潜在的问题。

虽然所有企业级SSD都会使用fio进行性能和压力测试,但其也有一定的局限性。PyNVMe3可以带来比fio更大的测试压力。我们在同一台主机和同一块SSD盘上对fio和PyNVMe3的4K随机读性能进行了测试。fio的单核IOPS为445k,而PyNVMe3可达到831K。PyNVMe3只利用单核CPU就可以打到大部分SSD盘的性能瓶颈。

但有人会问:那我们在用fio测试的时候定义numjobs=4甚至更多的jobs,不就可以了吗?本质上,1个job和4个job是两个不同的测试用例。无论性能还是可靠性,4个job的测试都不能替代1个job的测试。PyNVMe3对性能的极致追求不是为了性能测试的成绩更好看,而是要在各种workload下对测试盘提供最大的压力和最紧凑的时序,用比真实业务场景更大的压力尽量把问题在研发阶段就打出来。

从设计上来看,PyNVMe3能实现比fio更高的性能,是因为PyNVMe3使用了我们基于SPDK自主研发的用户态NVMe驱动。如下图所示,fio的每一个IO都需要经过复杂的内核存储子系统软件堆栈。而PyNVMe3直接通过用户态驱动把IO命令写到和测试盘共享的命令队列,并使用轮询机制从回收队列获得IO的结果。这种方式避免了主机端的内核和中断开销,性能更快、延迟更小,并且性能和延迟的一致性也更好,更接近测试盘的本来面目。打个比方,传统测试工具在测试盘上面盖上了一层厚厚的棉袄,让我们看不清盘的真实面貌;而PyNVMe3的轻量级的驱动只是一层薄薄的纱,让测试脚本可以触摸到测试盘的每一个棱角。

python

还要可靠

任何存储设备对可靠性的要求都非常高,SSD也是如此。可靠性具体可以分成很多方面:性能要可靠、设备要可靠、数据要可靠。性能可靠:SSD盘要在任何workload下面都提供高并且稳定的性能。设备可靠:SSD盘即便在很大IO压力下,也要能正确处理一些异常事件和命令。数据可靠:SSD盘在各个生命周期的阶段都不能丢数据,真的发生数据丢失也一定要如实报告。

要测试SSD盘的可靠性,需要一个更可靠的测试工具。

PyNVMe3通过上文提到的高性能低延迟的用户态驱动,能给盘最大的压力,并且记录准确的性能跳动和延迟分布。

PyNVMe3可以在Python脚本中创建多个进程,利用多个CPU的资源对同一个测试盘下不同的测试命令。譬如在一个CPU大压力读写测试盘的同时,另一个CPU发指令对测试盘掉电或reset;也可以在一个CPU大压力读写测试的同时,另一个CPU对测试盘发Admin命令或做带外管理操作。

PyNVMe3实现了对测试脚本透明的数据校验机制:通过在DRAM中维护每一个LBA的CRC值,来检查每一笔读数据的正确性。借助x86和ARM提供的CRC专用指令,PyNVMe3可以在实现极高IO性能的同时,对每一笔读IO进行CRC校验。这种机制简化了数据一致性测试的实现,可以在大部分测试中都实现对数据一致性的检查。

PyNVMe3本身的设计也非常注重可靠性。如下图所示,我们在底层驱动中实现了高效的数据流,而将各种各样的NVMe SSD特性放到上层库和Python脚本中实现。通过这种分层设计,将复杂多变的特性和稳定可靠的数据流分开实现,上层的变化不会影响到下层驱动的稳定性。譬如,我们在扩展对ZNS、SRIOV、MI等特性的时候,都是通过上层脚本实现的,避免各种新特性的加入对下层驱动的稳定性造成影响。

python

二次开发

PyNVMe3不仅具有极高的性能和可靠性,而且还非常容易实现二次开发。在PyNVMe3设计之初,我们就确定将所有功能都通过Python API作为唯一的接口开放给客户使用。测试工程师可以通过开发Python脚本来实现他们的创新,并将脚本部署到自动化的测试流程中,实现项目的敏捷开发模式。这对快节奏和高要求的SSD研发项目来说是至关重要的。

PyNVMe3的API设计遵循NVMe协议,通过面向对象的方式把不同的概念和功能封装到不同的类中实现。下图是PyNVMe3 API提供的各种类及其关联方式。

python

利用PyNVMe3提供的API,用户可以快速实现以下各种特性的Python测试脚本:

各种类型的Admin命令

各种压力和类型的IO场景

自定义的NVMe初始化过程

双端口

SRIOV

多Namespace

各种LBA format

各种NVMe的特性,如:ZNS,SGL,Reservation,metadata,Arbitration等

注入各种错误和reset事件

掉电测试

Latency和QoS

数据一致性

MI/SMBus带外管理接口

受限于测试工具,以往很多特性不能充分测试。PyNVMe3不仅可以实现上述各种特性的测试,还可以将多种特性结合起来构造更复杂的测试场景。譬如我们发现,将大压力IO和Admin命令放到一起测试,有些盘处理Admin命令的延迟会长达数秒。PyNVMe3提供的这些API让用户可以通过二次开发实现更多的测试用例,让测试开发的效率更高、更富有成效。

我们的脚本开发指南提供了PyNVMe3二次开发的更多细节。

公共平台

PyNVMe3具有很高的性能和可靠性,可以便捷地二次开发各种特性的测试脚本,所以很多客户开始选择PyNVMe3作为内部研发阶段的测试平台,这些客户覆盖了消费级、企业级、数据中心、工业和车载等各类SSD产品和主控的研发。

PyNVMe3是一个软件定义的NVMe SSD测试平台,可以工作在笔记本、台式机、工作站以及服务器等各种通用计算机平台之上。PyNVMe3不捆绑特定硬件平台,降低用户大规模部署的成本和风险。PyNVMe3也可以适配各种专门的测试制具,用来实现电源控制、功耗测量、带外管理接口命令等测试。PyNVMe3是一个为广大SSD厂商定制开发的NVMe SSD测试平台,受到广大厂商的关注和信任。

当我们的客户发现他们的合作伙伴也在使用PyNVMe3的时候,PyNVMe3作为一个独立第三方的测试平台的优势就体现出来了:各个厂家可以各自开发PyNVMe3的测试脚本,并且和他们的合作伙伴共享这些测试脚本,来保证双方合作的顺畅。我们经常会遇到一些问题只能通过SSD厂商的内部平台来复现,但是出于各种技术、商业和IP的考虑,这些内部平台无法开放给合作伙伴使用。现在我们只需要在PyNVMe3上面开发脚本,这样合作各方都可以在PyNVMe3这个公共平台上面跑相同的测试脚本。相对于开放整个内部测试平台,共享一些Python测试文件的使用权限在公司之间更容易操作。PyNVMe3正在成为业界一个专业的可获得的SSD测试公共平台。

我们与众多SSD厂商和OEM厂商建立了合作关系,为客户提供我们的测试工具和服务。我们通过PyNVMe3的开放的理念、优越的性能和可靠性、强大的二次开发扩展能力,和业界合作伙伴一起做出更好更稳定的SSD产品!

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分