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
相关推荐
蓝速科技30 分钟前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
Web3&Basketball1 小时前
vLLM部署开源大模型实战:显存、命令与成本核算
人工智能·深度学习·大模型·ai技术·vllm
Dawson Zhu1 小时前
图结构(Graph)如何重构智能体认知?从DAG规划到GraphRAG的技术拆解
人工智能·语言模型·重构·架构·aigc
爱炼丹的James1 小时前
从技术名词堆积到知识图谱:如何建立自己的大模型技术体系
人工智能·llm·知识图谱
lancyu1 小时前
关于多轮对话机器人的上下文Token优化和解决方案
人工智能·python·深度学习·机器学习·chatgpt·机器人·prompt
xier_ran1 小时前
【infra之路】GPU 执行与存储层次全景关系图
人工智能·深度学习·cuda
奈斯先生Vector1 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
joinwell521 小时前
AI Agent 的技能不是工具权限:为什么“会怎么做”和“允许做什么”必须分开?
人工智能
IT_陈寒1 小时前
Vite动态导入差点让我秃头,原来问题出在这
前端·人工智能·后端
luckystar513~1 小时前
自己动手写Agent Harness【agent tools】:给它装手和眼睛(工具注册与执行流水线)
人工智能