深度探索Linux系统虚拟化:原理与实现

王柏生 谢广军
前言 为何写作本书 大约在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获得了极大的提升,系统的稳定性也…
作品载入中,请稍候 ...
扫码下载客户端
手机/Pad随时读