
【集群】云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试

本系列《云原生批调度实战:Volcano 监控与性能测试》计划分为以下几篇,点击查看其它内容。
- 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf
- 云原生批调度实战:调度器测试与监控工具 kube-scheduling-perf 实操注意事项说明
- 云原生批调度实战:调度器测试监控结果
- 云原生批调度实战:本地环境测试结果与视频对比分析
- 监控与测试环境解析:测试流程拆解篇
- 监控与测试环境解析:指标采集与可视化篇
- 监控与测试环境解析:自定义镜像性能回归测试
- 监控与测试环境解析:数据收集方法深度解析与Prometheus Histogram误差问题
- 云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试
- 云原生批调度实战:Volcano Pod创建数量不足问题排查与Webhook超时修复
- 云原生批调度实战:Volcano版本修改与性能测试优化
- 云原生批调度实战:Volcano Webhook禁用与性能瓶颈分析
💡简介
在上一篇博客中,我们分析了本地环境下的调度器性能测试结果,发现了一些有趣的现象:在某些测试场景下,CREATED事件会出现阶段性突变,而SCHEDULED事件则相对平稳。这种现象可能与调度器的enqueue机制有关。
本文详细介绍了如何禁用Volcano调度器的enqueue功能,通过对比分析来验证我们的猜测:enqueue可能会提前判断资源是否充足,从而在资源不足时限制Pod的创建,进而影响调度性能。
通过禁用enqueue功能,我们可以观察调度器在资源分配阶段的纯粹性能表现,为调度器性能优化提供重要参考。
🧠Volcano调度器enqueue功能简介
什么是enqueue?
enqueue是Volcano调度器调度流程中的一个重要阶段,主要负责:
- 作业入队管理:将提交的Job添加到调度队列中
- 优先级排序:根据Job的优先级、提交时间等因素进行排序
- 资源预检查:提前判断集群资源是否满足Job需求
- 队列容量控制:管理队列的容量限制和准入控制
enqueue对调度性能的影响
基于前期测试结果的分析,我们猜测enqueue可能会:
- 提前资源判断:在Pod创建前就判断资源是否充足
- 限制Pod创建:当资源不足时,限制新Pod的创建速度
- 影响CREATED事件:导致CREATED事件出现阶段性突变
- 调度性能瓶颈:在某些场景下成为整体性能的瓶颈
Volcano调度器的完整调度流程
graph LR A[Job提交] --> B[enqueue] B --> C[allocate] C --> D[backfill] D --> E[reclaim] E --> F[preempt] B1[enqueue阶段] --> B2[队列管理] B1 --> B3[优先级排序] B1 --> B4[资源预检查] C1[allocate阶段] --> C2[资源分配] C1 --> C3[节点选择] C1 --> C4[Pod绑定]
🔧如何禁用Volcano的enqueue功能
1. 修改调度器配置文件
1.1 修改主配置文件
编辑 schedulers/volcano/scheduler.conf
文件:
1 | # 原始配置 |
1.2 修改测试配置文件
编辑 test/volcano/init.yaml
文件:
1 | # 原始配置 |
2. 重新部署Volcano调度器
修改配置后,需要重新部署调度器:
1 | # 重新构建和部署 |
🚀如何手动配置测试环境
1. 启动Volcano测试环境
1 | # 启动完整的Volcano测试环境 |
这个命令会依次执行:
make up-volcano
:创建Kind集群并部署Volcanomake wait-volcano
:等待所有服务就绪make test-init-volcano
:初始化测试环境,创建虚拟节点
2. 验证环境状态
2.1 检查集群状态
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get nodes -o wide |
应该看到:
volcano-control-plane
:控制平面节点node-0
、node-1
等:虚拟KWOK节点
2.2 检查Volcano服务状态
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get pods -n volcano-system |
确保所有Pod都处于Running状态。
2.3 检查虚拟节点标签
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get nodes --show-labels | grep node- |
确保虚拟节点有正确的标签:type=kwok
🔍如何验证enqueue是否被成功禁用
1. 检查ConfigMap配置
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl get configmap -n volcano-system volcano-scheduler-configmap -o yaml |
期望结果:
1 | data: |
关键点:配置中应该没有enqueue
,只有allocate, backfill, reclaim
。
2. 检查调度器启动日志
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl logs -n volcano-system deployment/volcano-scheduler --since=1h | grep "Successfully loaded" |
期望结果:
1 | Successfully loaded Scheduler conf, actions: [allocate backfill reclaim] |
关键点:日志中应该显示actions: [allocate backfill reclaim]
,没有enqueue。
3. 检查实时调度日志
1 | KUBECONFIG=./clusters/volcano/kubeconfig.yaml kubectl logs -n volcano-system deployment/volcano-scheduler -f | grep -E "(enqueue|allocate|backfill)" |
期望结果:应该只看到allocate
和backfill
相关的日志,没有enqueue
相关的日志。
🧪如何执行性能测试
1. 运行批处理作业测试
1 | # 使用小规模参数进行测试 |
参数说明:
QUEUES_SIZE=1
:创建1个队列JOBS_SIZE_PER_QUEUE=20
:每个队列20个JobPODS_SIZE_PER_JOB=500
:每个Job包含500个Pod- 总计:20个Job × 500个Pod = 10,000个Pod
2. 测试执行过程
测试程序会:
- 创建队列:
test-queue-long-term-research-0
- 创建Job:20个Volcano Job
- 创建Pod:每个Job创建500个Pod
- 执行调度:Volcano调度器分配资源
- 收集结果:记录CREATED和SCHEDULED事件
3. 监控测试进度
3.1 查看Job状态
1 | # 查看Volcano Job(注意:不是标准Kubernetes Job) |
3.2 查看Pod状态
1 | # 查看所有Pod |
3.3 查看调度器日志
1 | # 实时监控调度过程 |
📊如何验证测试是否正常执行
1. 检查测试结果
1.1 查看测试程序输出
测试完成后,应该看到类似输出:
1 | === RUN TestBatchJob |
1.2 检查Job和Pod状态
1 | # 检查Job状态 |
期望结果:
- 大部分Pod应该处于
Completed
状态 - 少量Pod可能处于
Running
或Pending
状态 - 没有Pod处于
Failed
状态
2. 验证调度行为
2.1 检查Pod调度位置
1 | # 查看Pod被调度到哪些节点 |
期望结果:Pod应该被调度到虚拟节点(如node-0
),而不是控制平面节点。
2.2 检查资源分配
1 | # 查看节点资源使用情况 |
3. 分析调度性能
3.1 对比enqueue启用/禁用的差异
启用enqueue时:
- CREATED事件可能出现阶段性突变
- SCHEDULED事件相对平稳
- 整体调度时间较长
禁用enqueue后:
- CREATED事件应该更加平稳
- SCHEDULED事件可能成为瓶颈
- 整体调度时间可能缩短
3.2 关键指标对比
指标 | 启用enqueue | 禁用enqueue | 差异分析 |
---|---|---|---|
CREATED事件曲线 | 阶段性突变 | 相对平稳 | enqueue的资源预检查影响 |
SCHEDULED事件曲线 | 相对平稳 | 可能成为瓶颈 | 直接进入资源分配阶段 |
整体调度时间 | 较长 | 可能较短 | 跳过队列管理阶段 |
资源利用率 | 较高 | 可能较低 | 缺乏资源预优化 |
🧹如何清理测试环境
1. 停止测试
如果测试还在运行,可以按Ctrl+C
停止。
2. 清理测试环境
1 | # 清理Volcano测试环境 |
这个命令会:
- 删除所有测试Pod和Job
- 销毁Kind集群
- 清理相关资源
3. 验证清理结果
1 | # 检查集群是否已销毁 |
- 希望这篇博客对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
- 如果你喜欢这篇文章,欢迎动动小手给我一个follow或star。
🗺参考文献
[1] Github - kube-scheduling-perf
[2] Volcano Documentation - Scheduler Configuration
- 标题: 【集群】云原生批调度实战:Volcano调度器enqueue功能禁用与性能测试
- 作者: Fre5h1nd
- 创建于 : 2025-08-17 23:06:07
- 更新于 : 2025-08-21 19:57:33
- 链接: https://freshwlnd.github.io/2025/08/17/k8s/k8s-scheduler-performance-volcano-enqueue/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。