分布式技术的发展,深入地改变了咱们编程的模式和思考软件的模式。值 2019 岁末,PingCAP 联合 InfoQ 共同策划出品“分布式系统前沿技术 ”专题, 邀请众多技术团队共同参与,一块儿探索这个古老领域的新生机。本文出自我司 CTO 黄东旭,为「分布式系统 in 2010s」 系列第三篇。
上篇咱们聊了软件构建方式和演化,今天咱们来聊聊硬件吧!node
若是说云的出现是一种商业模式的变化的话,驱动这个商业革命的推手就是最近十年硬件的快速更新。比起 CPU,存储和网络设备的进化速度更加迅速。最近五年,SSD 的价格 (包括 PCIe 接口) 的成本持续降低,批量采购的话已经几乎达到和 HDD 接近的价格。数据库
<center>近 5 年 SSD 成本曲线</center>编程
SSD 的普及,对于存储软件厂商的影响是深远的。网络
其一,是极大地缓解了 IO 瓶颈。对于数据库厂商来讲,能够将更多的精力花在其余事情,而不是优化存储引擎上。最近两年发生了一些更大的变化,NVMe 正在成为主流,咱们很早就在 Intel Optane 进行实验和投资,相似这样的非易失内存的技术,正在模糊内存和存储的界限,可是同时对开发者带来挑战也是存在的。举一个简单的例子,对于 Optane 这类的非易失内存,若是你但愿可以彻底利用它的性能优点,最好使用相似 PMDK 这类基于 Page cache Bypass 的 SDK 针对你的程序进行开发,这类 SDK 的核心思想是将 NVM 设备真正地当作内存使用。若是仅仅将 Optane 挂载成本地磁盘使用,其实很大程度上的瓶颈不必定出如今硬件自己的 IO 上。数据结构
下面这张图颇有意思,来自 Intel 对于 Optane 的测试,咱们能够看见在中间那一列,Storage with Optane SSD,随机读取的硬件延迟已经接近操做系统和文件系统带来的延迟,甚至 Linux VFS 自己会变成 CPU 瓶颈。其实背后的缘由也很简单,过去因为 VFS 自己在 CPU 上的开销(好比锁)相比过去的 IO 来讲过小了,可是如今这些新硬件自己的 IO 延迟已经低到让文件系统自己开销的比例不容忽视了。多线程
<center>Intel 对于 Optane 的测试</center>架构
其二,这个变化影响了操做系统和文件系统自己。例如针对 Persistent Memory 设计新的文件系统,其中来自 UCSD 的 NVSL 实验室 (名字很厉害, Non-Volatile Systems Laboratory) 的 NovaFS 就是一个很好的例子。简单来讲是大量使用了无锁数据结构,减低 CPU 开销,NovaFS 的代码量很小很好读,有兴趣能够看看。另外 Intel 对 Persistent Memory 编程模型有很好的一篇文章,感兴趣的话能够从这里开始了解这些新变化。socket
说完了存储设备,咱们聊聊网络设备。我还记得我第一份工做的数据中内心甚至还有百兆的网卡,但如今,1GbE 已经都快淘汰光了,主流的数据中心基本上开始提供 10GbE 甚至 25GbE 的网络。为何会变成这样?咱们作一个简单的算术题就知道了。根据 Cisco 的文档介绍, 一块千兆网卡的吞吐大概是: [1,000,000,000 b/s / (84 B * 8 b/B)] == 1,488,096 f/s (maximum rate)。分布式
那么万兆网卡的吞吐大概是它的十倍,也就是差很少每秒 1488 万帧,处理一个包的时间在百纳秒的级别,基本至关于一个 L2 Cache Miss 的时间。因此如何减少内核协议栈处理带来的内核-用户态频繁内存拷贝的开销,成为一个很重要的课题,这就是为何如今不少高性能网络程序开始基于 DPDK 进行开发。性能
对于不了解 DPDK 的朋友,在这里简单科普一下:
<center>DPDK Flow Bifurcation</center>
从上图能够看到,数据包直接从网卡到了 DPDK,绕过了操做系统的内核驱动、协议栈和 Socket Library。DPDK 内部维护了一个叫作 UIO Framework 的用户态驱动 (PMD),经过 ring queue 等技术实现内核到用户态的 zero-copy 数据交换,避免了 Syscall 和内核切换带来的 cache miss,并且在多核架构上经过多线程和绑核,极大提高了报文处理效率。若是你肯定你的网络程序瓶颈在包处理效率上,不妨关注一下 DPDK。
另外 RDMA 对将来体系结构的影响也会很大,它会让一个分布式集群向一个超级 NUMA 的架构演进(它的通讯延时/带宽已经跟如今 NUMA 架构中链接不一样 socket node 的 QPI 的延时/带宽在一个量级),可是目前受限于成本和开发模型的变化,可能还须要等很长一段时间才能普及。
其实不论是 DPDK,SPDK,PMDK ,背后的主线都是 Bypass kernel,Linux 内核自己带来的开销已经很难适应现代硬件的发展,可是生态和兼容性依然是大的挑战,我对于一言不合就搞个 Bypass Kernel SDK 的作法实际上是不太赞同的。大量的基础软件须要适配,甚至整个开发模型都要变化。
我认为有关内核的问题,内核社区从长期来看必定会解决。一个值得关注的技术是 Linux 5.1 内核中引入的 io_uring 系列的新系统调用,io_uring 的原理简单来讲就是经过两个内核/用户态共享的 ring buffer 来实现 IO 事件的提交以及收割,避免了 syscall 及内核<->用户态的内存拷贝,同时提供了 poll 的模式, 不用等待硬件中断,而是不断轮询硬件,这极大下降了 IO 延迟,提高了总体吞吐。 我认为 io_uring 的出现也表明了内核社区在各类 Bypass Kernel 技术涌现的当下,正在奋起直追。
本文是「分布式系统前沿技术」专题文章,目前该专题在持续更新中,欢迎你们保持关注。