在上期,我们说到,虽然处理器主频的提升受制于物理规律,在2011年以后就难以出现质的飞跃,但Intel的工程师们不仅仅依靠个人的奋斗,还考虑到了历史的进程,通过在一个物理CPU内集成多个处理核心的方法,以及不断丰富SIMD(Single Instruction Multiple Data,单指令多数据)指令集,来延续了摩尔定律的生命。
当然,多核的出现大大提升了处理器的峰值计算能力。但如果没有做合理的优化,多核的优势会仅仅停留在理论上。那么,怎么样可以让系统有效地管理服务器上数量可达几百个的CPU内核,让它们合理分工并发挥最大效能呢?
德国社会学家马克斯韦伯(Max Weber)指出,近代社会生产力飞速发展、社会分工越来越细、组织规模不断扩大,因此需要一种制度对组织进行管理,这种制度被称为科层制(bureau-cracy)。
科层制的精髓在于,得到授权的中间管理层自上而下传递管理意志,对组织中的工作执行层进行有效的管理和调度。马克斯韦伯认为,这种管理方法虽然会付出一定的成本作为代价,但对于大型复杂系统,这是唯一可行的方法。
计算机科学家们在解决大型分布式系统的基础架构问题时,也受到了马克斯韦伯的思想启发,在计算机系统中引入了科层制设计思想,让来自德意志帝国时代的智慧焕发出新的光芒。
这,就是十几年来风头最盛的虚拟化技术。
假设某台服务器有128个处理器内核,我们只需要将它虚拟为32台虚拟机,每台有4个内核。在程序设计时,我们就只需要考虑每台虚拟机上4个内核的合理分工,就可以让整机的128个内核高效地并行工作了!
当然,正如科层制的实施,需要为中层管理者付出一定的成本一样,在基于虚拟化的系统中,需要引入负载均衡器、虚拟机操作系统等管控组件,并消耗一定的资源,但比起宝贵的CPU利用效率的提升,这是大大有利于解放生产力和发展生产力的。
虚拟机作为虚拟出来的计算机,和真实存在的物理计算机一样,应当具备硬件和软件。虚拟机的硬件包括CPU、RAM、持久化存储盘和网络适配器等,而虚拟机的软件中最重要的是操作系统,一般被称为Guest OS,和物理宿主机上的Host OS是相对应的。
虚拟机运行在为虚拟机提供物理软硬件环境的宿主机(Host Server)上。宿主机除了有真实的物理CPU、RAM、持久化存储盘和网络适配器等硬件以外,还提供了一个最重要的组件,也就是本系列专题的主角——
宿主机操作系统(Host OS)和在宿主机操作系统中内置的虚拟化管理程序Hypervisor。
Hypervisor可以将硬件的CPU分配给多个不同的虚拟机(Virtual Machine)使用。这样一来,本来宿主机的操作系统需要管理以百计的vCPU,现在它只需要管理低一个数量级的VM,每个VM的操作系统管理各自的vCPU即可。如下图所示:
这样一来,我们可以通过增加一个管理层级来解决操作系统与开发者无法高效管理数百个CPU的问题。是不是非常简单?
并不是!
让我们想一想以下几个问题怎么样解决:
1. 用户A的虚拟机和用户B的虚拟机在同一台物理机上,如何保证用户A的虚拟机上的程序,不会访问到用户B的虚拟机的RAM及其他外设?
2. 如果宿主机上的某个硬件(如一块NVMe SSD盘)被分配给一个虚拟机,怎么样让该硬件产生的中断被这个虚拟机所处理,怎么样让硬件的DMA(不知道什么是DMA的同学请自行补习计算机组成原理,这里不多解释)地址指向虚拟机可以访问的RAM地址空间?
3. 虚拟机调用linux的syscall等方法,以执行一些特权指令的时候,是虚拟机进入ring 0,还是会让宿主机进入ring 0?(不知道什么是ring 0的同学请自行补习《Intel 64 and IA32 Architectures Software Developers Manual》)
实际上,这些问题的实质,都是同一个问题——
请看下期 《把特权关进笼子》。