从CPU/OS到虚拟机和云计算

 作者:张冬

           关于软硬件谁为主导这个话题,套用一句谚语就是三十年河东三十年河西。风水轮流转。软件和硬件一定是相互促进、相互拆台又相互搭台的。

一些之前被诟病的上层架构。也许若干年之后会被发现成了最合适的选择,而再过若干年,又会变得不合适。

软件定义亦或是硬件定义。相同也是这样。硬件定义的结果是性能够强可是不灵活,此时软件定义便会開始酝酿翻盘。可是不论什么事情都有惯性。软件“过度”定义之后,会发现非常多事情搞不定。还得靠硬件来加速一下,此时開始进入硬件定义周期。然后循环往复。

我们能够用几个样例来窥探一下这样的规律。

CPU和OS

       一对不离不弃的夫妻。阴抱阳,阳抱阴。一開始没有所谓中断,更没有所谓OS。仅仅有顺序运行指令计算机和被写死的程序,非常不灵活。后来才有了OS,CPU先运行OS这个大循环程序,然后加载所须要运行的用户程序运行,运行完退出,能够继续加载其它程序运行。哪怕最简单的OS要想玩转,CPU起码也得至少提供IO和时钟中断机制。OS呱呱坠地,就得不断长大。不断地进化,单任务不灵活,就得多任务分时运行。全部任务共享内存空间。导致了安全性问题,这就不得不引入虚拟内存技术,所以软件越来越复杂。性能逐渐就不行了。此时CPU出来说话了。我来搞定虚拟内存。提供页表极致,提供专用的控制寄存器,并提供专用的查表加速硬件部件。多任务分时OS的生产力被初步释放。可是性能还是较差,还得依靠CPU搞定。CPU继续发力,引入超线程技术,让多个线程的代码能够并发运行。这得益于流水线的设计。为了能够更好的实现线程并发运行。后来继续出现多核心多CPU的SMP技术,
OS不得不做出修改。

可是多CPU/核心并非不论什么时候都非常高效地并发多线程的,随着软件复杂度提升,线程同步、缓存一致性等问题导致须要大量状态和数据同步,传统的共享式的前端总线效率太低,所以不得不改为交换式Fabric比方IntelQPI,訪问内存经过太多跳器件效率上不去,所以也改为直连CPU分布式共享架构。这也是当今的形态。再往后会怎么发展。应该能够顺着惯性往前推导一下。交换式Fabric的出现。意味着CPU和CPU之间能够离得越来越远,仅仅要有足够快速的链路连接。这一形态事实上就是大型NUMA计算机的形态了。这一形态的轮回意味着软件架构的变化,传统领域须要高性能的场景不得不使用大型机、小型机,但它们是极其昂贵的——就是由于不开放,并且又不可能像互联网领域一样投入开发资源在分布式系统上定制化自己的应用。而开放式大型NUMA系统出现之后。可能之前的被“过度”定义了的分布式系统生态又会沉寂下来,这个循环进入新的周期纪元,在这个纪元里,以前光鲜的分布式系统可能会被新生代project师/架构师觉得是一种非常不可思议的“野路子”:“你看。以前这样的架构。好坑爹啊!”。

这就像我们如今回头看之前的有些设计一样。也会感觉到不可思议,那时候的人都这么“脑残”么?恩,假设换了你回到那个时代。也许更脑残:)。无论谁脑残,一个事实是始终不变的。那就是硬件性能的绝对值是一直直线上升的。无论分布式还是集中式。

CPU和VMM

         VMM能发展到今天这个地步是无人始料的,一開始就是玩玩。没想到玩了个大的出来。

有不少人持有上述观点,事实上这个观点仅仅是表象。

虚拟机技术起源于大型机,中小型机上早已也使用了多年,所以VMM可并非玩玩。大机小机都是封闭市场。技术也确实牛。

开放市场领域非常多技术事实上都是源自大型机小型机。虚拟机显然是单机性能过剩,而多机总体资源又无法得到全局细粒度池化分配时代的产物。VMM虚拟CPU。虚拟IO设备,虚拟内存,一開始全用软件实现,每一条指令解释运行,后来优化了设计,但终于还是要监控和截获+虚拟那些敏感和特权指令,每一个进程还要虚拟出额外页表从而虚拟内存。IO须要经历重重内存拷贝才干发出去一个包。要想商用的话。软件各方面开销实在是搞不定了,此时还得硬件出马,在CPU层面提供硬件辅助,IO设备也開始有了SRIOV/MRIOV的方案,我总感觉这次硬件反而有点“过度”定义了。被软件骗了一回。为什么呢?就由于硬件资源不能做到池化和细粒度切分,才会产生VMM这个尴尬的东西,而此时硬件仿佛走火入魔了。弄出一系列复杂的技术来支撑VMM。事实上硬件还有还有一条路能够走。相同能够实现VMM相似的效果,那就是让硬件变得能够切分。而不是用软件去切分。这条路在小机系统上以前有人尝试过,採用总线级别的隔离开关来切分不同的CPU和内存以及IO槽位。要实现细粒度切分的前提是必须把硬件最小切分粒度降下来,单CPU使劲添加性能事实上已经不是一条比較明智的路线了。

近几年众核CPU不断冒出头来。单CPU128个核心已经不是什么吃惊之事了,可是由于生态尚未成熟。它们眼下仍被局限在并行度高耦合度低的处理场景比方网络包处理等。

还有一个迹象就是ARM生态的崛起,种种迹象表明这非常有可能是一条光明大道。

可是怎样将传统生态导向这个道路上就不那么简单了。

我们看到Intel正在搞SiPh硅光方案,其致力于硬件资源的灵活拼搭。假设粒度足够细,VMM事实上就能够退出舞台了,这将又是一场硬件拆台软件的血腥战斗。

  虚拟机和云计算

       虚拟机的发展催生硬件加速方案,也正是由于硬加速,又使得虚拟机能够大范围应用。也正是如此。才将云计算的概念带了出来,也就是硬件又反过来加速了软件的变革。而随着量的上升,会影响质变。人们会发现事实上VM这样的东西是非常低效的虚拟化,VMM个人理解事实上是一股具有邪性的阳气,他看似光鲜实则非常损耗阴实的,体现为过多不必要的操作系统实例。操作系统本来就是利用线程/进程来虚拟化多任务多用户的运行,每一次系统调用的开销是非常高的。让一个CPU同一时候运行多个操作系统实例,无疑是极大的浪费。上文提到过这样的模式是单机性能过剩而总体资源又无法得到池化时代的产物。

而云计算架构的出现。会打破这个矛盾。

云计算可能初生的时候就是一个全局虚拟机资源调度管理软件框架,可是一个事物毕竟是不断在成长进化的。云计算会终于找到它的使命。那就是大范围全局资源的池化、分配调度管理监控,也就是数据中心级的OS,做的事情与单机OS如出一辙。

既然如此,那么AAAS(ApplicationAs
a Service)应该是云计算终于要实现的状态。这就相当于打开屏幕。就出现一堆应用图标,点进去完毕你要的功能,退出,结束。既然用户不须要IAAS,不须要直接面对操作系统,那么搞那么多VM实例事实上就是没有必要的,空耗资源。

云计算须要实现一个全局的应用进程级别的调度中枢,而不是调度VM。

再来思考一下大机为什么须要VM?由于大机那个时代并没有如今这样的云计算的概念。xAAS这个思维,你能够说那时候人脑残。那时候软件技术是非常封闭并且不发达的,所以进行资源细粒度切分,用VM也算是快刀斩乱麻的方案。我们也看到进程级虚拟机(比方LinuxContainer)业逐渐在受到关注。

这些都是云计算这个软件框架、这个宏观的OS的定义,那么这样的定义会对硬件有什么影响?我想那一定会催生两个硬件形态的变革,一个就是上面所说的单点的性能要足够低,力度要足够细。单点性能“足够低”。这可能让人大跌眼镜,只是将来可真说不定啊,众核CPU就是个非常好的胚子;还有一个是局部多层快速Fabric核间通信,由于CPU/核心能够随意切分和组合。他们之间一定须要一个快速总线相互连接。眼下存在多种Fabric方案和产品,这块尽管比較低调冷门可是也还算成熟,加上硅光等技术会将Fabric隐身至机架外,这就为大范围池化提供了支撑。

而这次硬件的变革非常可能又会影响软件的架构。使得大规模并行计算不再须要MPI等远程消息传递机制。消息传递直接使用Fabric硬件加速的队列FIFO,会大大简化编程。有利于HPC的模式终于能够全面得到普及。

        云计算,宏观操作系统。数据中心级的NUMA机,一切皆有可能。

从CPU/OS到虚拟机和云计算的更多相关文章

  1. 从安装Mac OS X虚拟机到第一个IOS程序

    对于纯粹地抄这种行为是比较抵触的,别人已经写得挺好的东西没必要又去写一遍,但如果不写经验来看下次再做时自己又要重复百度筛选一遍,所以还是要记一记. 之前要获取IOS静态库的版本,但一直以来没有Mac没 ...

  2. Ubuntu 16.04安装Mac OS 12虚拟机资源(没成功,但资源还是可以用)

    整理的Mac OS 12虚拟机资源.装虚拟机基本是按这样的套路: 1.先装VM 2.破解VM使其支持Mac OS 12,这个脚本基本是全平台支持,可以看里面的教程文档. 3.用镜像安装系统. 资源: ...

  3. 安装OS X虚拟机错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123

    新建一个虚拟机, 选择客户机操作系统为Apple MacOS X 10.10, 其余参数可以默认. 注意建好之后不要急着打开客户机, 因为直接打开你会发现新建的客户机将会无法启动. 仔细阅读Mac O ...

  4. 【转】安装OS X虚拟机错误vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1123

    新建一个虚拟机, 选择客户机操作系统为Apple MacOS X 10.10, 其余参数可以默认. 注意建好之后不要急着打开客户机, 因为直接打开你会发现新建的客户机将会无法启动. 仔细阅读Mac O ...

  5. CentOS7.6中 KVM虚拟机内存、CPU调整

    CentOS7.6中 KVM虚拟机内存.CPU调整 一.调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.查看当前内存大小 [root@heyong kvm]# virsh dominfo t ...

  6. 华为云计算IE面试笔记-FusionCompute虚拟机热迁移定义,应用场景,迁移要求,迁移过程

    *热迁移传送了什么数据?保存在哪? 虚拟机的内存.虚拟机描述信息(配置和设备信息).虚拟机的状态 虚拟机的配置和设备信息:操作系统(类别.版本号).引导方式(VM通过硬盘.光盘.U盘.网络启动)和引导 ...

  7. CentOS7中KVM虚拟机内存、CPU调整

    CentOS7中KVM虚拟机内存.CPU调整 1. 调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.1 查看当前内存大小 [root@kvm01 ~]# virsh dominfo vm1- ...

  8. 对KVM虚拟机进行cpu pinning配置的方法

    这篇文章主要介绍了对KVM虚拟机进行cpu pinning配置的方法,通过文中的各种virsh命令可进行操作,需要的朋友可以参考下 首先需求了解基本的信息 1 宿主机CPU特性查看 使用virsh n ...

  9. kvm基础 虚拟机内存、CPU调整

    转自http://blog.csdn.net/hnhuangyiyang/article/details/50902223 一.调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机1.查看当前内存大小 ...

随机推荐

  1. PHP——注册页面,审核页面,登录页面:加Session和Cookie

    实现效果: 用户注册信息,管理员核对信息审核通过后,可实现注册的用户名和密码的成功登陆,利用session和cookie获取用户信息并且不能跳过登录页面直接进入主页面 1.Session存储在服务器可 ...

  2. notification 报错the method build() is undefined for the type Notificatin.Builder

    notification 报错the method build() is undefined for the type Notificatin.Builder 这事api版本号太低导致的 Notifi ...

  3. asp.net 导出EXCEL超高兼容(不用装Excel)

    用网上的代码你会发现,下载下来后,会提示"你尝试打开的的文件的格式与文件扩展名指定的格式不一致 请验证文件没有损坏且来源可信的提示,研究了好久 后来发现可以使用人家做好的组件NOPI去实现, ...

  4. 在J2EE的Web应用中,编译后的class文件存放的目录为(选择1项)

    在J2EE的Web应用中,编译后的class文件存放的目录为(选择1项) A. classes目录 B. images目录 C. jar目录 D. 任意位置 解答:A

  5. 敏捷软件开发实践-Sprint Retrospective Meeting(转)

    介绍: 在敏捷开发模式中,Sprint Retrospective Meeting 也是一个必不可少的环节,它通常发生在每个Sprint的结尾,其主要作用是对于当前的迭代周期做一个阶段性的总结,包括好 ...

  6. 【vijos】1006 晴天小猪历险记之Hill(dijkstra)

    https://vijos.org/p/1006 连边后跑点权的最短路 注意连边的时候左端点可以连到下一行的右端点,右端点可以连到下一行的左端点 #include <cstdio> #in ...

  7. js获取url中指定参数的值(含带hash)

    function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&] ...

  8. hdu 1201:18岁生日(水题,闰年)

    18岁生日 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. Splash界面完美实现

    Flash闪烁界面的实现原理 1.首先 new一个数组里面放一些Random图片 private int[] drawables = new int[]{R.drawable.a,R.adable.b ...

  10. C语言字符数组和字符串

    用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o' ...