daytona创建snapshot: Failed to get initial runner: Error: No available runners

错误日志分析

错误信息

json 复制代码
{
  "level": 40,           // WARN 级别(非致命错误)
  "context": "SnapshotManager",
  "msg": "Failed to get initial runner: Error: No available runners"
}

这条日志每 10 秒重复一次 ,来自 SnapshotManager 的定时同步任务。


根本原因

问题出在 availabilityScore 阈值不满足。

数据库中有一条 pending 状态的 snapshot 需要分配初始 runner:

snapshot name state sandboxClass initialRunnerId
0e5a7b23... sandbox-extra:0.6 pending container (空,未分配)

SnapshotManager 在 handleSnapshotStatePending() 中尝试为这条 snapshot 分配 runner,代码逻辑如下(snapshot.manager.ts:1210-1216):

typescript 复制代码
const availabilityThreshold =
  this.configService.getOrThrow('runnerScore.thresholds.availability') +    // 默认 10
  this.configService.getOrThrow('runnerScore.thresholds.initialRunnerScoreAddon')  // 默认 20

initialRunner = await this.runnerService.getRandomAvailableRunner({
  regions: ['us'],
  sandboxClass: 'container',
  availabilityScoreThreshold: availabilityThreshold,  // = 10 + 20 = 30
  ...
})

而数据库中唯一的 runner:

name state region sandboxClass availabilityScore
default ready us container 5

findAvailableRunners() 中的过滤条件要求:

typescript 复制代码
availabilityScore: MoreThanOrEqual(availabilityThreshold)  // 要求 >= 30

runner 的 availabilityScore = 5,远低于阈值 30 ,所以被过滤掉,返回空数组,抛出 No available runners。


原因总结

ini 复制代码
┌─────────────────────────────────────────────────────┐
│  Snapshot (pending) 需要初始 runner                  │
│  要求: availabilityScore >= 30                       │
│  (availability阈值10 + initialRunnerScoreAddon 20)   │
│                                                     │
│  唯一 Runner: availabilityScore = 5  ❌ 不满足       │
│                                                     │
│  结果: "No available runners" → 每10秒重试           │
└─────────────────────────────────────────────────────┘

availabilityScore 是一个动态计算的负载评分(基于 CPU/内存/磁盘使用率等),分数越低表示 runner 越空闲。但 initialRunnerScoreAddon 额外加了 20 分的门槛,目的是确保 snapshot 构建只分配到负载很低的 runner。


可能的解决方案

方案 1:降低阈值(推荐,适合开发环境)

在 docker-compose.yaml 中为 API 容器添加环境变量:

yaml 复制代码
environment:
  - RUNNER_INITIAL_RUNNER_SCORE_ADDON=0    # 取消额外门槛(默认20)
  # 或
  - RUNNER_AVAILABILITY_SCORE_THRESHOLD=0  # 直接降低基础门槛

方案 2:手动更新 runner 的 availabilityScore

sql 复制代码
UPDATE runner SET "availabilityScore" = 100 WHERE name = 'default';

注意:这个值会被 runner 定期上报覆盖,仅临时有效。

方案 3:删除卡住的 pending snapshot(如果不需要)

sql 复制代码
DELETE FROM snapshot_region WHERE "snapshotId" = '0e5a7b23-82dd-4fba-abfb-890dcfe754f6';
DELETE FROM snapshot WHERE id = '0e5a7b23-82dd-4fba-abfb-890dcfe754f6';

方案 4:检查 runner 上报机制

availabilityScore=5 说明 runner 上报的分数很低。可以检查 runner 容器日志确认它是否正确上报资源信息:

bash 复制代码
docker logs daytona-runner-1 --tail 50
相关推荐
艺杯羹4 分钟前
告别大模型滥用与延迟失控:确定性优先法则与本地规则引擎实战
前端·人工智能·系统架构
智联视频超融合平台4 分钟前
机器狗进火场、无人机爬上 50 层楼:应急现场的“眼睛“正在换班
人工智能·无人机·视频监控·视频联网·应急管理
阿里云大数据AI技术7 分钟前
阿里云Flink + Fluss年度发布:Streaming Agent 与湖流一体
人工智能·flink·agent
萨小耶8 分钟前
AI 面试答题链路源码分析:Redis 幂等、题目锁与状态机如何配合
人工智能·redis·面试
Java后端的Ai之路15 分钟前
【AIAgent项目-AI生成PPT-09】灵活排版
前端·vue.js·人工智能·python·powerpoint
Mininglamp_271821 分钟前
Human-AI Co-Writing With Full Accept/Reject Control on Every Edit
人工智能
X54先生(人文科技)27 分钟前
ELR-SELLM_硅基伙伴通过对话碰撞个性涌现的推理架构_v10
人工智能·深度学习·架构·零知识证明
CV爱数码28 分钟前
论文精读|RED-CNN:残差编解码网络,低剂量 CT 去噪的经典基线
网络·人工智能·算法·cnn·ct·重建·x-ray
Sailing33 分钟前
【封闭结束3】ReAct 循环:从一次 Function Call 到多步 Agent
人工智能·面试·agent
AIyy86642 分钟前
AI任务在关机后继续运行的三种实现思路
人工智能