当前位置: 首页 > news >正文

5年匠心之作,深度探索Linux虚拟化

01

为什么写这本书

大约在2014年底,我参与了一个项目,使用Android模拟器在x86架构的机器上运行各种Android游戏。当时项目遇到的核心问题是游戏运行卡顿严重,印象中普通的小游戏每秒大约只能渲染十几帧,大型游戏则完全无法成功加载。运行模拟器的机器都有顶配的显卡,因此硬件性能并不存在问题。那么问题就出在软件架构上了。当时采用的软件架构是:使用虚拟机运行Android程序,Android中有一个模块会将数据通过网络传送给另外一个本地应用进行渲染。对于游戏这种数据量很大的应用,采用网络包传输显然不是一个最优的方案。除了网络包在协议栈中的各种复杂处理外,大量的网络包传输会导致虚拟机和主机之间的频繁切换,这将耗费大量的计算资源。基于此,我们设计的新方案是在VMM层实现一个虚拟设备,在Guest内部通过这个虚拟设备向渲染程序发送数据。虚拟设备通过IPC方式与负责渲染的程序进行通信。方案实现后,原来无法加载的大型游戏每秒都可以达到Android的渲染上限60帧。

2015年我参与了另外一个项目,将虚拟机的块设备数据存储到块存储集群。原有的方案是在宿主机上采用SCSI创建一个块设备,然后将这个块设备传给Qemu,SCSI设备再通过iSCSI协议将块数据传递给远端块存储集群。这个方案有很多弊端,块数据经历了两次I/O栈,一次是Guest内核中的,另外一次是Host内核中的,因此效率很低。另外,这个方案还有个致命的问题:那时偶尔会遇到内核中iSCSI协议的Bug,此时除了重启宿主机外别无他法,而且那时热迁移还不是很成熟,可以想象一下重启宿主机的后果。为了解决这些问题,我们设计了另外一种方案,在Qemu中实现一个虚拟块设备,绕过内核的I/O栈,在该虚拟块设备中直接将块数据通过TCP/IP发给块存储集群,从而不再依赖iSCSI协议。方案实现后,IOPS获得了极大的提升,系统的稳定性也增强了。

经历了很多类似上述的情况,因此我打算写一本Linux系统虚拟化方面的书,希望能让读者更深刻地认识和理解系统虚拟化,于是我和本书的第二作者谢广军博士相约,一起撰写本书。从2015年开始,历时近6年,中间历经多次易稿,从最开始过多地聚焦于烦琐的技术细节,到尝试从系统结构、操作系统和硬件等多角度去解释原委。书中全部采用可以说明问题的早期代码版本,而不是采用因各种特性迭代而变得纷繁复杂的最新代码。

在这5年多的时间里,每每不想坚持时,就会想起自己年轻气盛时经常质疑前辈们为我们留下了什么,而如今我扪心自问,从事了这么多年计算机工作,我又为这个行业做了什么?最后,希望本书能让大家有所收获。

02

内容简介

本书探讨了软件如何虚拟计算机系统,包括CPU、内存、中断和外设等。此外,在云计算中,网络虚拟化也至关重要,因此,本书最后一章探讨了网络虚拟化。

第1章讨论CPU虚拟化。

这一章介绍了x86架构下的VMX扩展,讨论了在VMX下虚拟CPU的完整生命周期。以Guest通过内存映射(MMIO)方式访问外设为例,展示了KVM如何完整地模拟一个CPU指令。然后,我们探讨了KVM是如何模拟多处理器系统的。最后,通过一个具体的KVM用户空间部分的实例,带领读者直观地体会CPU虚拟化的概念。

第2章讨论内存虚拟化。

这一章首先简略地介绍了内存寻址的基本原理,然后分别探讨了实模式Guest以及保护模式Guest的内存寻址,包括大家比较熟悉的影子页表等。最后,我们讨论了在硬件虚拟化支持下,即EPT模式下从Guest的虚拟地址到Host的物理地址的翻译过程。

第3章讨论中断虚拟化。

这一章我们从最初IBM PC为单核系统设计的PIC(8259A)开始,讨论到为多核系统设计的APIC,再到绕开I/O APIC、从设备直接向LAPIC发送基于消息的MSI。最后,我们讨论了Intel为了提高效率是如何从硬件层面对虚拟化中断进行支持的,以及KVM是如何使用它们的。

第4章和第5章讨论外设虚拟化。

我们从完全虚拟化开始,讨论到半虚拟化,最后讨论到Intel的VT-d支持下的硬件辅助虚拟化。其间,我们通过实现一个模拟串口,带领读者直观地体会设备虚拟化的基本原理,然后带领读者深入了解Virito标准。最后,我们还探讨了支持SR-IOV的DMA重映射和中断重映射。

第6章讨论网络虚拟化。

以一个典型的Overlay网络为例,从虚拟机访问外部主机、外部主机访问虚拟机两个方面,分别探讨了计算节点、网络节点上的网络虚拟化技术。

03

本书读者收获

  • 云计算从业人员

    虚拟化是云计算的基础,运行各种服务的云主机都是通过虚拟化方式虚拟出来的,需要深入地掌握虚拟化技术。

  • 云计算平台的研发人员

    只有更好地掌握虚拟化技术,才能更好地管理云主机等计算资源。

  • 云计算解决方案架构师

    只有更好地了解虚拟化技术,才能为客户设计更合理的解决方案。

  • 虚拟化相关底层技术的研发人员

    只要参透虚拟化技术,才能为用户提供更高性能的云主机。

  • IT技术从业者

    虚拟化技术是一门跨领域的技术,涉及操作系统、系统结构、硬件等多个领域。虚拟化提供了一个全方位窥探计算机技术的途径,通过虚拟化技术,我们可以更好地研究在物理环境下无法观察到的各种行为,虚拟化为研究计算机核心基础技术提供了一个无与伦比的环境。

04

    作者介绍    

王柏生

资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。

著有畅销书《深度探索Linux操作系统》(2013年出版)。

谢广军

计算机专业博士,毕业于南开大学计算机系。

资深技术专家,有多年的IT行业工作经验。现担任百度智能云副总经理,负责云计算相关产品的研发。多年来一直从事操作系统、虚拟化技术、分布式系统、大数据、云计算等相关领域的研发工作,实践经验丰富。

更多精彩回顾

书讯 |11月书讯(下)| 这些好书必须“买买买”!

书讯 |11月书讯(上)| 这些好书必须“买买买”!

资讯 |DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后

上新 | 百度官方出品 | 全面解读PaddlePaddle,零基础快速入门深度学习
书单 | 开学季——计算机专业学生必读的10本畅销经典

干货 | 数据分析必读干货:简单而实用的3大分析方法

收藏 | (万字长文)Spring的核心知识尽揽其中

视频 | 大佬出镜推荐不可不读系列——程序员陈彼得

点击阅读全文购买

相关文章:

  • 未来,金融业或颠覆于人工智能?
  • 关于读书,我发现每一个技术大牛都有这个怪癖
  • 互联网发展的成功经验,以及面临的挑战
  • 0元参会丨第十届数据技术嘉年华精彩抢先速览
  • 首次!TinyML低功耗边缘侧机器学习技术论坛-亚洲分会来到中国!
  • 有了中台,那后台还剩下什么?(图解中台架构)
  • 【第30期】Python 之父决定复出,送你几本Python经典图书!​
  • 下一个十年,AI将在这10大领域颠覆世界!
  • r3kapig:校园明星 CTF 战队的奇幻养成之旅
  • 作者领读 | Prometheus云原生监控
  • “深入浅出”学Golang!就选《Head First Go》
  • 华为你学不会,包括数据管理
  • RPA中国流程自动化产业峰会火热报名中...
  • 图灵测试是什么?为什么AlphaGo那么牛却过不了?
  • 阿里动物园新成员来了,10本书带你读懂这个新物种
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Docker入门(二) - Dockerfile
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • ES学习笔记(12)--Symbol
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript对象详解
  • PV统计优化设计
  • React的组件模式
  • Sass 快速入门教程
  • Shadow DOM 内部构造及如何构建独立组件
  • SpringBoot几种定时任务的实现方式
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 不上全站https的网站你们就等着被恶心死吧
  • 从零开始学习部署
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 精彩代码 vue.js
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微信支付JSAPI,实测!终极方案
  • 详解NodeJs流之一
  • 再次简单明了总结flex布局,一看就懂...
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (¥1011)-(一千零一拾一元整)输出
  • (0)Nginx 功能特性
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (已解决)什么是vue导航守卫
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ***详解账号泄露:全球约1亿用户已泄露
  • **python多态
  • .net 获取url的方法
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @GetMapping和@RequestMapping的区别