我们用一期的篇幅给这个专题做一个小结:
Intel为了让自己主导的x86架构处理器,能够从桌面领域进入到利润更高的服务器领域,在1998年推出了“至强”Xeon处理器,并迅速提升了Xeon处理器的内核数到4核以上。虚拟化作为充分利用服务器计算能力的手段,也需要在x86架构上顺畅高效运行。
但由于早期的Intel x86微架构没有实现在硬件层面的虚拟化支持,系统只能在Ring 1上执行虚拟机的操作系统内核,并通过软件模拟等方式执行操作系统内核调用的特权指令和敏感指令,使得执行效率极为低下。同时,也没有高效率的办法解决虚拟机指令调用的内存地址与宿主机上操作系统看到的逻辑内存地址之间的转换。对于网络和存储等常用于数据平面的IO设备的虚拟化,早期的Intel x86微架构也缺乏这方面的解决方案。
Intel为了解决这些问题,引入了VT-X技术,它在4个特权级(Ring3~Ring0)的基础上,又增加了虚拟化执行状态标志,以及虚拟CPU ID相关寄存器和指令。这样,虚拟机的操作系统就可以不做任何修改而在Ring 0中执行了。
对于虚拟机内存地址到实际物理地址的映射,Intel在VT-X中引入了EPT(Extended Page Table)机制,增加了一次映射,使得虚拟机内的内存访问实际上是从GLA(Guest Linear Address)到GPA(Guest Physical Address)再到HPA(Host Physical Address)的一个映射过程,CPU内部的硬件MMU处理这个过程,对性能没有任何额外的开销。
有的时候,我们需要将物理硬件直接分配给某个虚拟机,此时,需要对Intel的中断控制器APIC进行编程,使得物理硬件发生的中断可以直接由虚拟机处理,再利用IOMMU的机制,将DMA和IO空间也映射为虚拟机可以访问的地址空间,以实现虚拟机对硬件的操作在虚拟机内完成,而不需要触发VM_EXIT。
对于网络适配器这种每虚拟机必备,又位于数据平面关键路径的部件,我们可以将真实硬件进行虚拟化后,直通到虚拟机,这种技术叫做SR-IOV。SR-IOV可以在NFV中实现高性能的数据转发,但对于各个虚拟机之间的互通存在缺陷。
各个虚拟机之间的互通,Linux中的原生方案是在内核的linuxbridge中实现,但由于其功能过于简单,且性能受限于通过中断出入内核的执行效率,因而,OVS及OVS衍生出的OVS-DPDK取代了linuxbridge,成为网络虚拟化的主流。特别地,由于OVS-DPDK的超高性能,一度被认为是颠覆性的技术。
然而,DPDK对于CPU核心的独占,会影响云资源的可售卖CPU核心数,从而降低大型公有云的利润。因此,利用专用硬件代替DPDK的思路也成为了新兴而火热的解决方案,这就是SmartNic。
最初的SmartNic,如Mellanox的CX5系列等,相当于在网卡中集成了一个小型的硬件交换机,而且,这个交换机不只是一个具有二三层功能的“傻交换”,而是一个具备Overlay隧道封装、QoS及无损以太网等完整数据中心特性的可编程交换机,它可以顶替宿主机上的OVS,从而实现所谓的OVS卸载。随着SmartNic的发展,如在SmartNic中嵌入FPGA或小型的CPU后,它可以逐渐成为云计算控制平台在各个宿主机和裸金属服务器上的控制平面,如运行Hypervisor等,以释放更多的计算力资源,提升大型云平台的总体算力。
从下期开始,我们会介绍更精彩的内容,请大家期待……