StratoVirt 地址空间管理- 基于 Rust 的实现与优化
AddressSpace
完成。如下是 StratoVirt 地址空间管理模块的组成,以及其在 StratoVirt 中的位置。 stratovirt
├── acpi
├── address_space
│ ├── Cargo.toml
│ └── src
│ ├── address.rs
│ ├── address_space.rs
│ ├── host_mmap.rs
│ ├── lib.rs
│ ├── listener.rs
│ ├── region.rs
│ └── state.rs
├── boot_loader
├── Cargo.lock
├── Cargo.toml
├── cpu
├── devices
├── docs
├── hypervisor
├── license
├── machine
├── machine_manager
├── Makefile
├── migration
├── migration_derive
├── ozone
├── pci
├── README.ch.md
├── README.md
├── src
├── sysbus
├── tests
├── util
├── vfio
└── virtio
StratoVirt 地址空间模块整体设计
上图中的主要结构含义如下:
-
AddressSpace
地址空间:为地址空间模块的管理结构, 负责整个虚拟机的地址空间管理
-
Region
代表一段地址区间,根据这段地址区间的使用者,可以分为以下类型:
-
RAM:虚拟机内存使用该段地址区间。 -
IO:虚拟机设备使用该段地址区间。 -
Container :作为容器使用,可以包含多个子 Region
。如描述 PCI 总线域的地址管理就可以使用类型为Container
的Region
,它可以包含 PCI 总线域下的 PCI 设备使用的地址区间。该类型的Region
可以帮助管理并区分存储器域、PCI 总线域的地址管理。
FlatView
,则是根据这些 Region
的地址范围和优先级属性形成的线性视图。在通过地址空间管理结构 AddressSpace
访问设备或者内存时, 使用平坦视图 FlatView
可以更加方便快捷地找到对应的 Region
。 Region
都会对应一个优先级 priority
属性,如果低优先级的 Region
占用的地址区间和高优先级的 Region
占用的地址区间重叠,则低优先级的 Region
的重叠部分,将会被覆盖,即在平坦视图 FlatView
中不可见。 FlatView
的更新。一些设备或者模块需要获取最新的平坦视图,并相应的执行一些操作。例如 Vhost 设备,需要将平坦视图中的全部内存信息同步到内核 Vhost 模块,以便通过共享内存方式完成消息通知的流程。另外,我们也需要将已经分配并映射好的虚拟机物理地址和宿主机虚拟地址信息注册到 KVM 模块,这样可以借助硬件辅助虚拟化加速内存访问的性能。基于以上需求,我们引入上图中的地址空间监听函数链表,该链表在平坦视图 FlatView
更新后被依次调用,可以方便的完成信息同步。该链表允许其他模块添加一个自定义的监听回调函数。 地址空间优化
拓扑结构更新优化
Region
的接口,并设定 AddressSpace
结构负责管理整个数据结构并生成更新后的 FlatView
结构。 Region
的方式为, 调用 Region
结构的 add_subregion
接口,注意父 Region
必须是 Container
类型。这样会带来一个问题,如果向树状结构中的某个 Region
中添加或者删除子 Region
,并引起树状结构的拓扑发生变化,负责生成并更新平坦视图的 FlatView
的 AddressSpace
结构体如何得知已经发生变化呢? Region
结构中添加成员并指向自己所属的 AddressSpace
,如上图所示。熟悉 Rust 语言的同学应该知道,这种实现方式会引入资源相互引用的问题,导致 AddressSpace
和 Region
两者因相互引用而在生命周期结束时无法释放内存资源的问题。因此,在地址空间模块的树状结构中,所有 Region
对自己所属的 AddressSpace
的指针都使用 std::sync::Weak
类指针, Weak
指针不会增加所指向对象的引用计数,可确保在生命周期结束时对应结构的析构和资源释放。 pub struct Region {
region_type: RegionType,
priority: Arc<AtomicI32>,
size: Arc<AtomicU64>,
offset: Arc<Mutex<GuestAddress>>,
mem_mapping: Option<Arc<HostMemMapping>>,
ops: Option<RegionOps>,
io_evtfds: Arc<Mutex<Vec<RegionIoEventFd>>>,
space: Arc<RwLock<Weak<AddressSpace>>>,
subregions: Arc<RwLock<Vec<Region>>>,
}
锁优化
锁粒度最小化
AddressSpace
结构体如下。可以看到, AddressSpace
的关键成员都以 Arc<Mutex<..>>
的方式保证了多线程共享的安全性。 pub struct AddressSpace {
root: Region,
flat_view: ArcSwap<FlatView>,
listeners: Arc<Mutex<Vec<Box<dyn Listener>>>>,
ioeventfds: Arc<Mutex<Vec<RegionIoEventFd>>>,
}
锁性能优化
// AddressSpace优化前结构
pub struct AddressSpace {
root: Region,
flat_view: Arc<RwLock<FlatView>>,
listeners: Arc<Mutex<Vec<Box<dyn Listener>>>>,
ioeventfds: Arc<Mutex<Vec<RegionIoEventFd>>>,
}
FlatView
具有重要作用。其一,在树状拓扑结构发生变化时,例如添加和删除 Region
,会引起平坦视图 FlatView
发生变化,因此应该获取 AddressSpace
中 flat_view
成员的 写锁,用于更新平坦视图;其二,设备访问内存、VCPU 退出到 StratoVirt 访问设备,都要通过 AddressSpace
的 flat_view
成员,获取 读锁,找到对应的 Region
,然后进行读写操作。 RwLock
仍然存在两个问题:其一,经过测试,Rust 读写锁的性能比互斥锁差。而读写锁和互斥锁的性能均比原子类型差;其二,在某些场景下,地址空间管理模块需要实现 函数可重入的支持,即 在持有 FlatView
读锁的情况下,仍可以对树状拓扑结构和平坦视图 FlatView
更新(例如,PCI bar 空间更新,需要通过 AddressSpace
访问设备寄存器来设置地址,并将确定好地址的 PCI bar 空间添加到 AddressSpace
中)。 arc_swap
第三方库的 RCU-like 的机制,不但可以满足可重入性的要求,而且通过地址空间模块访问内存的性能可以提升 20%以上。 pub struct AddressSpace {
root: Region,
flat_view: ArcSwap<FlatView>,
listeners: Arc<Mutex<Vec<Box<dyn Listener>>>>,
ioeventfds: Arc<Mutex<Vec<RegionIoEventFd>>>,
}
关注我们
StratoVirt 当前已经在 openEuler 社区开源。后续我们将开展一系列主题分享,如果您对 StratoVirt 的使用和实现感兴趣,欢迎您围观和加入。
项目地址:https://gitee.com/openeuler/stratovirt
项目 wiki:https://gitee.com/openeuler/stratovirt/wikis
您也可以订阅邮件列表:https://mailweb.openeuler.org/postorius/lists/virt.openeuler.org/
如有疑问,也欢迎提交 issue:https://gitee.com/openeuler/stratovirt/issues
入群
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
英特尔发力图像超采样技术 XeSS,未来将开源
英特尔的芯片在全球个人电脑和数据中心中占据着主导地位,提起英特尔这个名字,大家的印象通常还停留在它是一家专注于对 CPU 进行研发制造的厂商。但面对 ARM 的迅速崛起,以及老对手 AMD 的强势反弹,英特尔也面临着更大的挑战。为了提高芯片的整体硬件的性能,英特尔如今也加大了 在图形处理器方面的投入,并在去年发布第十一代酷睿处理器的时候,一同发布了 Xe 架构的显卡。 除了更新 Xe GPU 架构以及推出高端 Arc 品牌显卡,英特尔如今也开始关注英伟达和 AMD 一直在推广的图像超采样技术,以配合自己的硬件产品。英特尔 XeSS(Intel Xe Super Sampling) 就是英特尔所推出的,用来对标英伟达 DLSS/NIS 和 AMD FSR 的技术。 英特尔 XeSS 与英伟达 DLSS/NIS 和 AMD FSR 本质上都是图形超采样技术。英特尔 XeSS,是一种使用空间和时间数据的图像升格技术,并依靠人工智能来完成。它在不同的时刻对图像中的像素进行颜色采样,然后使用这些颜色数据,以更高的分辨率渲染图像。 超采样比传统的抗锯齿方法更有优势,可以提供质量更好的高分辨率图像,...
- 下一篇
制造型企业如何上云?
WOT全球技术创新大会2022,门票6折抢购中!购票立减2320元! 企业上云是近几年制造业企业追捧的热词,许多企业通过上云极大地提升了企业的运营效率,上云成为企业发展工业互联网云平台的必然选择。工业互联网云平台作为新一代信息技术与工业系统深度融合的产物,日益成为实现生产制造领域全要素、全产业链、全价值链连接的关键支撑和工业经济数字化、网络化、智能化的重要基础设施。 制造型企业可在云平台服务商或第三方机构等外部机构的支持下,按照应用场景梳理现有业务流程,确定数据节点,策划上云业务流程,并根据上云方案进行构建环境,进行上云演练,经过测试和验证,不断优化完善上云方案,通常有3步。 (1)业务流程梳理,包括上云场景梳理,业务过程梳理,包含与业务流程相关的人、机、料、法、测等过程输入要素及输出要素的梳理,这些要素的数字化是上云的第一步。 (2)平台端开发,主要包括上云链路通道搭建、接口开发,在云平台端开发数据存储模型,数据分析处理模型,构建模拟环境,进行功能测试、性能测试、备份测试、容灾测试等。 (3)前端开发,对于一个制造过程,一个过程的终点往往是另一个过程的起点,具体的前端对象包括人、机、...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果