当前位置: 首页 > news >正文

软件对存储性能的影响​

存储系统的核心是软件,在磁盘存储时代,存储系统软件设计的好坏似乎对性能的影响并不是很大,很多存储软件的设计并不会去考虑计算机的体系架构,也不用去关心操作系统调度、内存拷贝等因素带来的性能影响。对于磁盘存储,事情的确是这样的,原因在于磁盘的性能远远低于CPU处理和访存性能。磁盘存储的性能瓶颈点就在于磁盘本身,因此过多的体系结构级别、竞争资源同步的优化,不会对存储性能带来显著优化。

 

在很久以前做过这方面的实践,当时觉得临界区的资源竞争会对IO性能造成影响,因此,对我们做的一套存储虚拟化系统进行锁资源优化。将全局锁细粒度化,将写锁拆分成读写锁。但是,最终的优化效果微乎其微,原因就在于磁盘本身是性能的瓶颈点,CPU根本就不是问题。

 

但是,当存储介质从磁盘发展成NAND,甚至Xpoint之后,情况将发生根本性的变化。如今NVMe SSD已经在互联网应用中非常普及,很多互联网公司都将NVMe SSD作为基本的高性能存储介质,行业用户也开始使用NVMe SSDNVMe SSD具有非常高的性能,一个普通的2.5NVMe SSD,其读性能可以达到3GB/s、写性能超过1GB/sIOPS将近80万。这种盘的性能远远超过了磁盘,甚至SATA/SAS接口的SSD。盘的性能提升之后,存储软件的设计是否需要发生改变呢?

 

这种改变是肯定的,从存储本身的角度去考虑这种改变,比如NVMe SSD是一种半导体存储介质,不存在磁盘的随机访问问题,因此磁盘存储中所做的IO调度算法对SSD失效了,没有用了。SSD存储软件不需要考虑磁盘抖动的问题,这是一种变化;NVMe SSD具有很高的读性能,那么大量的读Cache可以去掉了,不需要大量的读缓存;SSD的故障模型和磁盘存在很大差别,那么在数据可靠性方面的处理不能采用传统RAID来做了,这又是一个非常重要的变化;NVMe SSD虽然具有极高的写性能,但是和顺序写性能相比,随机小写性能差很多,因此,是否要为SSD做特殊的随机小写优化,这是需要为SSD新考虑的一个问题。除了从存储技术本身的角度来考虑,另外需要从计算机体系结构的角度来重新审视一下新介质对存储性能的影响。

 

SSD具有极高性能之后,存储性能的瓶颈点从后端的磁盘慢慢转移到了CPU端、网络端。并且随着存储介质的进一步提升,软件层面的性能影响变成了主因。未来如果软件层面不做深层次的变革,应用将无法发挥高性能存储介质的性能。下图是Intel在今年IDF上的一张演讲图片。从这张图片中来看,未来Xpoint存储介质的90%性能影响是在软件端,硬件端的性能影响只占了10%。这也说明面向高性能存储介质的存储软件技术的将是行业发展的重点。

 

wKiom1cSWQyAUNKjAAC61c95MwM236.jpg


从计算机体系结构的角度来看,大量的中断处理会对存储性能造成影响。如果中断聚集在一个处理器上,那么该处理器将会成为存储性能的瓶颈点。大量中断也将会影响CPU的处理效率,在高速存储中,一个CPU每秒可以进行80万次IO处理,如果系统中存在多块这样的盘,那么中断的数量是相当可观的。因此,在存储设计中需要考虑海量中断的处理方法,具体方法可以借鉴网络,例如网络中的NAPI技术。在IO比较少的时候采用中断处理方式,这样可以保证IO延迟;在IO数量比较多的时候,可以采用查询机制,避免无效的中断处理。

 

如今,X86的体系结构通常都是多核NUMA架构。这种架构对于存储处理而言存在两个需要考虑的问题,一个是NUMA问题;另一个是多核竞争问题。NUMA问题实际上是一个很难解决的问题,IO和内存都需要保证在一个SOCKET域上才可以保证性能最佳,否则将会引入QPI上的数据传输,导致性能不稳定。多核竞争或者临界区的问题是一个非常棘手的高性能存储问题。以前存储设计过程中,一旦遇到竞争问题,会考虑到采用锁保护的方式,这种方式最为简单和明了。但是,传统存储软件中的锁会严重影响存储的性能。有一个数据可以和大家分享,在SCSI存储栈的request queue中,都会存在一个spin lock,该spin lock实现对request queue的临界资源保护。正因为这一把锁会将SCSI设备的IOPS性能限制在50万以内,并且无论增加多少CPU都无济于事,原因就在于CPU都在这把Spin lock上自旋,无法高效执行。所以,对于高性能存储介质,无锁设计将会变得极其关键和重要。提到无锁设计,一方面是存储软件架构的变动,另一方面就是无锁算法的设计。而无锁算法的设计与实现是极其复杂的,传统软件不需要考虑的一些因素,例如内存屏障,都需要仔细斟酌了。所以,高性能存储设计慢慢的变成了高性能计算问题了。在我们设计的FlashRAID中,具有数据保护的功能,在同样的NVMe SSD上构建具有数据保护功能的逻辑卷,和传统的MDRAID相比,性能有大幅度的提升(如下图所示)。FlashRAID性能提升的一个重要因素在于整个软件栈的设计考虑的计算机体系架构问题,很好的处理了资源竞争的问题,将高性能存储介质的性能得以充分发挥。


wKioL1cSWj2QZzeZAABN-3DD4SU623.jpg


在操作系统层面,也存在很多影响存储性能的问题,例如内存拷贝、下下文切换等问题。如果应用程序运行在用户态,存储软件栈运行在内核态,那么数据在用户态和内核之间频繁穿越,将会导致性能极具下降,并且会消耗宝贵的CPU资源。CPU频繁的在用户态与内核态之间搬运数据,切换寄存器上下文,真正用来处理IO的效率降低,从而导致存储性能降低。所以,Intel提出了SPDK的项目,呼吁大家用SPDK来开发存储软件,提升CPU效率,将CPU用在刀口上,避免无谓的数据搬运、频繁的低效调度。SPDK是在DPDK的基础上发展起来的软件包。SPDK的构成如下图所示,其核心的思想是将所有的软件运行在用户态,通过查询的方式获取IO事件,然后对IO进行处理。


wKiom1cSWT-Tcv4EAABfDHB5BsA199.jpg


SPDK本质上是解决了我前面提到的一些问题,例如中断、内存拷贝、上下文切换等。其有一个很重要的假设就是用户态会运行应用,通过SPDK将存储栈都搬到用户态之后,在整个过程中都不需要内核软件的参与,所以,这种设计也就是Bypass Kernel。其实Bypass Kernel不是目的,解决高性能存储中CPU、网络性能瓶颈的问题才是SPDK最为核心的价值。在我们FlashRAID的设计过程中考虑了CPU、网络性能瓶颈问题,实现的软件即可以内核中运行,也可以在用户态运行,并且实现了和SPDK的集成。通过实际测试发现,存储性能与运行环境无关。所以,重要的不是Bypass kernel,而是解决CPU性能瓶颈的问题。

 

在高性能存储介质慢慢普及之后,一个非常重要的问题将摆在用户的面前。如何用好高性能存储介质?尤其在一个系统中存在多块高性能盘时,如何高效使用这些盘?NVMe SSDXpoint盘进一步发展时,这个问题将会变得越来越严重,有理由相信,不久的将来将会出现更多的高性能存储软件产品及创业公司。


相关文章:

  • 剖析curator的分布式互斥锁原理
  • LVM Linear vs Striped Logical Volumes
  • Centos Linux kernel内核升级
  • ZenHub Epics创造了GitHub中敏捷Epics
  • Ubuntu 登录闪退
  • 图片格式转换之ImageMagick
  • Python基础(1)--Python编程习惯与特点
  • 不用图像文件的圆角解决--跳起按钮制作(html)
  • Problem M
  • php构造函数的继承方法
  • mysql连接不上Uncaught exception 'PDOException' with message 'could not find driver
  • 用slf4j+logback实现多功能日志解决方案
  • windows无法启动MySQL服务 错误1067
  • 第四章源代码的下载和编译
  • 百度前端学院 2016 春季班总结
  • ES6指北【2】—— 箭头函数
  • [译] React v16.8: 含有Hooks的版本
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript创建对象的四种方式
  • java小心机(3)| 浅析finalize()
  • JS基础之数据类型、对象、原型、原型链、继承
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • LeetCode18.四数之和 JavaScript
  • Node + FFmpeg 实现Canvas动画导出视频
  • Web Storage相关
  • webpack4 一点通
  • windows下mongoDB的环境配置
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 记一次删除Git记录中的大文件的过程
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 入门级的git使用指北
  • 软件开发学习的5大技巧,你知道吗?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 为视图添加丝滑的水波纹
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 追踪解析 FutureTask 源码
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #100天计划# 2013年9月29日
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三分钟)速览传统边缘检测算子
  • .NET DataGridView数据绑定说明
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net2005怎么读string形的xml,不是xml文件。
  • .net反编译工具
  • .NET企业级应用架构设计系列之应用服务器
  • /*在DataTable中更新、删除数据*/
  • @Mapper作用
  • [2016.7 test.5] T1
  • [51nod1610]路径计数
  • [Android]创建TabBar
  • [Android]使用Retrofit进行网络请求
  • [Apio2012]dispatching 左偏树
  • [AutoSar]工程中的cpuload陷阱(三)测试