zoukankan      html  css  js  c++  java
  • spdk(一)----为什么要使用spdk?

    为什么要使用spdk?

    主要原因就是:nvme已经快到一定程度了,很多东西,尤其是软件已经赶不上他了,此时软件反而成为了系统IO的瓶颈。
    假如将24块每秒传输几个G的硬盘放在一起,也就是说这时的问题也就是放大了24倍。
    对于一个8通道的内存而言,理论带宽就是200GB/s,实际应用中也就是能达到100~150GB/S。
    在24块nvme硬盘组成的磁盘阵列中,它的理论速度也能达到100GB/S
    而这些都是理论数据,在实际应用中都是不可能达到的。我们在实际的读写中,光是用来搬运来来往往的数据,就要占用到内存带宽的一半,这就太没有道理了。就算是Linux kernel,这么多的数据处理起来也会很有困难。
    一般来说读写数据的运作方式是这样的:OS kernel请求一组数据,硬盘回应“嗯,没问题”,但是NAND闪存挺慢的,所以需要一点时间,将数据载入到硬盘的缓存中,准备好了就会告诉OS kernel。假设现在已经准备好了,就会给CPU发送一个中断信号,“嘿,数据已经准备好了,没问题了,可以来取那组数据了”。但是在这里会遇到一个问题:如果这个中断信号在去到目标CPU核心的过程中,CPU核心正在忙着处理其他事情,或者暂时处于睡眠状态,或者被重新分配到其他任务上的话(这种情况在多核心CPU中是很常见的),如果有以上情况发生的话,那么这个中断信号永远到不了,那么CPU永远不会去取那组数据。这样的结果就导致整个系统的读取调用过程截然而止。也就是说当CPU在执行大量的计算任务时或者很繁忙的时候,那么读写任务可能受到严重的影响。
    也就是说,使用nvme磁盘的系统,在CPU高负载的情况下可能会出现问题。
    对此业界给出了一个解决方案,对于超高速设备(比如这里的nvme磁盘,基于RAM的缓存盘)以一种叫做“轮询”的模式运作。这是一种完全不同的模式。说人话就是:系统内核假定设备非常快,快到“不用问准备好了没,问就是准备好了”。(设备速度很快,马上就可以把数据准备好)。
    当然如果在比较慢的硬盘(比如机械硬盘)上这么搞会带来很大的性能损耗。因为系统会不停的问“嘿,准备好了吗?嘿,准备好了吗?”,这样一来,IO时延变高了,同时读写带宽也会受影响。但是对于nvme盘,特别是前面提到的超快速的存储设备,这么做是值得的。
    而spdk的存在就是提供一种以轮询的方式来访问硬盘的方式,在高速设备上用于取代中断的访问方式。

    但是如果是在小IO密集的场景下,是否还会有这么明显的提升空间呢?

    参考链接:
    https://software.intel.com/en-us/articles/accelerating-your-nvme-drives-with-spdk

  • 相关阅读:
    angularjs的$on、$emit、$broadcast
    angularjs中的路由介绍详解 ui-route(转)
    ionic入门教程-ionic路由详解(state、route、resolve)(转)
    Cocos Creator 加载使用protobuf第三方库,因为加载顺序报错
    Cocos Creator 计时器错误 cc.Scheduler: Illegal target which doesn't have uuid or instanceId.
    Cocos Creator 构造函数传参警告 Can not instantiate CCClass 'Test' with arguments.
    Cocos Creator 对象池NodePool
    Cocos Creator 坐标系 (convertToWorldSpaceAR、convertToNodeSpaceAR)
    Cocos Creator 常驻节点addPersistRootNode
    Cocos Creator 配合Tiled地图的使用
  • 原文地址:https://www.cnblogs.com/powerrailgun/p/12389660.html
Copyright © 2011-2022 走看看