基于強化學習在云計算環境中的虛擬機資源調度研究
隨著云計算規模的持續擴大,數據中心虛擬機資源調度面臨動態負載、異構資源適配及多目標優化等挑戰。傳統啟發式算法在復雜場景下易陷入局部最優,而深度強化學習(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 補充
- 數據結構層面(代碼視角)
- Task(任務):由 TaskConfig 表示,對應數據集中的一條記錄(每行數據)。每個 TaskConfig 包含任務的基本信息(如 task_id、instances_num(任務實例數量)、cpu/memory/disk(資源需求)、duration(執行時長))。
- Job(作業):由 JobConfig 表示,是多個 TaskConfig 的集合。一個 JobConfig 包含:
- job_id(作業唯一標識)
- submit_time(作業提交時間)
- task_configs(該作業包含的所有 TaskConfig 列表)
- 業務邏輯層面(仿真視角)
- Task(任務):是作業的子單元,一個作業可包含多個任務(例如,一個作業可能需要先執行數據預處理任務,再執行模型訓練任務,每個任務是作業的一個步驟)。
- Job(作業):是用戶提交的完整計算需求,由多個具有邏輯關聯的任務組成(如 DAG 任務間的依賴關系,或 Non-DAG 任務的并行執行)。
- 實例化關系(運行時視角)
在仿真運行時:
- 每個 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.py | DAG(有依賴) | 單進程 | 總完成時間(makespan) | 處理DAG任務 |
性能評估指標
指標名稱 | 計算方式/含義 | 代碼實現位置 |
---|---|---|
總完成時間 | 所有任務完成的最大時間(仿真環境中最后一個任務實例的完成時間),即 episode.env.now | 基準測試中直接獲取:episode.env.now;訓練循環中通過 makespans 列表統計平均值 |
平均完成時間 | 單個任務從提交到完成的平均時長(所有任務實例的完成時間 - 提交時間的平均值) | 通過工具函數 average_completion(episode) 計算,訓練循環中統計 average_completions 平均值 |
平均延遲 | 任務完成時間與任務本身時長的平均值(反映任務執行的“拖延程度”) | 通過工具函數 average_slowdown(episode) 計算,訓練循環中統計 average_slowdowns 平均值 |
性能對比方法
- 基準算法對比(橫向對比)
通過運行 3 種經典啟發式算法(隨機算法、首次適應算法、Tetris 算法),在相同任務配置下收集上述指標,作為強化學習算法的性能基線。具體步驟如下:
- 相同輸入條件:使用同一組機器配置(machine_configs)和任務配置(jobs_configs);
- 獨立運行:分別運行每種基準算法的 episode.run(),記錄各指標;
- 輸出對比:直接打印各算法的指標結果
- 強化學習訓練迭代統計(縱向對比)
在強化學習訓練過程中,通過多進程并行收集多輪次的模擬數據,統計每輪迭代的平均指標,觀察算法性能隨訓練輪次的變化趨勢。具體邏輯如下:
- 多進程數據收集:每輪迭代啟動 n_episode 個子進程(默認 12 個),并行執行強化學習模擬,收集各回合的 makespans、average_completions、average_slowdowns;
- 指標統計:計算每輪迭代的平均指標(如 avg_makespan = np.mean(makespans)),并輸出對比:
- 趨勢觀察:通過多輪迭代的指標變化(如總完成時間是否逐漸降低),評估強化學習算法的優化效果。
- 總結:模型性能通過 總完成時間、平均完成時間、平均延遲 三個核心指標評價,對比方法包括:
- 與經典啟發式算法(隨機、首次適應、Tetris)的橫向對比;
- 強化學習訓練過程中多輪次的縱向性能趨勢對比。