当前位置: 首页 > ds >正文

20250704-基于强化学习在云计算环境中的虚拟机资源调度研究

基于强化学习在云计算环境中的虚拟机资源调度研究

随着云计算规模的持续扩大,数据中心虚拟机资源调度面临动态负载、异构资源适配及多目标优化等挑战。传统启发式算法在复杂场景下易陷入局部最优,而深度强化学习(DRL)凭借序贯决策能力为该问题提供了新路径。本研究以动态多目标组合优化理论为基础,结合CloudSimPy仿真框架与TensorFlow,构建“仿真-训练-验证”闭环调度系统,重点设计动态加权多目标奖励函数、时序建模网络及多进程并行训练策略,支持非DAG任务、长周期分块任务等复杂场景。实验表明,DRL算法在总完成时间(Makespan)、平均完成时间(AC)、平均延迟(AD)等指标上显著优于传统算法(如首次适应、Tetris),资源利用率提升5%以上,训练效率通过多进程优化缩短80%。研究为云计算智能运维提供了可迁移的模型与策略,推动DRL从理论验证向实际落地迈进。

关键字:云计算;虚拟机资源调度;深度强化学习;多目标优化;长周期任务;CloudSimPy;策略网络;动态环境适配

更多应用细节功能参考:CloudSimPy 开源项目使用教程-CSDN博客
本文实现与报告见绑定资源:基于强化学习在云计算环境中的虚拟机资源调度研究 Cloud_Computing.7z

Job数据集的字段含义说明

根据 CloudSimPy 框架中对作业(Job)、任务(Task)、任务实例(TaskInstance)的建模逻辑,以下是字段的含义:

字段名含义关联实体(参考 CloudSimPy 建模)
submit_time作业或任务的提交时间(仿真时间戳),表示该任务/作业被提交到集群的时刻。作业(Job)/任务(Task)
duration任务实例的执行持续时间(仿真时间单位),表示该任务实例需要运行多久才能完成。任务实例(TaskInstance)
cpu任务实例运行所需的 CPU 资源量(如核心数)。任务实例(TaskInstance)
memory任务实例运行所需的内存资源量(如 GB)。任务实例(TaskInstance)
job_id作业的全局唯一标识符,用于区分不同作业。作业(Job)
task_id任务的局部唯一标识符(需结合 job_id 唯一确定),表示作业中的具体任务。任务(Task)(属于某个 Job)
instances_num该任务包含的任务实例数量(即一个任务由多少个并行的 TaskInstance 组成)。任务(Task)(Task 是 TaskInstance 的集合)
disk任务实例运行所需的磁盘存储资源量(如 GB)。任务实例(TaskInstance)

补充说明

  • 数据集中的每条记录可能对应一个 任务(Task),其中 instances_num 表示该任务需要创建的任务实例数量,而 duration、cpu、memory、disk 是该任务下所有任务实例的统一资源需求(假设任务内实例资源需求相同)。
  • job_id 和 task_id 的组合可唯一标识一个任务,而任务通过 instances_num 生成多个任务实例(TaskInstance),最终由调度算法分配到集群机器上运行。

仿真逻辑补充

结合 CloudSimPy 的仿真流程(来自「高性能仿真」部分):

  • Broker 进程会 按照作业的提交时间(即 submit_time) 将作业配置列表中的作业提交至集群 Cluster 实例。
  • 作业提交后,需要等待调度器 Scheduler 根据调度算法分配资源(如机器的 CPU、内存等),才能开始运行。因此,作业的实际开始运行时间通常会晚于 submit_time(具体取决于调度算法的效率和集群资源的空闲状态)。

Job 和 Task 补充

  1. 数据结构层面(代码视角)
  • Task(任务):由 TaskConfig 表示,对应数据集中的一条记录(每行数据)。每个 TaskConfig 包含任务的基本信息(如 task_id、instances_num(任务实例数量)、cpu/memory/disk(资源需求)、duration(执行时长))。
  • Job(作业):由 JobConfig 表示,是多个 TaskConfig 的集合。一个 JobConfig 包含:
    • job_id(作业唯一标识)
    • submit_time(作业提交时间)
    • task_configs(该作业包含的所有 TaskConfig 列表)
  1. 业务逻辑层面(仿真视角)
  • Task(任务):是作业的子单元,一个作业可包含多个任务(例如,一个作业可能需要先执行数据预处理任务,再执行模型训练任务,每个任务是作业的一个步骤)。
  • Job(作业):是用户提交的完整计算需求,由多个具有逻辑关联的任务组成(如 DAG 任务间的依赖关系,或 Non-DAG 任务的并行执行)。
  1. 实例化关系(运行时视角)

在仿真运行时:

  • 每个 Task(任务)会根据 instances_num 生成多个 TaskInstance(任务实例),这些实例是实际占用资源(CPU、内存、磁盘)并运行的实体。
  • 每个 Job(作业)的状态(如“运行中”“完成”)由其所有 Task 的状态合成(例如,当作业的所有任务都完成时,作业才标记为完成)。

Jobs(作业)是用户提交的完整计算任务集合,由多个具有逻辑关联的 Tasks(任务) 组成;每个 Task(任务) 进一步拆分为多个 TaskInstance(任务实例)(实际运行的最小单元)

考虑任务类型(非DAG vs DAG)、并行方式(多进程 vs 单进程)、优化目标(总完成时间 vs 平均完成时间)、任务输入方式(单批 vs 分块长周期)、特殊功能(任务依赖 vs 任务分组)

文件名称任务类型并行方式优化目标特殊功能
main-makespan.py非DAG多进程总完成时间(makespan)基础非DAG任务调度
main-AC.py非DAG多进程平均完成时间适配平均完成时间的奖励函数
main-makespan-long.py非DAG(长周期)多进程总完成时间(makespan)分块处理大规模任务
main-single-process.pyDAG(有依赖)单进程总完成时间(makespan)处理DAG任务

性能评估指标

指标名称计算方式/含义代码实现位置
总完成时间所有任务完成的最大时间(仿真环境中最后一个任务实例的完成时间),即 episode.env.now基准测试中直接获取:episode.env.now;训练循环中通过 makespans 列表统计平均值
平均完成时间单个任务从提交到完成的平均时长(所有任务实例的完成时间 - 提交时间的平均值)通过工具函数 average_completion(episode) 计算,训练循环中统计 average_completions 平均值
平均延迟任务完成时间与任务本身时长的平均值(反映任务执行的“拖延程度”)通过工具函数 average_slowdown(episode) 计算,训练循环中统计 average_slowdowns 平均值

性能对比方法

  1. 基准算法对比(横向对比)

通过运行 3 种经典启发式算法(随机算法、首次适应算法、Tetris 算法),在相同任务配置下收集上述指标,作为强化学习算法的性能基线。具体步骤如下:

  • 相同输入条件:使用同一组机器配置(machine_configs)和任务配置(jobs_configs);
  • 独立运行:分别运行每种基准算法的 episode.run(),记录各指标;
  • 输出对比:直接打印各算法的指标结果
  1. 强化学习训练迭代统计(纵向对比)

在强化学习训练过程中,通过多进程并行收集多轮次的模拟数据,统计每轮迭代的平均指标,观察算法性能随训练轮次的变化趋势。具体逻辑如下:

  • 多进程数据收集:每轮迭代启动 n_episode 个子进程(默认 12 个),并行执行强化学习模拟,收集各回合的 makespans、average_completions、average_slowdowns;
  • 指标统计:计算每轮迭代的平均指标(如 avg_makespan = np.mean(makespans)),并输出对比:
  • 趋势观察:通过多轮迭代的指标变化(如总完成时间是否逐渐降低),评估强化学习算法的优化效果。
  1. 总结:模型性能通过 总完成时间、平均完成时间、平均延迟 三个核心指标评价,对比方法包括:
  • 与经典启发式算法(随机、首次适应、Tetris)的横向对比;
  • 强化学习训练过程中多轮次的纵向性能趋势对比。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

http://www.xdnf.cn/news/16203.html

相关文章:

  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_家庭维护示例(CalendarView01_31)
  • 性能测试-jmeter实战5
  • 【无标题】word 中的中文排序
  • 字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比
  • 腾讯云推出CodeBuddy:革新AI全栈开发体验
  • Xorg占用显卡内存问题和编译opencv GPU版本
  • docker安装minio及配置禁止列出目录文件
  • 时序数据库主流产品概览
  • 分布式电商系统:缓存策略、负载均衡与容灾方案
  • 一款基于 WPF 开源、功能全面的串口调试工具
  • YOLO12论文阅读:Attention-Centric Real-Time Object Detectors
  • Python关于pandas的基础知识
  • Springboot和postman的使用
  • torchvision.transforms 与 MONAI 数据增强的异同
  • 华为视觉算法面试30问全景精解
  • 网易视觉算法面试30问全景精解
  • C++ 模板库map数据结构的概念和使用案例
  • 板凳-------Mysql cookbook学习 (十二--------5)
  • 鸿蒙卡片开发保姆级教程
  • Java 线程池详解:从原理到实战,彻底掌握并发编程核心组件
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现水下鱼类识别(C#代码,UI界面版)
  • 【机器学习深度学习】微调量化与模型导出量化:区分与应用
  • 数字护网:一次深刻的企业安全体系灵魂演练
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes
  • Python机器学习:从零基础到项目实战
  • Netty中AbstractReferenceCountedByteBuf对AtomicIntegerFieldUpdater的使用
  • GRU模型
  • Linux操作系统之线程(六):线程互斥
  • SpringMVC快速入门之核心配置详解