故障排查
症状、成因、修复
| 症状 | 成因 | 修复 |
|---|---|---|
SSH 报 Connection refused | 你用了端口 22,或者实例还没到 running | 从连接标签页复制命令;等到 running 标记出现 |
你启动的服务报 Connection refused | 该端口在启动时从未被发布 | 通过 SSH 转发,或者在模板上声明它并重新部署 |
Permission denied (publickey) | 部署时没有附加密钥,或者你的客户端提供了另一把密钥 | 附加密钥后重新部署;或者用 -i 和 IdentitiesOnly=yes 指向正确的密钥 |
REMOTE HOST IDENTIFICATION HAS CHANGED | 一对被回收的主机和端口现在属于一个新实例 | ssh-keygen -R "[host]:port",然后重新连接 |
实例一直停在 creating | 一个很大的镜像还在拉取 | 盯着日志标签页;如果它落到 error,就销毁并重新部署 |
实例处于 error | 工作负载启动失败 | 读日志,销毁它,重新部署——它既不能启动也不能停止 |
JupyterLab 返回 403 Forbidden | 请求没有带令牌,或者带的是过期的令牌 | 回到控制台,重新用打开 JupyterLab |
| 浏览器警告证书不受信任 | JupyterLab 用自签名证书提供 HTTPS 服务 | 属于预期情况;忽略警告继续 |
No space left on device | 你在部署时选的磁盘满了 | 清出空间,或者用更大的磁盘重新部署——磁盘无法调整容量 |
| 实例自己停了 | 组织的余额降到了 $0 | 充值余额,然后重新启动它 |
| 实例整个消失了 | 余额降到 −$5,实例被销毁了 | 磁盘已经没了;充值余额并重新部署 |
API 返回 409 INVALID_STATE | 实例正处于状态转换中 | 等过渡状态完成后重试 |
部署或启动时返回 402 INSUFFICIENT_BALANCE | 组织没有余额 | 由 admin 充值余额;member 不能 |
Connection refused
同一条消息背后是两个不同的问题。
如果是 SSH 本身,那你几乎肯定用错了端口。实例的 sshd 发布在启动时分配的某个主机端口上,绝不会是 22,而且这个号码在停止再启动之后可能改变。从连接标签页重新复制一遍命令。
如果是你在实例里启动的服务,那就是端口没有被发布。端口在实例启动时就固定了,所以之后再起服务器不会暴露任何东西。通过你已经建立的 SSH 会话把它转发出来:
ssh -N -L 8000:localhost:8000 -p 40123 root@sh-us-tx-01.ssh.superheat.dev
同时确认进程绑定的是 0.0.0.0 而不是 127.0.0.1。参见端口与打开按钮。
Permission denied (publickey)
密码认证已被禁用,所以这总是意味着你的客户端提供的密钥不是 authorized_keys 里的那一把。
ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes -p 40123 root@sh-us-tx-01.ssh.superheat.dev
如果还是失败,最可能的情况是这个实例根本没有密钥——部署页面上的 SSH 密钥选择器留在了不使用密钥。没有办法给运行中的实例附加密钥。在 SSH 密钥中添加密钥,然后重新部署。参见添加密钥。
卡在 creating
creating 通常远不到一分钟就能完成。拉长它的是镜像拉取:一个几 GB 的镜像落到从未见过它的主机上,该花多久就花多久。日志标签页会显示拉取那一行,然后是 image ready, creating container。
如果工作负载始终起不来,实例会自己转到 error。它不会永远停在 creating。
处于 error 的实例
error 意味着容器启动失败。原因只存在于日志里,所以在清理之前先把日志读了:
- 镜像或标签不存在,或者私有镜像的仓库凭据不对。
- 模板固定使用的镜像与启动模式不匹配。
ssh和jupyter模式需要基于 Superheat 基础镜像构建的镜像。 - 工作负载在平台的启动时间窗口内始终没有就绪。
onstart 执行失败不在这些成因之列。基础镜像会在子 shell 里运行它,把失败写到 /var/log/superheat/onstart.log,并让容器继续运行,这样你可以连上去修。
处于 error 时唯一可用的操作是销毁。修好模板,然后重新部署。参见查看日志。
JupyterLab 返回 403
notebook 服务器只接受一种凭据,就是平台在部署时生成的令牌。返回 403 意味着浏览器发过去的令牌不对,或者根本没发,而这通常说明这个标签页是从书签或复制来的地址打开的,而不是从控制台打开的。
回到控制台里的那个实例,按打开 JupyterLab。这个按钮会带上平台为该实例生成的令牌;手工拼出来的地址不会。参见打开 JupyterLab。
磁盘空间用尽
df -h /
du -sh /workspace/* | sort -h | tail
常见的元凶是堆积的检查点和包缓存:
rm -rf ~/.cache/pip ~/.cache/huggingface
磁盘无法扩容。如果任务确实需要更多空间,把现有的数据从实例上拷贝出来,销毁它,再用更大的 disk_gb 重新部署。参见磁盘与存储。
实例自己停止了
当组织的余额降到 $0 时,运行中的实例会被自动停止。什么都不会丢——磁盘保留下来,一旦有了余额实例就能重新启动。但实例停着的这段时间存储费仍然从已经空了的余额里扣,所以余额会继续往下掉。
如果余额降到 −$5,实例会被销毁,磁盘也一并消失。在计费页面查看余额和流水,并参见自动停止与自动销毁。
在 $0 和 −$5 之间,你的数据还在。越过 −$5 就没了,而且无法恢复。