Files
DCTS/docs/troubleshooting.md
T
fmq c8fd24b120 feat(all): 科学计算正确性修复、调度竞态消除、节点优雅退出、安全加固与收敛分析重构
科学计算正确性:
- 修复 Fortran 无-E 科学记数法(指数≥100 时 E 被挤掉,如 -1.35+118)导致
  发散行被静默跳过、误判收敛的 bug;扩展大气无效检测覆盖 Inf 与 *** 溢出标记
- 种子匹配改为 CNO 有向距离(富金属方向重罚 4×、贫金属方向轻罚 1×),
  基于 1191 个真实种子配对回测标定,回测净改善 314 个点
- GridAxisValue 反序列化拒绝非法文本(不再静默 NaN);chmax≤0 显式报错
- ions 行宽列宽对齐真实 fort.5 格式

调度与队列竞态:
- 原子选点(IMMEDIATE 事务 SELECT+UPDATE)消除并发调度重复派发 (#5)
- 调度互斥锁 + 冷启动优先策略(SeedStep 仅作失败后救援,不再正常路径热启动)
- 毒消息 dead_letter 标记防出队死循环;clear_queue 保留 claimed 行 (#6)
- 孤儿 running 点回收兜底;stale_sec 默认 7800→21600s(3 倍超时缓冲)

节点生命周期:
- SIGTERM+SIGINT 双信号监听(修复 Docker stop 发 SIGTERM 不触发优雅退出)
- SlotGuard RAII 防活动 slot 泄漏;子进程超时增加二级 30s wait 防 Fortran hang
- SeedStep 种子下载 fail-fast + 沙盒私有副本解耦 LRU 清理竞争
- reqwest Client 增加连接/请求超时;启动清理残留 task_* 沙盒

安全加固:
- 节点注册 registration_secret 二次凭据 (H8),恒定时间比对防时序旁路
- token 缓存 generation 机制消除 reissue 后旧 token TOCTOU 复活窗口
- 新增 /api/auth/logout 服务端 session 即时撤销;fail-closed 鉴权启动策略
- 前端 token 迁移 sessionStorage;YAML 高亮改 DOM API 消除 XSS 注入面
- 备份文件权限收紧 0600;点表动态值全面 escapeHtml

前端 Dashboard:
- 收敛性分析从热力图重构为 Parallel Sets 平行集合图(6 维+状态轴,手写 SVG 零依赖)
- 进度曲线横轴改为真实时间(服务端 now 锚定,停滞期诚实留白);轮询指数退避
- 移除 imported 收敛途径分类,导入点按实际途径 cold_run/seed_step 归类
- 初始化时 /api/auth/check 校验 token;401 toast 提示替代静默 reload

服务端恢复与工具链:
- 启动恢复 initializing 态工作流;默认工作流 INSERT-only 不覆盖 API 编辑
- body limit 分层(10MB 不再截断 256MB report);multipart 显式错误处理
- 嵌入二进制原子写(tmp+rename)防半写损坏
- import_results 判定收敛途径透传 success_method;conv.json 格式对齐本项目
- push_import_results.sh 退出码修复 + .bat UTF-8 BOM + scp 上传
- Docker USE_MIRRORS 默认关闭;移除无用 assets 挂载;删除 hosts.ini 入库
2026-08-01 17:01:40 +08:00

3.5 KiB
Raw Blame History

DCTS 故障排查与 FAQ (Troubleshooting & FAQs)

汇集 DCTS 计算过程中的常见故障、物理发散问题排查方法及节点恢复指南。


1. 物理计算发散排查 (TLUSTY Divergence)

现象 1nl 阶段出现 DIVD ... BIGNITER 达到上限发散

  • 原因:初猜大气与当前网格点的真实 NLTE 大气物理状态相差过大,线性化半径无法收敛。
  • 排查步骤
    1. 查看节点运行目录中的 fort.6conv.json
      cat results/<model_name>/conv.json
      
    2. 检查 coldfail 现场保存:冷启动失败后,系统会自动保存过程数据到 <model>.coldfail/
    3. 解决方案:确保 Master 的 results/ 目录下存有相近 T_{\text{eff}} / \log g 的已收敛 .7 大气文件。系统将在下次重试时自动触发 Seed-Stepping 种子步进算法。

现象 2lte 阶段报错或瞬间终止

  • 原因:输入的物理参数超出了灰色大气基本假设或基础原子数据(原子能级/光致电离截面)损坏缺失。
  • 排查步骤
    1. 验证 data/ 目录中的 ATO / ISO 数据文件是否齐全。
    2. 检查 gen_input5 生成的参数中 TEFF 是否小于 10000K 或大于 120000K。

2. 节点与网络故障 (Node & Network Issues)

现象 1Worker 节点提示 Unauthorized: Invalid or missing authentication token

  • 原因:该节点的专属 node token 已失效或被重发覆盖(节点鉴权不依赖任何环境变量,而是使用审批时下发的专属 token)。
  • 解决办法:删除节点本地 runtime/.node_token 文件并重启节点进程,使其重新免凭据提交注册申请,等待管理员在 Dashboard 审批授权后获取新 token。

现象 2:任务长时间处于 Running 状态没有进展

  • 原因:Worker 节点在计算中途遭遇断电、内存溢出(OOM)或僵死进程卡死。
  • 自动恢复:Master 服务端后台线程会在超过 DCTS_STALE_SEC(默认 21600 秒 / 6 小时,约为单任务超时的 3 倍缓冲)后自动将 claimed 态任务重置为 pending 放回队列。
  • 手动恢复:若需立即重置挂起任务,最稳妥的方式是重启 server(启动恢复逻辑会处理卡死态)。若必须直接操作队列库,注意队列表的正确列名与状态:
    -- task_queue 表的状态列是 status,领用列是 claimed_by_node_id(非 assigned_node);
    -- 领用中的任务是 status='claimed'(非 'running')。
    UPDATE task_queue SET status='pending', claimed_by_node_id=NULL
     WHERE status='claimed';
    

现象 3:网络抖动或后端滚动重配下提示 向服务端上报任务 ... 结果失败

  • 原因:在较长时效(如1-2小时)的运算完结回传一瞬间,Server 恰遇热更重启或遭遇防火墙短暂会话剔除。
  • 容灾机制:Worker 内置了超强的 8 轮指数级自适应退避长跳上报防护(跨度可自 1s 到 60s 顺次延迟,支撑 2 分钟以上的长时断裂耐受窗口);若由于连天硬件故障真正超出了总重试界限,亦可在本地非清理型数据栈(data/work/task_{uuid})的目录直接调出本套算法终极收敛物并执行手工打标还原。

3. 日志与现场诊断

日志控制通过 RUST_LOG 环境变量配置:

# 查看服务端调试级别日志
RUST_LOG=info,server=debug ./target/release/server

# 查看节点端详细网络与子进程调用日志
RUST_LOG=info,node=debug,common=trace ./target/release/node