上期说到,方老师推荐子虚去读法国作家托克维尔的《旧制度与大革命》。
子虚将全书阅读了三遍以后,顿悟了一个道理:大革命的爆发,其根本原因是因为生产关系无法适应生产力的攀升,从而不得不通过革命这种激烈的方式,来重构原本构建在传统硬件上的落后的基础软件。
由于NVMe盘的出现,单个SSD盘的IO性能可飙升至每秒500K。这意味着,如果CPU不能在2us内处理完一次SSD盘的IO,CPU将成为制约单SSD盘的系统IO的瓶颈。实际上,在分布式存储中,NVMe全闪存储节点一般具有12块NVMe SSD盘,磁盘的IO能力高达6M IOPS。假设节点上有72个vCPU可以并发处理IO,每个vCPU也需要在12us内处理完一个IO。——计算公式:1(s) / 6000000 (IOPS) * 72 (vCPU) = 0.000012 (s) = 12us。
子虚一开始觉得,12us对于工作在2GHz以上的Intel Cascade Lake处理器来说,意味着24000个以上的指令周期,也就是接近1万条CISC指令的数量级,难道完成一次IO有很大问题吗?
可是,当子虚考虑到Linux IO的工作方式时,明白了。
原来,计算机对NVME SSD盘的写入动作,最终需要对PCIe的寄存器做动作。由于Linux工作在x86的保护模式下,应用层无法读写PCIe的地址空间,需要通过syscall一类的系统调用,切换到内核态的驱动程序,才可以对PCIe的寄存器进行操作,从而向NVMe盘发起读写操作。显然,syscall指令会使得CPU跳转到其他的指令地址,而这段指令大概率并非在指令Cache中。这会引起Cacheline miss。在Intel x86体系结构中,指令Cacheline miss的代价,相当于一次DRAM的访问周期,这个时间大致为0.1us。CPU在切换到内核态后,向挂接在PCIe总线上的NVMe盘控制器寄存器写入读写指令,以及内存缓冲区所在的RAM地址,NVMe控制器会从SSD芯片读取数据后,通过DMA的方式,写入到内存缓冲区中。由于驱动程序提供的缓冲区为内核态才可以访问的地址,驱动程序还需要将这段内容复制到用户态可见的地址,这段数据才能够被应用层所用。对于写入的情况也类似,大家可以自行理解。以8K大小的IO为例,需要耗费2K个指令周期才能结束复制过程。这对于处理器指令的消耗才是最可怕的。
在传统的机械盘和SATA SSD盘中,由于性能的主要瓶颈不在于从内核态到用户台的切换和内存复制开销,工程师们没有意识到这个问题。但在SSD盘进化到NVMe时代的时候,生产力的发展与旧制度的冲突,终于引发了大革命。
这场大革命就是SPDK的出现。
SPDK是Storage Performance Development Kit的缩写。从字面意思理解,SPDK可以大大提升存储系统的性能。
长期关注方老师公众号的朋友可能还记得,方老师提到过DPDK——Intel为加速网络处理提供的开发套件。
DPDK有几大核心技术:
1、用户态驱动,避免进出内核以及数据包复制的开销;
2、CPU核心绑定,避免进程在不同CPU之间调度带来的上下文切换的开销;
3、大页机制,避免内存换页的开销;
4、轮询模式,避免Linux软中断开销;
类似地,SPDK也使用了这四大机制。
首先,SPDK中,NVMe SSD盘的驱动在用户态。初始化驱动时,系统会将NVMe控制器的PCIe寄存器地址空间映射到用户态可以访问的地址空间。同时,SPDK为NVMe提供的DMA缓冲区也是用户态可以访问的地址空间,这样避免了数据包在内核态与用户态之间的复制搬运;
SPDK设计时,使用了绑定vCPU (HT)的异步轮询机制。
如下图,SPDK在每个Core上启动一个Reactor作为数据平面,一方面与其他Core通过event交互,另一方面可以与用户自行编写的Poller通过轮询方式交互,由于Reactor是绑定HT的,避免了进程在不同HT之间调度的上下文切换以及cacheline miss的开销;
我们知道,在CPU的用户态,所有指令访问的内存的地址,与DRAM控制器向DRAM接口发出的物理地址之间,要通过MMU (Memory Management Unit)的翻译,其翻译是通过MMU查找TLB(Translation Lookaside Buffer)表项实现的。如果查找失败会发生TLB miss异常,CPU当前的处理将被打断,进行页的调度,造成极大的CPU开销 (100us以上)。为了避免这种情况,SPDK申请的大页(Huge Page)可达GB级别,避免了这部分性能开销;
最后,SPDK采取了无锁化的设计,避免了多个线程竞争自旋锁及排队等待锁带来的开销,进一步提升了处理的效率。
在下一期,我们将进一步详解SPDK在云存储中的应用。
本期段子:
子虚同学翻看DPDK和SPDK文档的时候,注意到一个概念:轮询。由于子虚本来是学汉语言文学专业的,计算机基础不够扎实,经常向方老师请教基本技术常识,为了表达感谢,请方老师吃回转寿司。
方老师告诉子虚:你看,吃回转寿司实际上就是轮询过程,你需要实时监控面前的传送带,发现了想吃的就端到面前来……
子虚立即联想到了清华才女JFZ写的日本游记中,演员们以75度角在转盘上展示的场景,并告诉方老师。
欲知方老师听完有什么样的反应,请看下回分解……