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次数的统计。蓝色代表优化前,红色代表优化后。从图上看出,优化后退出次数明显减少,虚拟机性能越来越接近物理机表现。

相关文章
|
16天前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
103 1
|
25天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
208 2
|
1月前
|
人工智能 Cloud Native Java
云原生技术深度解析:从IO优化到AI处理
【10月更文挑战第24天】在当今数字化时代,云计算已经成为企业IT架构的核心。云原生作为云计算的最新演进形态,旨在通过一系列先进的技术和实践,帮助企业构建高效、弹性、可观测的应用系统。本文将从IO优化、key问题解决、多线程意义以及AI处理等多个维度,深入探讨云原生技术的内涵与外延,并结合Java和AI技术给出相应的示例。
101 1
|
1月前
|
存储 缓存 算法
CPU优化
【10月更文挑战第7天】
31 1
|
1月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
1月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
46 0
|
2月前
|
Prometheus Kubernetes 监控
使用kubectl快速查看各个节点的CPU和内存占用量
在Kubernetes集群中,安装metrics-server,并使用kubectl快速查看集群中各个节点的资源使用情况。
165 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
385 0
|
29天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
61 1
|
1月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。