add README
PathFinder 是一个面向人机物融合场景的轻量级融合调度系统。系统基于 Kubernetes 与 Knative Serving,在请求绑定到执行实例之前完成排序、等待、抢占和负载分发,用于缓解长短任务混布时的队头阻塞问题。PathFinder 的核心思路是在 Knative Activator 请求路径中引入有界等待队列、分布级执行时间预测和执行时间感知负载均衡,在不修改工作节点内核、不要求业务运行时支持抢占的前提下,使短任务能够在绑定阶段获得更高优先级,从而降低端到端尾延迟。
北京大学计算机学院
刘侯谦
Bounded preemptive scheduling and execution-time-aware load balancing for Knative Serving, targeting long-tailed serverless workloads, function chains, edge intelligence, embodied intelligence and industrial IoT scenarios.
本项目围绕一个核心问题:在云原生服务平台中,长任务先进入执行队列时,后到达的短任务会被迫等待,导致 P99 尾延迟升高、请求超时和资源利用率下降;能否在不破坏 Knative 原有部署模型的前提下,通过调度器内有界抢占和负载感知分发降低队头阻塞?
主要贡献包括:
系统架构图见 fig2-overview.pdf,P99 延迟实验结果见 p99lat.pdf。
fig2-overview.pdf
p99lat.pdf
PathFinder/ ├── modified-knative-file/ # Knative Serving Activator 相关修改文件 │ ├── handler.go # 请求接入、任务标注与 HTTP Header 元数据处理 │ ├── queue.go # 有界等待队列与 SchedulingUnit 管理 │ ├── heap.go # 队列/统计辅助数据结构 │ ├── shared.go # 全局状态、执行时间统计、Pod 负载状态 │ ├── real_world_support.go # 函数链长度、调用间隔、CDF 等真实负载支持 │ ├── lb_policy.go # round-robin、late binding、power-of-two 等策略 │ ├── throttler.go # 请求节流、绑定与负载分发路径 │ ├── main.go # Activator 服务入口与完成反馈逻辑 │ ├── activator.yaml # 修改后的 Activator 部署配置 │ └── activator-service.yaml # 反馈服务与 NodePort 相关配置 ├── slb-simplified/ # Serverless load balancing 简化实验负载 │ ├── alu/ # ALU CPU 密集型 microbenchmark │ │ ├── alu.py │ │ ├── locustfile.py │ │ ├── Dockerfile │ │ └── alu-service.yaml │ ├── real-world/ # 真实风格函数链 benchmark │ │ ├── workgen.py │ │ ├── function.c │ │ ├── run.sh │ │ ├── real-world-service.yaml │ │ └── CDFs/ # Azure/真实函数链相关 CDF 数据 │ └── enable-node-port.sh # 反馈服务 NodePort 辅助脚本 ├── spright-parking/ # Parking benchmark 与 Spright 相关实验代码 │ └── spright/ │ ├── cfg/parking.cfg │ ├── sigcomm-experiment/expt-3-parking/ │ └── ... ├── assets/ # 项目相关静态资源 ├── logs/ # 实验或运行日志目录 ├── 特性设计文档.md # 系统设计、核心模块、接口与异常处理说明 ├── 测试方案文档.md # 测试目标、环境、benchmark、trace、指标和结果 └── README.md
modified-knative-file/ 中的文件不是独立运行的完整 Knative 仓库,而是用于合并到 Knative Serving 对应源码位置后重新构建 Activator 镜像的核心修改文件。
modified-knative-file/
PathFinder 采用三层结构:
modified-knative-file/handler.go
modified-knative-file/queue.go
modified-knative-file/shared.go
modified-knative-file/heap.go
modified-knative-file/real_world_support.go
slb-simplified/real-world/CDFs/
modified-knative-file/main.go
modified-knative-file/lb_policy.go
modified-knative-file/throttler.go
modified-knative-file/activator-service.yaml
SchedulingUnit
每个请求进入队列时都会关联一个等待上限。队列管理协程周期性检查任务计时器,当任务等待时间归零时,该任务被取出并进入绑定流程。与 FIFO 队列不同,出队顺序不完全由到达顺序决定,而由等待时间和调度收益共同决定。长任务仍具有等待上界,避免短任务持续到达导致永久饥饿。
PathFinder 根据历史任务执行时间分布、请求到达强度和序列级尾延迟期望计算等待时间。等待时间过短时,短任务尚未到达,长任务仍可能造成队头阻塞;等待时间过长时,长任务自身延迟会增加。该策略用于在减少短任务阻塞和控制长任务额外等待之间取得平衡。
PathFinder 从当前可用 Pod 中随机选择两个候选,比较两个候选 Pod 的预计剩余执行时间,并选择负载更低的 Pod。该策略调度开销低,同时比纯随机、轮询或只看请求数量的策略更适合长短任务混布。
PathFinder 支持将一个外部请求拆分为多个子任务,并为每个子任务独立执行有界等待和负载分发。典型链路包括:
当前实现以顺序函数链为主;如需支持并行分支,可在任务接入层增加 DAG 拆分器,将依赖关系转换为多个带依赖状态的调度单元。
PathFinder 使用 HTTP Header 传递轻量调度元数据:
X-Rate
X-Arrive-Timestamp
X-Last-Rate
X-Seq-Start-Time
X-Rate 可以由任务类型映射表、历史统计分布、设备侧 hint 或调度器在线估计结果生成。
Activator 提供 POST /store 接口接收任务完成反馈。执行实例在任务结束后返回任务长度、响应时间、总延迟和 Pod IP 等信息,用于更新在途任务表和执行时间统计。
POST /store
pod_ip
rate
response_time
latency
sequence_latency
策略参数可通过 ConfigMap 或服务 annotation 暴露:
pathfinder.dev/scheduling-policy: bounded-preemptive pathfinder.dev/history-window: 10m pathfinder.dev/max-wait-ms: "100" pathfinder.dev/load-metric: expected-runtime
测试目标是验证 PathFinder 在长短任务混布、函数链调用和动态负载场景下的调度效果,重点关注:
实验环境采用 9 节点 Kubernetes 集群,基于 KinD 部署在单台高性能服务器上。1 个节点作为 Kubernetes control plane,其余 8 个节点作为 worker 节点。
复现实验软件版本:
测试使用三类执行时间分布:
a = 1.294789
m = 1571585
a = 0.416
54.37
请求到达采用泊松过程,覆盖 lambda = 10、12.5、15、17.5、20 requests/s。
lambda = 10
12.5
15
17.5
20
在 ALU microbenchmark、real-world function chain 和 parking benchmark 上,PathFinder 在 Azure、Zipf 和 Power-law 三类 trace 下均取得最低 P99 延迟。随着请求到达强度升高,所有策略的尾延迟都会上升,但 PathFinder 的上升幅度更低。
相对于 Early Binding,PathFinder 的 P99 延迟降低约 1.49x - 2.75x;相对于 Late Binding,PathFinder 的 P99 延迟降低约 2.10x - 4.10x。整体 P99 结果见 p99lat.pdf。
1.49x - 2.75x
2.10x - 4.10x
核心结论:
建议在 Ubuntu 22.04 LTS 上准备以下组件:
# 基础环境 Docker 24.0.7 Go 1.22.5 KinD v0.23.0 kubectl v1.30.x kn CLI v1.14.0 Istio v1.15.1 Knative Serving v1.15.2 Python 3.8 slim runtime
部署时需要将 modified-knative-file/ 中的相关文件合并到 Knative Serving 对应源码位置,重新构建并部署 Activator 镜像。核心步骤如下:
queue.go
shared.go
real_world_support.go
lb_policy.go
throttler.go
main.go
modified-knative-file/activator.yaml
slb-simplified/enable-node-port.sh
slb-simplified/alu/alu.py
slb-simplified/alu/locustfile.py
slb-simplified/alu/alu-service.yaml
slb-simplified/real-world/workgen.py
slb-simplified/real-world/run.sh
slb-simplified/real-world/real-world-service.yaml
spright-parking/spright/cfg/parking.cfg
spright-parking/spright/sigcomm-experiment/expt-3-parking/
MaxQueueize
/store
特性设计文档.md
测试方案文档.md
spright-parking/
slb-simplified/
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
项目简介
PathFinder 是一个面向人机物融合场景的轻量级融合调度系统。系统基于 Kubernetes 与 Knative Serving,在请求绑定到执行实例之前完成排序、等待、抢占和负载分发,用于缓解长短任务混布时的队头阻塞问题。PathFinder 的核心思路是在 Knative Activator 请求路径中引入有界等待队列、分布级执行时间预测和执行时间感知负载均衡,在不修改工作节点内核、不要求业务运行时支持抢占的前提下,使短任务能够在绑定阶段获得更高优先级,从而降低端到端尾延迟。
作者团队
北京大学计算机学院
队长
刘侯谦
PathFinder — 面向人机物融合场景的轻量级云原生调度系统
本项目围绕一个核心问题:在云原生服务平台中,长任务先进入执行队列时,后到达的短任务会被迫等待,导致 P99 尾延迟升高、请求超时和资源利用率下降;能否在不破坏 Knative 原有部署模型的前提下,通过调度器内有界抢占和负载感知分发降低队头阻塞?
主要贡献包括:
系统架构图见
fig2-overview.pdf,P99 延迟实验结果见p99lat.pdf。1. 仓库结构
2. 系统设计
2.1 三层架构
PathFinder 采用三层结构:
2.2 设计原则
2.3 核心模块
modified-knative-file/handler.gomodified-knative-file/queue.gomodified-knative-file/shared.go,modified-knative-file/heap.gomodified-knative-file/real_world_support.go,slb-simplified/real-world/CDFs/modified-knative-file/shared.go,modified-knative-file/main.gomodified-knative-file/lb_policy.go,modified-knative-file/throttler.gomodified-knative-file/main.go,modified-knative-file/activator-service.yaml2.4 调度流程
SchedulingUnit,进入有界等待队列。3. 关键算法
3.1 有界等待队列
每个请求进入队列时都会关联一个等待上限。队列管理协程周期性检查任务计时器,当任务等待时间归零时,该任务被取出并进入绑定流程。与 FIFO 队列不同,出队顺序不完全由到达顺序决定,而由等待时间和调度收益共同决定。长任务仍具有等待上界,避免短任务持续到达导致永久饥饿。
3.2 分布感知等待时间计算
PathFinder 根据历史任务执行时间分布、请求到达强度和序列级尾延迟期望计算等待时间。等待时间过短时,短任务尚未到达,长任务仍可能造成队头阻塞;等待时间过长时,长任务自身延迟会增加。该策略用于在减少短任务阻塞和控制长任务额外等待之间取得平衡。
3.3 执行时间感知 Power-of-Two 负载均衡
PathFinder 从当前可用 Pod 中随机选择两个候选,比较两个候选 Pod 的预计剩余执行时间,并选择负载更低的 Pod。该策略调度开销低,同时比纯随机、轮询或只看请求数量的策略更适合长短任务混布。
3.4 函数链和多阶段任务
PathFinder 支持将一个外部请求拆分为多个子任务,并为每个子任务独立执行有界等待和负载分发。典型链路包括:
当前实现以顺序函数链为主;如需支持并行分支,可在任务接入层增加 DAG 拆分器,将依赖关系转换为多个带依赖状态的调度单元。
4. 接口与配置
4.1 请求元数据 Header
PathFinder 使用 HTTP Header 传递轻量调度元数据:
X-RateX-Arrive-TimestampX-Last-RateX-Seq-Start-TimeX-Rate可以由任务类型映射表、历史统计分布、设备侧 hint 或调度器在线估计结果生成。4.2 任务完成反馈接口
Activator 提供
POST /store接口接收任务完成反馈。执行实例在任务结束后返回任务长度、响应时间、总延迟和 Pod IP 等信息,用于更新在途任务表和执行时间统计。pod_iprateresponse_timelatencysequence_latency4.3 策略配置示例
策略参数可通过 ConfigMap 或服务 annotation 暴露:
5. 测试与核心结果
5.1 测试目标
测试目标是验证 PathFinder 在长短任务混布、函数链调用和动态负载场景下的调度效果,重点关注:
5.2 测试环境
实验环境采用 9 节点 Kubernetes 集群,基于 KinD 部署在单台高性能服务器上。1 个节点作为 Kubernetes control plane,其余 8 个节点作为 worker 节点。
复现实验软件版本:
5.3 对比策略
5.4 Benchmark 与 Trace
测试使用三类执行时间分布:
a = 1.294789、m = 1571585。a = 0.416、scale54.37。请求到达采用泊松过程,覆盖
lambda = 10、12.5、15、17.5、20requests/s。5.5 指标
5.6 实验结果
在 ALU microbenchmark、real-world function chain 和 parking benchmark 上,PathFinder 在 Azure、Zipf 和 Power-law 三类 trace 下均取得最低 P99 延迟。随着请求到达强度升高,所有策略的尾延迟都会上升,但 PathFinder 的上升幅度更低。
相对于 Early Binding,PathFinder 的 P99 延迟降低约
1.49x - 2.75x;相对于 Late Binding,PathFinder 的 P99 延迟降低约2.10x - 4.10x。整体 P99 结果见p99lat.pdf。核心结论:
6. 部署与复现实验
6.1 环境准备
建议在 Ubuntu 22.04 LTS 上准备以下组件:
6.2 集成 PathFinder Activator
部署时需要将
modified-knative-file/中的相关文件合并到 Knative Serving 对应源码位置,重新构建并部署 Activator 镜像。核心步骤如下:modified-knative-file/handler.go、queue.go、shared.go、real_world_support.go、lb_policy.go、throttler.go、main.go等文件合入 Knative Serving Activator 对应位置。modified-knative-file/activator.yaml和modified-knative-file/activator-service.yaml部署修改后的 Activator 与反馈服务。slb-simplified/enable-node-port.sh暴露任务完成反馈入口。6.3 Benchmark 入口
slb-simplified/alu/alu.py,slb-simplified/alu/locustfile.py,slb-simplified/alu/alu-service.yamlslb-simplified/real-world/workgen.py,slb-simplified/real-world/run.sh,slb-simplified/real-world/real-world-service.yamlslb-simplified/real-world/CDFs/spright-parking/spright/cfg/parking.cfg,spright-parking/spright/sigcomm-experiment/expt-3-parking/6.4 测试流程
7. 异常处理与兼容性
7.1 异常处理
MaxQueueize控制;达到上限时可拒绝新请求或降级为直接绑定策略。7.2 兼容性
/store。8. 已知局限
/store反馈接口;反馈丢失会导致 Pod 预计剩余负载短期滞后。9. 文档索引
特性设计文档.md测试方案文档.mdfig2-overview.pdfp99lat.pdf10. License & 致谢
spright-parking/,请遵循其目录内许可证与使用说明。slb-simplified/,用于复现长短任务混布、真实风格函数链与多阶段调度实验。