余额与账本
Superheat 是预付费的。你给组织的余额充值,运行中的实例把这份余额扣下去。月底没有账单,也没有后付费——余额空了,任何新东西都启动不了。
余额
每个组织一份余额,组织里的所有人共用。成员可以查看它并用它花钱;只有管理员能给它充值。参见 组织。
余额只有一种到账方式:Stripe 结账。选一个 $10、$25 或 $100 的套餐,或者输入 $5 到 $1,000 之间的自定义金额。付款一确认,余额就到账,通常在你结完账之后几秒钟。
有两个操作需要的是足够的余量,而不只是余额大于零:部署新实例,以及启动一个已停止的实例。除非余额够支付这个实例运行时组织全部消耗一小时的费用——它的每小时 GPU 价格和磁盘,加上其他每个运行中、启动中或创建中实例的 GPU 和磁盘,以及每个已停止实例的磁盘——否则两者都会被拒绝。停止和销毁则始终允许。
什么会把它扣下去
| 费用 | 何时累计 | 费率 |
|---|---|---|
| GPU | 实例处于 running 期间 | 报价中整块切片的小时价格,按秒计量 |
| 磁盘 | 实例处于 stopped 期间 | 报价中的存储费率,按你挂载的磁盘每 GB 每小时计 |
这就是全部。花在创建、启动、停止或销毁上的时间是免费的,出错的实例是免费的,已销毁的实例不再产生任何费用。
磁盘那一行是最容易把人绊倒的。已停止的实例仍然在一台物理机器上占着一块磁盘,在你销毁实例之前,这份预留你一直得付钱。停止与销毁 值得完整读一遍。
结算大约每分钟跑一次。每一次结算都按实例实际所处状态的费率,对上次结算以来累计的部分收费,并把它加到该实例当前这个小时的账本记录上,所以一个长时间运行的实例每小时产生一条记录,而不是最后一次性的一笔。
账本
每一笔资金变动都是一条只追加记录里的一行。什么都不会被删除,更正就是再加一行。仍在变化的,是当前这个小时的扣费记录,它们标着进行中:每分钟的结算都会加到实例那一行未关闭的记录上,直到这个小时结束、实例改变状态,或者在它之后写入了一笔充值或调整;它之后各行扣费记录上显示的余额也会随之变动。完整的表格在 计费 页面上,位于余额和花费图表下方。
| 列 | 它记的是什么 |
|---|---|
| 日期 | 这条记录写入的时间,精确到秒 |
| 类型 | 额度充值、GPU 使用、存储或调整——对于带原因的调整,则显示原因,例如退款或客服调整 |
| 明细 | 这笔费用所属的实例,以及它覆盖的时长 |
| 金额 | 带符号:充值为正,扣费为负 |
| 余额 | 这条记录写入之后的即时余额 |
余额这一列是让这份记录可审计的关键。你在控制台任何地方看到的数字都是这些行的总和,所以如果某个数字看着不对,让它变得不对的那条记录就在这张表里。
扣费带着它来自哪个实例,每个实例的花费数字就是这么算出来的;明细 单元格可以跳到那个实例。充值不带实例。
实例自己的 计费 标签页是一份摘要,而不是账本的副本:到目前为止已结算的花费、运行时的每小时消耗速率,以及停止时的每小时消耗速率,并附有回到完整表格的链接。
用程序读取它
curl -s "$SUPERHEAT_API/v1/billing/transactions?limit=50" \
-H "Authorization: Bearer $SUPERHEAT_KEY"
这个接口用游标翻页,并接受一个 instance_id 过滤参数,用来拉取某一个实例的费用。limit 默认为 50,上限是 200。GET /v1/billing/spend-daily 只返回扣费,并按天汇总,这正是花费图表画的数据;它的 days 窗口默认为 30,上限是 90。
余额可以变成负数
结算是向后看的:它对已经用掉的时间收费。两次结算之间实例还在继续消耗,所以余额可能在任何机制作出反应之前就越过零。
这就是为什么有两道阈值而不是一道。到 $0 时,运行中的实例会被停止,已停止实例的 GPU 会在机器支持的情况下被释放——你的数据还在。如果余额随后在 $0 或以下持续 24 小时并跌到 −$5,已停止的实例会被销毁,磁盘也跟着一起没了。
如果你是别人组织里的成员,你无法充值。请盯着余额,一到 $0 就告诉管理员——远在它变负满 24 小时、跌到 −$5 之前——因为在那之后谁也拿不回那块磁盘。