为什么硬盘读写会消耗大量CPU?硬raid阵列是否会消耗CPU?

  2021-08-13   jiajufan     9   0  


硬盘读写会消耗大量CPU?什么硬盘,什么样的读写情景,什么CPU,大量有多大?CPU性能对读写性能影响很大有多大?题目加了NAS和RAID关键字,那么是硬RAID还是软RAID?哪个级别的RAID?如果是软RAID,是主板驱动的软RAID还是操作系统/文件系统的软RAID?


分几个情况简述一下吧:

普通机械硬盘读写:

早期的硬盘读写都是通过CPU指令执行,这种读写方式叫PIO,(Programmed input/output,可编程输入输出),大概流程是程序发起读取指令,CPU找到硬盘映射的地址D1,然后发出指令,说需要从地址D1读取若干字节写入目标地址D2;硬盘控制器根据这个指令从硬盘读取若干数据,并写入内存地址D2后,告知CPU指令执行完毕;然后CPU从内存D1读取若干字节数据——期间CPU一直在等待硬盘控制器的返回,并不能执行其它指令,除非有更高优先级的中断。很显然,这种读写模式非常占用CPU资源。在老式电脑上,PIO方式的硬盘读写往往会消耗30%甚至更多的CPU资源。


之后为了解决这个问题,硬盘读写使用了DMA模式。和PIO模式相比,只要硬盘控制器向CPU确认收到读写指令了,CPU就可以执行其它指令,直到硬盘控制器完成从硬盘读取数据到内存D2后发起中断,CPU再去处理D2里面的数据,这个过程对CPU资源的消耗很小——很显然,和PIO相比,这就是I/O方面的硬件加速:大部分的读写操作由硬盘控制器实现。当然,文件系统是软件层面的,假设我们要读取十个1MB大小的文件,不考虑目录结构的读取和文件碎片的情况下,会比读取一个10MB的文件消耗将近10倍的CPU资源——因为CPU需要发起10次读取指令。通常情况下,DMA方式读写数据消耗的CPU资源在3%以下甚至更低。


新一代的NVMe SSD,因为通常使用4x PCI-E通道,新一代的NVMe SSD是要求PCI-E 3.0(1x带宽8GT/s, 4x带宽32GT/s,除掉检验位是4*985MB/s=3940MB/s);而旧平台(Intel六代之前)只支持PCI-E 2.0(1x带宽5GT/s,4x带宽20GT/s,除掉校验位是4*500MB/s=2000MB/s),对于部分高端NVMe SSD来说已经形成带宽瓶颈了,自然会导致硬盘读写性能下降。另外,更高速的读写速度自然也会消耗更多的CPU性能——一秒钟时间就能向CPU提供3GB+的数据等待CPU进行处理,显然和机械硬盘一秒钟才能读取到200+MB数据消耗的CPU资源不同。


然后是软RAID的情况:

这个要分不同的RAID级别来说。最简单的是RAID 1,CPU需要把一份写入指令复制成两份同时写入两个硬盘,显然对CPU资源的消耗起码要多一倍的。


然后复杂一点的是RAID 0,CPU需要按照RAID设置的条带宽度,把一份数据截成若干段,D1、D4、D7写入磁盘1,D2、D5、D8写入磁盘2,D3、D6、D9写入磁盘3(假设这是一个三个硬盘组成的RAID 0)。根据不同的RAID驱动或者缓存设置,不算截短数据所需的计算量,可能需要3倍到9倍的CPU资源消耗。组成RAID 0的磁盘越多,消耗的CPU资源也越多。


再复杂一点的是RAID 5,CPU需要根据D1、D2、D3的内容做XOR算出一个P1, D4、D5、D6算出一个P2,D7、D8、D9算出一个P3,然后D1、D4、D7写入磁盘1,D2、D5、P3写入磁盘2,D3、P2,D8写入磁盘3,P1、D6、D9写入磁盘4。这个过程中,P1、P2、P3的计算会消耗大量的CPU资源,和RAID 0类似,组成RAID 5的硬盘越多,消耗的CPU资源也越多。


更复杂的是RAID 6,除了P1、P2、P3外,CPU还要用另外一种算法计算出来另外三个校验数据Q1、Q2、Q3,并且和D1-D9、P1-P3打散写入到不同的磁盘上,CPU资源进一步被消耗——这就是为什么软RAID 5还算常见,但软RAID 6很少见的原因。当然,现在四核甚至更多的核心的CPU也很常见,很多面向存储的操作系统/文件系统都开始支持RAID 6或者类似的RAID级别:ZFS的RAIDZ2,Linux的mdadm,Windows的双校验存储池。但很显然,和单个硬盘存储相比,读写同样的数据,会消耗数十倍甚至上百倍的CPU资源。如果CPU性能太差,例如使用了老式的CPU,或者使用低功耗平台(例如ATOM),并且往往在NAS中,CPU还要同时提供其他服务,这个时候读写性能是非常可能会受到CPU性能影响的。


最后,上面所提到的几个RAID级别,都可以通过购买硬件RAID卡实现硬件加速——所有提到的这些需要增加CPU负担的工作都由RAID卡上的主控芯片完成,对于CPU来说,整个RAID阵列和一个普通硬盘并没有任何区别——除了需要加载RAID卡驱动而不是加载硬盘控制器驱动,自然也不会消耗额外的CPU性能


作者:木头龙

链接:https://www.zhihu.com/question/31594580/answer/328981325
来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


客服微信:1227962999点击复制并跳转微信