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