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
相关推荐
字节跳动视频云技术团队2 小时前
火山引擎 × 央视网 打造 2026 世界杯沉浸式观赛盛宴
人工智能·音视频开发
IT_陈寒2 小时前
Java线程池这个坑我算是踩明白了
前端·人工智能·后端
创安达科技2 小时前
2026 市政太阳能警示设施采购,多维度设备性能评估参考
人工智能·太阳能道钉灯·创安达
isyangli_blog2 小时前
西钻—— 图影智绘创作课堂 (豆包、千问)
人工智能
影山飞雄2 小时前
Systematic-Debugging skill深度解析
人工智能
tyqtyq223 小时前
药品说明书解读 —— AI 安全用药助手,鸿蒙原生应用深度解析
人工智能·学习·华为·生活·harmonyos
feiyu_gao3 小时前
别再让 AI 从零开始了
人工智能·架构·aigc
AIOps打工人3 小时前
女朋友想要专属桌宠?我用 AI 提示词,1 小时把照片变成 57 帧动画精灵
人工智能
大囚长3 小时前
自由能原理视域下的游戏成瘾机制——以“羊了个羊”为例
人工智能·游戏