我们在前面几期的专题中讲清楚了虚拟化的几大基本技术:CPU虚拟化、内存寻址适配虚拟化、IO设备虚拟化和网络虚拟化,也让我们回归到探索虚拟化与云计算技术的初心——
我们在《虚拟化与云计算硬核技术内幕 (3) —— 苟利国家生死以,岂因福祸避趋之》中提到过,虚拟化技术最初是用于解决单台高性能服务器的处理器资源浪费的问题的。
在实际应用中,如果没有高并发的情况,很多服务器,特别是Web前端服务器,在空闲时期,如夜间,它的CPU占用率是很低的。如果放任一个虚拟机的CPU占用率长期是个位数,实际上,这也是一种浪费。
方老师有个学生叫小E,是个妹子,看到《毛选》第一卷里面的一句话“贪污和浪费是极大的犯罪”的时候,不由得想到,在全球电子供应链紧张的今天,对CPU计算能力的浪费,也是对用户及时交付服务器而呕心沥血的架构师和项目经理们的极大的犯罪。小E想,如果在系统中有10台虚拟机,每台虚拟机的CPU利用率都是10%以下,有没有办法让它们运行在一个CPU HT上,以充分利用这个CPU HT的计算能力呢?
小E在企业微信上给方老师发了个消息请教这个问题。
方老师正在会议里面,看见小E的问题,回复了六个字:
“时间管理大师”
小E去某B搜索引擎上搜索了一下这个概念,打开了通往新世界的大门……
原来,“时间管理”是指人对时间安排的能力。时间对每个人都是相同的,但有的人一天能做的事情特别多,有的人则做不到。能做的事情特别多的人,就被称为“时间管理大师”。
例如,小L由于非常有魅力,因此有多个女朋友,但和某一个女朋友约会时,与其他女朋友宣称自己在忙一些事情,如看球赛,玩剧本杀,刷学习强国等。这样,其他女朋友就认为,自己的男朋友是自己独占的。小L这种情况就被称为是“时间管理大师”。
类似地,在计算机系统中,操作系统可以将CPU的时间片按一定策略分配给不同进程使用。当一个进程被阻塞在等待信号量、获取锁或其他IO操作完成时,其他进程就可以使用CPU。另一种情况是高优先级进程可以抢占低优先级进程的CPU资源。
那么,如果能在虚拟化系统中引入这一特性,让多个虚拟机像多个进程一样共享CPU,是不是就可以将CPU的时间利用得更充分了呢?
小E带着疑问,翻开了厚厚的《操作系统》。
原来,操作系统对CPU的时间管理,是依赖于时钟中断机制。
每台计算机内部都有一个时钟中断发生器(如Intel x86处理器最早使用外挂的8253或8254芯片,后来被集成在南桥中),开发者可以让它以一定的频率发出时钟中断。
在x86体系结构上,运行Linux操作系统,系统引导初始化阶段,会把时钟中断发生器配置为每分钟发出1000次时钟中断。当时钟中断发生时,当前CPU执行的任务被无条件切断(除非在其他中断处理程序中),并保存所有寄存器以及程序指针在内的执行现场,并进入操作系统的任务调度模块。如果调度模块认为应当把CPU资源分配给其他任务,那么,中断的返回地址将会是其他任务被时钟中断切断时的指令指针地址,同时,CPU内部的寄存器也会被恢复为下一个任务上次被切断时的寄存器内容。当iret指令执行完毕后,CPU开始执行下一个任务。
如图,任务A和任务B并发运行,操作系统在时钟中断中调度任务。
那么,我们如果对虚拟机也进行这样的调度,就可以将一个CPU的HT,虚拟化为多个vCPU给虚拟机使用了!