CPU、内存、IO虚拟化关键技术及其优化探索

简介: 云栖社区2017在线技术峰会上,来自阿里云弹性计算团队的子团分享了红包背后虚拟化技术。他从CPU虚拟化、内存虚拟化、IO虚拟化三个方面介绍了虚拟化关键技术。他还分享了虚拟化架构的优化探索,包括高性能网络方案、高性能云盘/本地盘方案、高效热迁移技术、虚拟机CPU/内存热插拔技术等。

云栖社区2017在线技术峰会上,来自阿里云弹性计算团队的子团分享了红包背后虚拟化技术。他首先比较了容器技术和虚拟化技术,然后从CPU虚拟化、内存虚拟化、IO虚拟化三个方面介绍了虚拟化关键技术。他还分享了虚拟化架构的优化探索,包括高性能网络方案、高性能云盘/本地盘方案、高效热迁移技术、虚拟机CPU/内存热插拔技术等。

以下内容根据直播视频整理而成。

视频回顾:点击进入

pdf下载:点击进入

面临的挑战

fcbc34ea821cca1ed348f879e38694ebdb69dd3d 

以前在阿里、天猫等用的比较多的是容器技术,比如LXC/Docker,从2015年开始将“双十一”的流量部分迁移到了阿里云的虚拟机上。容器技术的特点是轻量,很容易达到本地物理机的性能,而虚拟化技术是跑在物理机上的虚拟机上的,开销相对大一些,性能不如容器技术,但是安全性比较高。

容器技术

 8cc173d01680b20fa4bc89f6f78eb8a7784f51d8

容器技术的大体架构如上图所示,最下面是硬件平台,主流使用的是Linux内核,内核上会有Container引擎,最上方会跑一些Container实例。

虚拟化技术

b7110242254a4d485a5fbf38a56c158e8c9e5a23 

虚拟化技术和容器技术最大的差别是在虚拟机和硬件平台之间会有一个虚拟机监视器,主要用于将硬件抽象出来切分资源提供给虚拟机,提供隔离和虚拟化的功能,在监视器上方则是一个个的虚拟机。

要在阿里云的公有云上跑这些业务的话,需要比较强的隔离性、安全性,所以选择虚拟化技术更加合适。虚拟化技术概念是IBM很早提出的,然后VMware公司将虚拟化技术推向民用市场。Intel发布VT-x后,虚拟化技术走向成熟,公有云的普及让虚拟化技术规模扩大。

虚拟化关键技术

CPU虚拟化

67e7119f6166f2fc0cb4f0ed7104e0ec19192366 

CPU的虚拟化从实现上可以分为三种:二进制翻译技术,其优势在于跨平台虚拟化也可以实现(纯软件实现,对硬件没有要求),其缺点是指令翻译过程开销会明显增加(因为要用很多指令才能解释一个其他平台的指令,和单词翻译类似),性能不好,很少用在商用工程上,主要用于研究机构做仿真;CPU半虚拟化技术,比如在X86机器上虚拟X86的虚拟机,大部分的指令是不需要翻译的,但因为x86早期设计问题,有些敏感之类执行的异常没办法被hypervisor捕获, 导致无法进行适当模拟, 所以虚拟机的内核必须要通过修改来适配虚拟化环境CPU硬件辅助虚拟化技术(VT-x),即每个虚拟机在non-root模式下,看到的资源(比如x86的ring结构)和本地的物理机是一致的,理论上虚拟机的内核不需要经过任何的修改就能够完全运行起来。

3103f4e11339e5e39796837c5b03915a7138b5d5 

目前的X86机器都是支持VT-x的。VT-x提供了两种模式:root模式,权限最高,可以访问所有硬件,管理所有虚拟机;non-root模式,只拥有部分特权。右下角的这张图中,VMM跑在root模式下,其上是两个虚拟机,从root模式进入non-root模式的过程叫VM Entry,从虚拟机退出到VMM的过程是VM Exit。

5573bdadcb3e9dbfd18446a32ff0101187836f2a 

当需要给虚拟机执行机会使它能够运行里面的操作系统、进程作业时,需要从root模式进入non-root模式,在non-root模式运行和在物理机上运行是没有任何区别的。只有当需要去访问一些硬件,做IO操作, 或者收到中断等情况的时候, 才需要从虚拟机退出到VMM。VM Entry和VM Exit决定了跑在机器上的虚拟机的性能,这两个操作是非常耗时的,在当前主流的至强E5平台上大约需要1 ~ 2微秒的时间。VMCS则记录了用来决定两种模式间切换的控制数据。

内存虚拟化

内存虚拟化主要面临两方面的挑战:虚拟机操作系统总是希望能够看到物理内存是从0开始的;虚拟机总是希望看到在地址空间里内存是连续的。但是硬件往往并不能保证上述两点。

b035d9c002f70230886b5f3a05f80de5a362e6d6 

如上图所示,在虚拟机里看到的内存实际上是Pseudo伪物理内存,实际的物理内存分配是硬件管理的。

MMU虚拟化技术

MMU是内存里CPU访问内存的一个主要控制单元,它面临的挑战是Guest TLB和Guest页表对硬件来讲并不总是有效的,所以MMU一定要经过虚拟化。MMU虚拟化主要有四种方式:Direct page tableVirtual TLBShadow page table(通过多层的page table来控制)和Extended page table(目前最主流的)。

Extend Page Table

39bcf4dc6b0a7cbc9bc3f0973b81c806457e3576 

Extend Page Table的实现如上图所示,Guest CR3控制页表的信息,完成Guest的线性地址到物理地址的转换过程,再到物理机的物理地址映射则通过EPT来完成。这种基于硬件的EPT技术,使得虚拟机里的一次内存访问不需要经过多次的页表访问就可以完成,在内存访问方面可以达到和物理机相近的水平。

IO虚拟化

073fe956c5e5646a6a56b21aa1cafa664527bc15 

常见的IO虚拟化主要有三种方案:基于软件模拟的方案,这种方案里, 中断、DMA的访问都是通过软件实现的,优点是可以模拟任何硬件的模型,缺点是性能不会太好;半虚拟化技术,主要是为了解决软件模拟性能问题,比如串口对性能要求不高可以采用软件模拟,但是磁盘设备、网卡设备对性能要求高,主流方案是采用半虚拟化技术,前后端相互感知,通过Shared Memory控制请求的传输,两个设备之间的通知也是基于快速消息传递,性能很高;设备直通模式,比如PCIE的直通、网卡SROV直通,对性能更高的可以采用此模式,可以达到和物理机上直接使用接近的性能,但是设备和虚拟机的耦合会对管理造成影响。

虚拟化架构优化

虚拟化平台升级及优化

4421d7ffc16ccfb0686afc6e50a567ec19295fb3 

早期的阿里云后台采用Xen的虚拟化方案,之后切换到了KVM里面。KVM能够给虚拟机提供更好的性能、稳定性, 更重要的是架构简洁,可维护性高。

d73f7539cd9ba4e9c209f1d6939ca530145663c5 

虚拟化的整体架构如上图所示,最上方是后羿管控系统,主要负责虚拟机生命周期的管理,下发虚拟机启停、关闭、销毁等操作到物理机,调用Libvirt接入API,而Libvirt通过调用Qemu完成虚拟机的操作。系统使用Virtio技术做磁盘和IO设备的虚拟化,内核中使用vhost-net/vhost-blk模块来加速Virtio的性能。

新虚拟化平台的特性

  • 热升级架构:所有组件热升级,由于开源代码有安全漏洞,热升级技术为性能保驾护航;
  • 高可用性架构:高效、稳定的热迁移,CPU/内存的热插拔vMCE支持,内核热补丁;
  • 高性能网络架构:支持vhost-net,支持多队列虚拟网卡,SRIOV硬件网卡虚拟化
  • 高性能存储架构:支持dataplane增强的高性能分布式存储,支持SPDK的超高性能用户态框架

高性能网络方案

6cc84c41c061fa32c8170fe8c64cb33a2d46e950 

高性能网络是基于SRIOV和万兆网卡技术来做的。

高性能云盘/本地盘方案

e303d1c3e8d84a86367f22bc0a6f91e3e7c8d747 

SSD云盘的数据可靠性非常高,对数据可靠性要求不是非常高的业务可以使用高性能本地盘。

高效热迁移技术

e4a361132555bf17738c9baca5b9fe70947753df 

不同集群中的数组集的负载出现不均衡情况时,需要将负载特别高的物理机上的虚拟机迁移一部分到负载低的物理机上,如果没有热迁移技术则只能采用停机迁移的方式,用户可以感知到,但是热迁移技术用户是感知不到的。另外,当物理机硬件出现故障时,比如磁盘坏道变多、可校正ECC较多,此时就可以把此物理机上的所有虚拟机热迁移到其它物理机上,然后对故障机器进行维护。当机器上软件版本出现很大问题没办法进行热升级的时候,也可以使用热迁移技术进行迁移升级。

虚拟机CPU/内存热插拔技术

140ac0b5df1c411895d72a59e0502ef8b5d9c60f 

当升级设备时,不想停机升级,则可使用热插拔技术进行扩容。

软件层面tuning

在软件层面进行了大量的优化:PvtimerPvipiPosted interruptpower

优化效果

5c13b80ef088a5e6b057a57654448e8924b0b00d 

上图反映的是一台虚拟机在跑红包其中某一个业务的时候,虚拟机每秒vmexit次数的统计。蓝色代表优化前,红色代表优化后。从图上看出,优化后退出次数明显减少,虚拟机性能越来越接近物理机表现。

相关文章
|
11天前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
29 4
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
70 5
|
12天前
|
开发框架 并行计算 .NET
燃烧吧,Python!异步编程如何点燃IO密集型任务,让CPU密集型任务也加速狂奔?
燃烧吧,Python!异步编程如何点燃IO密集型任务,让CPU密集型任务也加速狂奔?
14 2
|
26天前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
40 2
|
28天前
|
KVM 虚拟化
计算虚拟化之CPU——qemu解析
【9月更文挑战10天】本文介绍了QEMU命令行参数的解析过程及其在KVM虚拟化中的应用。展示了QEMU通过多个`qemu_add_opts`函数调用处理不同类型设备和配置选项的方式,并附上了OpenStack生成的一个复杂KVM参数实例。
|
9天前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
25 0
|
13天前
|
算法 Java 程序员
解锁Python高效之道:并发与异步在IO与CPU密集型任务中的精准打击策略!
在数据驱动时代,高效处理大规模数据和高并发请求至关重要。Python凭借其优雅的语法和强大的库支持,成为开发者首选。本文将介绍Python中的并发与异步编程,涵盖并发与异步的基本概念、IO密集型任务的并发策略、CPU密集型任务的并发策略以及异步IO的应用。通过具体示例,展示如何使用`concurrent.futures`、`asyncio`和`multiprocessing`等库提升程序性能,帮助开发者构建高效、可扩展的应用程序。
31 0
|
13天前
|
UED 开发者 Python
Python并发编程新纪元:异步编程如何重塑IO与CPU密集型任务的处理方式?
在Python编程中,异步编程作为一种非阻塞模式,通过允许程序在等待IO操作时继续执行其他任务,提高了程序的响应性和吞吐量。与传统同步编程相比,它减少了线程等待时间,尤其在处理IO密集型任务时表现出色,如使用`asyncio`库进行异步HTTP请求。尽管对CPU密集型任务的直接提升有限,但结合多进程或多线程可间接提高效率。异步编程虽强大,但也带来了代码复杂度增加和调试难度提升等挑战,需要开发者掌握最佳实践来克服这些问题。随着其技术的成熟,异步编程正在逐步改变我们处理IO与CPU密集型任务的方式,成为提升性能和优化用户体验的重要工具。
9 0
|
2月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
24天前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
49 0

热门文章

最新文章

下一篇
无影云桌面