经历了近十几年的快速发展,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的轻量级的驱动只是一层薄薄的纱,让测试脚本可以触摸到测试盘的每一个棱角。
还要可靠
任何存储设备对可靠性的要求都非常高,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等特性的时候,都是通过上层脚本实现的,避免各种新特性的加入对下层驱动的稳定性造成影响。
二次开发
pynvme3不仅具有极高的性能和可靠性,而且还非常容易实现二次开发。在pynvme3设计之初,我们就确定将所有功能都通过python api作为唯一的接口开放给客户使用。测试工程师可以通过开发python脚本来实现他们的创新,并将脚本部署到自动化的测试流程中,实现项目的敏捷开发模式。这对快节奏和高要求的ssd研发项目来说是至关重要的。
pynvme3的api设计遵循nvme协议,通过面向对象的方式把不同的概念和功能封装到不同的类中实现。下图是pynvme3 api提供的各种类及其关联方式。
利用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产品!
雨洪水资源管理远程监控平台
RS - 232串行通信-Fundamentals of R
千兆以太网的IP核接口和万兆以太网IP核接口
电源的线路和负载瞬态测试
面部表情识别在社交媒体中的应用
利用PyNVMe3测试SSD盘的可靠性
格罗方德半导体今日发布了全新的12nm FD-SOI半导体工艺平台12FDXTM
深度剖析PNP与NPN型传感器
直线马达加持的AION V Plus实车登场
2018手机圈竞争升级 AI将是绝对焦点
华为mate10最新消息:华为mate10曝光,将狙击苹果十周年旗舰iPhone8
人工智能将来会不会威胁到人类的生存
Intel表示将把EMIB封装技术用于桌面处理器 22nm工艺都不会被淘汰
2018IOTE博览会即将开幕 劳拉科技将发布重磅消息
“5G+”正加紧布局 信息服务业进入发展快车道
一款有趣的EDA设计应用
音频解决方案AV5212
iPhone电容器供应商预计5G会在2020年增加需求
英飞凌与Wolfspeed延长SiC晶圆供应协议
解析单片机对应用系统的设计技巧