跳到主要内容

实例生命周期

实例在任何时刻都恰好处于八种状态之一。它处于哪种状态决定了你关心的三件事:你能否连上它、它是否在向你计费,以及有哪些操作可用。

状态机

正常路径是 creatingrunningstoppingstoppedstartingrunning。拆除过程始终是 destroyingdestroyed,并且可以从 runningstoppederror 开始。

没有其他合法的迁移。请求当前状态不允许的操作——启动一个已经在运行的实例、停止一个还在创建中的实例——会被拒绝,实例保持原状。

每一种状态

状态过渡态计费含义
creating切片已经预留,你的工作负载正在首次启动。
starting已停止的实例正在同一台机器上、用同一块磁盘恢复。
runningGPU,按秒工作负载已就绪。SSH、JupyterLab 和你发布的端口都可以访问。
stopping容器正在关闭。你的磁盘会被保留。
stopped磁盘,按 GB 每小时没有任何东西在执行。磁盘和 GPU 槽位仍然为你占着。
destroying容器和磁盘正在被拆除。
destroyed终态。磁盘已经没了,报价回到市场。
error实例无法启动。见下文。

过渡态是平台正在主动推进的那四种状态;控制台会用脉动的徽章显示它们,并在推进期间更频繁地刷新。它们会自行结束——没有什么可点,也没有什么操作需要重试。

非过渡态是稳定的。实例会一直停在 runningstoppeddestroyederror,直到你或计费系统让它动起来。

每次迁移由什么引起

迁移触发条件
creating你执行部署:带上一份报价、一个模板和一个磁盘大小调用 POST /v1/instances
creating/startingrunning工作负载上报自己已就绪。GPU 计量从这里开始,而不是从部署时开始。
creating/startingerror工作负载无法启动。
runningstopping你停止了它,或者你的余额到了 $0。
stoppingstopped关闭已完成。磁盘计量从这里开始。
stoppedstarting你启动了它。要求余额为正。
running/stopped/errordestroying你销毁了它,或者你的余额到了 −$5。
destroyingdestroyed拆除已完成。磁盘被删除,报价被释放。

其中两个触发条件不是你发起的。当组织的余额归零时,运行中的实例会被自动停止;如果余额继续跌到 −$5,所有实例都会被销毁。两者都在 自动停止与自动销毁 中讲到。

部署和启动都要求余额大于零。停止和销毁则从不要求——无论余额是多少,你随时都能把东西关掉。

计费跟随状态

费用按实例实际所处状态的费率结算,而且每一次状态变化都会在生效之前先结清此前欠下的部分。GPU 计量只在 running 时运行。磁盘计量只在 stopped 时运行。四种过渡态、errordestroyed 都是免费的。

这就是为什么一次花两分钟才启动起来的部署不会为这两分钟计费,也是为什么已停止的实例仍然每分钟在你的账本里产生一条扣费。

“error”是什么意思

error 意味着平台无法把你的工作负载启动起来——镜像拉取失败、容器拒绝启动,或者主机在启动过程中停止上报。

由此有四个结论:

  • 不会向你计费。error 状态下计量是关闭的,实例停在那里不会累计任何费用。
  • 它不会自行恢复。 没有自动重试。实例会一直停在 error,直到你采取行动。
  • 报价仍被占着。 在实例到达 destroyed 之前,切片不会被释放回市场。
  • 销毁是唯一能做的操作。 你无法启动、停止或修复一个出错的实例。销毁它,排除原因,然后重新部署。

常见原因出在模板上而不是硬件上:一个不存在的镜像名或标签,或者一个凭据填错的私有镜像仓库。如果 sshjupyter 模板用的镜像不是基于 Superheat 基础镜像构建的,同样启动不起来,因为这两种模式依赖基础镜像的 entrypoint。

从未到达过 running 的实例没有日志可读,所以要从模板而不是从实例入手排查。故障排查 逐一讲了具体的失败情形。

出错的实例仍然占着你的报价

它不产生费用,但别人租不了那块切片,你也无法重新部署到它上面。销毁它,让切片回到市场。

你在哪里看到状态

实例 页面会列出除已销毁实例之外的一切。通过 API,GET /v1/instances?include_destroyed=true 可以把它们带回来。

每个实例页面会以徽章显示当前状态,只展示当前状态允许的操作——已停止的实例上是启动,运行中的实例上是停止,运行中、已停止或出错的实例上是销毁——并在工作负载就绪之后,在它的 连接 标签页显示连接信息。

相关内容