使用eBPF进行半虚拟化调度\动态vcpu优先级管理

使用eBPF进行半虚拟化调度\动态vcpu优先级管理

动机

  1. 双重调度
    • 主机(Host)调度虚拟CPU(vcpu)线程。
    • 客户机(Guest)调度在客户机内部运行的任务。
  2. 调度器之间的无知
    • 主机在调度vcpu线程时,不知道vcpu上正在运行什么任务。
    • 客户机在调度任务时,不知道vcpu物理上在哪里运行。
  3. vCPU的运行问题
    • vCPU通常是主机中的常规CFS(完全公平调度)任务。当主机承受负载时,vCPU可能无法及时运行。
    • 影响调度器的公平性,主机调度器试图保持公平,但不知道任务的优先级需求。
  4. 导致的问题
    • 这可能导致延迟、功耗、资源利用等问题。

概念

  1. 基于共享调度信息的高效任务调度决策:客机和主机之间共享调度信息,以便做出更有效的任务调度决策。
  2. 通过共享内存共享信息:客机和主机之间通过共享内存来共享信息。
  3. 内核中通过通用框架以共享内存的方式和客主机协商:在内核中有一个通用框架,用于共享内存和进行客主机之间的协商。
  4. 调度策略可以作为客机和主机上的内核模块或bpf程序:调度策略可以在客机和主机上实施为内核模块或bpf程序。

框架

image-20240923135420797

半虚拟化调度框架通过在主机用户态运行的 pvsched-device 进程 和内核中的 BPF 程序 协同工作,管理虚拟机的虚拟 CPU (vCPU) 调度。VMM 负责控制虚拟机的生命周期和 vCPU 线程,而 pvsched 驱动/BPF 程序 负责在客户机和主机之间传递调度信息,优化虚拟机的性能。整个系统通过 KVM 模块与主机的调度器紧密集成,确保虚拟 CPU 能高效利用物理 CPU 资源。

host pvsched device(半虚拟化调度设备)

  1. 与虚拟机客户机进行握手,通过暴露一个 PCI 设备给客户机来实现。客户机可以通过可写的 BAR(Base Address Register)访问该设备,写入共享内存区域的基址。

  2. 该设计未来可以扩展,以支持功能和策略协商,使调度更加灵活和高效。

  3. 该原型在crosvm中实现(Crosvm是Chromebook用rust编写的虚拟机管理器)(相关链接:https://aya-rs.dev/)

  4. Pvsched设备作为一个单独的沙箱进程运行。

  5. 它接收来自客户的共享内存GPA(客户机物理地址),并将其转换为进程地址空间中的主机虚拟地址。

  6. 它加载实现策略的内核模块或eBPF程序,并传递详细信息(如vCPU ID、PID、共享内存地址等)。

    • 内核模块通过ioctl传递信息。

    • eBPF程序使用BPF_MAP_TYPE_HASH(通过vCPU PID索引)。

guest pvsched driver(半虚拟化调度驱动)

  1. 驱动绑定到设备
  2. 分配一页共享内存。
    • 包含每个vCPU的结构数组。
  3. 将共享内存的GPA写入设备暴露的BAR(基地址寄存器)。
  4. 原型在pvsched驱动中内置了共享内存更新逻辑。
  5. 这可以分离出来并作为另一个内核模块或BPF程序实现。
    • 适用于专业化用例。

注册到调度器和内核关键部分跟踪点

  • sched_switchsched_wake
  • {nmi/irq/softirq}_{entry/exit}preempt_{disable/enable}
  • exit_to_user

在跟踪点回调时更新共享内存

  • 在内核关键部分,设置共享内存中的标志。
  • 用被唤醒/切换的进程的优先级(策略、nice、rt_prio)更新共享内存。

调度策略

  1. 功能

    • 可以作为内核模块或eBPF程序实现。

    • 从VMM中检索VM和vcpu的详细信息(如nr_vcpus, vcpu_id, vcpu_pid等)。

    • 注册VM事件回调(如VMENTER, VMEXIT, VCPU_HALT, INJ_INTR等)。

    • 在接收到回调时执行调度策略。

  2. 需求

    • 策略可以根据使用案例和需求进行自定义实现。
    • 使用简单的策略来最小化延迟:
      • 提升guest任务中对延迟敏感的工作负载的vcpu优先级。
      • 将Linux调度参数从guest任务一对一地转换为主机中的vcpu任务。
      • 对行为不端的vcpu实施vcpu节流。

延迟缓解策略

VMEXIT
  • 功能:从虚拟机(VM)获取请求的调度参数。
  • 检查:根据vCPU被提升的时间长度,检查是否需要对其进行限制(throttle)。
  • 检查:根据vCPU被限制的时间长度,检查是否需要解除限制(unthrottle)。
  • 优先级限制:根据管理员设置的限制,限制调度优先级。
  • 应用优先级:如果虚拟机未被限制,则应用调度优先级(sched_setattr)。
VMENTER
  • 功能:进行提升和限制的计时核算。
VCPU_HALT
  • 功能:提升vCPU线程:将要被调度出,并且只有在响应延迟敏感事件(如中断)时才会被唤醒。
  • 描述:客户机在完成优先级工作负载后会请求解除提升。
Interrupt Injection
  • 功能:提升vCPU线程。

实现细节

image-20240923141833017

虚拟化环境中调度策略的实施过程,具体包括以下几个部分:

  1. pvsched设备
    • BAR(Base Address Register):这是与pvsched设备进行通信的基地址寄存器。
    • Bpf maps:用于BPF(Berkeley Packet Filter)程序与硬件设备之间的数据映射。
  2. 宿主机内核
    • Bpf maps:宿主机内核中也定义了BPF映射,用于与访客内核和pvsched设备进行数据交换。
    • Bpf Program (pvsched policy):这是基于BPF的调度策略程序,定义了具体的调度策略。
  3. 客户机内核
    • pvsched driver:这是运行在访客内核中的调度驱动程序,负责与pvsched设备和宿主机内核进行通信。
    • SHM GPA(Shared Memory Guest Physical Address):共享内存的客户机物理地址。
    • Trace callback handlers:跟踪回调处理程序,用于处理各种跟踪事件。
    • vcpu 0, vcpu 1, vcpu 2:代表虚拟CPU实例,每个实例都有独立的调度策略和运行环境。
  4. KVM(Kernel-based Virtual Machine)
    • TRACE事件:包括TRACE_VMEXIT、TRACE_VMENTER、TRACE_VCPU_HALT、TRACE_INJ_INTR等,用于跟踪虚拟机的行为和状态。
  5. 共享内存
    • 作为宿主机内核、访客内核和pvsched设备之间的桥梁,共享内存用于传递调度信息、追踪事件和数据映射。

共享内存

image-20240923143628488

image-20240923143641197

image-20240923143755883

image-20240923143804543

image-20240923143935471

bpf程序

使用bpf hash map存储vcpu信息:

image-20240923144023295

对vcpu的操作:

image-20240923144211639

image-20240923163106622

image-20240923144330328

bpf程序和共享内存

  1. 理想情况:虚拟机管理器(VMM)应该能够与eBPF程序共享共享内存的虚拟地址。
  2. 现实限制:由于eBPF的安全约束,这种共享并不容易实现。
  3. 替代方案
    • bpf_probe_{read/write}_user:可以在非进程上下文中发生跟踪点回调。
    • bpf_probe_read_kernel:将进程虚拟地址空间映射到内核地址空间,但不支持写入内核地址。
    • kptr:是否支持写入支持?
    • BPF_MAP_TYPE_TASK_STORAGE:通过任务本地存储共享用户内存。https://lore.kernel.org/bpf/20240816191213.35573-4-thinker.li@gmail.com/T/
实现
  • 修改task_struct结构体以包含内核地址和页面。
  • 使用sched_setscheduler来设置这些字段。
  • VMM调用set_scheduler为vCPU任务设置调度器。
  • 使用BPF kfunc进行设置和获取
struct task_struct {…void *pvsched_shm_addr;struct page *pvsched_shm_page;…
};

image-20240923145546790

ebpf和调度器

需要调度器修改调度参数

image-20240923145734505

image-20240923145746869

可调参数

  • 通过BPF地图和VMM(虚拟机管理程序)来调整的。
    • 当客户机处于内核关键区或主机正在注入中断时,vcpu任务的调度优先级。
    • vcpu任务在被限制之前的最大提升时间。
    • 限制持续时间。
    • 调试级别。

ebpf限制

  • 跟踪点无法使用计时器和自旋锁
  • 共享内存访问问题
  • 需要调度程序kfunc/帮助函数

性能测试

快速综合测试

cyclictest --mlockall -q -p 8 --policy=rr
  • 观察延迟对客户机的影响
  • 观察是否对主机有任何影响

在空闲主机和繁忙主机上进行测试

使用stress-ng模拟繁忙主机

stress-ng --cpu 2 --iomix 1 --vm 1 --vm-bytes 128M --fork 1

空闲主机:

image-20240923150943224

繁忙主机:

image-20240923151005770

未来展望

  • 上游合作以获取eBPF支持:如kfunc/helpers用于调度器集成。

  • 上游合作以获取共享内存访问支持:

    • 是否需要一种新的map直接在客户机和主机之间共享数据?
  • 自旋锁和定时器支持:

    • 使用bpf结构操作而不是跟踪点?
  • 可定制性:

    • 泛化共享内存区域(union vcpu_sched)以支持更多用例。
    • 协议、版本等。
  • 客户机侧的BPF?

    • 客户机中的调度扩展?
  • 使用调度事件而不是kvm事件:

    • 为了减少延迟,我们只关心vCPU被抢占以及vCPU在被唤醒后尽快获得CPU。
    • 因此,为什么不使用sched_switch和sched_wakeup,而是VMEXIT/VMENTER?
  • 仍然需要hook中断注入路径:

    • 在中断注入和VMENTER之间,vCPU可能会被调度出去,如果没有提升vCPU时间。
    • 修改kvm_vcpu_kick()以提示调度器关于唤醒的原因——中断、IPI等。

结论

  • 提供了一个通用的框架,帮助实现自定义策略,可以作为内核模块或BPF程序来实现
  • 几乎完全消除了对KVM/虚拟机管理程序的依赖
    • 主要是增加了跟踪点
  • 内核中的更改最小
    • 主要是跟踪点的增加

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148492.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【经验分享】电商api接口——各类商品数据一键获取

目前,双十一促销活动正在火爆预热进行中。大促期间,消费者常常会做攻略以防被坑,而活动期间,品牌商家方也需要有所行动,避免一些不必要的损失。 大促期间,商家前前后后的改价活动往往比较频繁,…

APP自动化中 ADB Monkey用法

一、monkey是干什么的? 我们可以使用monkey做手机端性能的压力测试,稳定性测试 二、monkey在使用的时候,他的运行特性 monkey默认配置下执行,会在手机中随机的点击或者轻触我们的手机中应用,不过这个时候&#xff0…

音频3A——初步了解音频3A

文章目录 前言一、3A使用的场景和原理1.AEC2.AGC3.ANS/ANR4.硬件3A和软件3A的区别1)层级不同2)处理顺序不同3)优缺点 5.处理过程 二、3A带来的问题三、开源3A算法总结 前言 在日常的音视频通话过程中,说话的双端往往会面对比较复…

2. 程序结构

在本章中,我们将开始做一些真正称得上编程的事情。我们将扩展对 JavaScript 语言的掌握,不再局限于目前所见的名词和句子片段,而是能够表达有意义的散文。 表达式和语句 在第 1 章中,我们创建了值,并应用运算符来获取…

CSS的背景属性

background-colcor属性 设置背景颜色 width: 200px;height: 200px;background-color: aqua; background-image属性 设置元素的背景图像 元素的背景是元素的总大小,包括填充和边界(不包括外边距)默认情况下background-image属性放置在元素的…

Seata学习笔记

目录 Seata的三大角色 角色 相关流程 相关事务模式 AT 模式(默认模式) 概述 整体机制 分析 XA 模式 概述 机制 分析 TCC 模式 概述 机制 分析 SAGA 模式 概述 机制 分析 参考: Seata的三大角色 角色 TC (Transaction Co…

STC89C52定时器与中断 详细介绍 0基础入门

STC89C52定时器与中断 前言定时器/计数器定时器/计数器 功能选择定时器/计数器 模式选择使用寄存器进行功能选择与模式选择 中断使用寄存器进行中断配置中断执行操作 总结完整程序 前言 对于定时器与中断,这是两个完全不同的概念,在单片机中它们也对应着…

C++的哲学思想

C的哲学思想 文章目录 C的哲学思想💡前言💡C的哲学思想☁️C底层不应该基于任何其他语言(汇编语言除外)☁️只为使用的东西付费(不需要为没有使用到的语言特性付费)☁️以低成本提供高级抽象(更…

WebAssembly进阶,vue3 使用 WebAssembly,及 WebAssembly vs JavaScript 的性能对比

目录 核心使用步骤 .c文件.cpp文件编译 使用 Emscripten 转译文件 页面中引入.wasm文件中的函数 WebAssembly vs JavaScript 的性能对比 性能对比关键点: 具体场景 实际案例分析 如果对WebAssembly不熟悉可以前往:WebAssembly最详教程,进行WebAssembly基础学习 Web…

【有啥问啥】Stackelberg博弈方法:概念、原理及其在AI中的应用

Stackelberg博弈方法:概念、原理及其在AI中的应用 1. 什么是Stackelberg博弈? Stackelberg博弈(Stackelberg Competition)是一种不对称的领导者-追随者(Leader-Follower)博弈模型,由德国经济学…

【LVIO-SLAM】 激光slam理论与实践

【LVIO-SLAM】 激光slam理论与实践 1. 激光slam理论与实践1.1 2D激光SLAM1.2 3D激光SLAM 2. 激光雷达运动畸变去除2.1 Lidar数学模型与点云去畸变2.2 运动畸变 3. 激光slam的前端配准3.1 帧间匹配3.2 3.2 ICP (Iterative Closest Point)3.3 PI-ICP (Point-to-Line Iterative Cl…

ubuntu22 解决docker无法下载镜像问题

参考在 Ubuntu 中安装 Docker_ubuntu安装docker-CSDN博客 安装docker完成后,运行如下命令验证 Docker 服务是否在运行: systemctl status docker 运行(sudo docker run hello-world)例子报错: 问题:Docker…

Vue 内存泄漏分析:如何避免开发过程中导致的内存泄漏问题

一. 引言 Vue 作为一款流行的前端框架,已经在许多项目中得到广泛应用。然而,随着我们在 Vue 中构建更大规模的应用程序,我们可能会遇到一个严重的问题,那就是内存泄漏。内存泄漏是指应用程序在使用内存资源时未正确释放&#xff…

iPhone 16 还剩一个月,微软开源新技术让手机以 6 倍速度提前跑上大模型

作者 | 微软亚洲研究院 责编 | 王启隆 出品 | AI 科技大本营(ID:rgznai100) 随着人工智能技术的飞速发展,将大语言模型(LLMs)部署到边缘设备上已成为当前 AI 领域的一个热门趋势。这一趋势不仅体现在微软 Windows 11 AI PC 等产品…

【Qualcomm】高通SNPE框架简介、下载与使用

说明:基础内容!不建议订阅!不建议订阅!不建议订阅! 目录 一 高通SNPE框架 1 SNPE简介 2 QNN与SNPE 3 Capabilities 4 工作流程 二 SNPE的安装与使用 1 下载 2 Setup 3 SNPE的使用概述 一 高通SNPE框架 1 SNP…

Axure精选各类组件案例集锦:设计灵感与实战技巧

在设计大屏页面时,设计师们面临着如何构建丰富、直观且用户友好的界面的挑战。幸运的是,Axure等强大的原型设计工具提供了丰富的可视化组件库,为设计师们提供了无限的设计灵感和实战技巧。本文将通过精选的各类组件案例,探讨大屏设…

综合题第二题(路由器的配置)

题目 如何计算子网掩码 我们可以观察到上图的IP地址后面有“/26”、“30”。我们都知道子网掩码是由多个连续“1”和多个连续“0”组成的,“、26”表示子网掩码的二进制表达中有26个1。 例如:156.95.9.128/26 1111 1111.1111 1111.1111 1111.1100 0000…

摒弃“流量思维”,以精准流量驱动企业发展——基于开源 AI 智能名片、链动 2+1 模式及 O2O 商城小程序的思考

摘要:本文深入探讨在当前竞争激烈的营销环境下,摒弃“流量思维”的紧迫性与必要性。强调做内容营销不能仅仅局限于发文案,而应摆脱一味追求阅读量、推荐量和粉丝数的误区,聚焦于获取精准流量。结合开源 AI 智能名片、链动 21 模式…

??实验——完全使用Ansible部署多台服务器的服务

文章目录 需求两台Web服务器部署同一Web应用WeCenter,且两台服务器的用户上传的数据目录挂载到共享存储服务器中,总数据保存在一台数据库服务器中使用sersync简单实现两台共享存储服务器之间的Web应用共享数据目录的数据同步每天定时将两台Web服务器的We…

中国中车在线测评考的啥?大易题库如何通过|附真题型国企题库通关秘籍和攻略

言语理解题目:这类题目主要考察你的语言理解和表达能力,例如,给你一个段落,让你根据段落内容选择最合适的答案。要点是快速捕捉文段中的关键信息,理解作者的意图和观点 逻辑推理题目:这类题目需要你从一组…