I2.10.1ETA jumps when rate shifts设计
剩余时间的估算基于历史速率外推,速率突变会导致估计大幅跳动
别名: 速率外推 ETA · 剩余时间乱跳 · rate extrapolation
概念解释
「还剩 1 分 20 秒」几乎从来不是预言,是用刚过去的速率去外推还没发生的工作。已完成量除以已耗时,得到一个速度,再去除以剩余量。速度若在下一秒变了——网速掉档、磁盘开始抖、服务器排队——同一公式会吐出另一个差很远的数字。跳动来自方法本身:外推假设速率平稳,加载的速率常常不平稳。
机制
外推是一条直线:过去的斜率延长到终点。短窗口的斜率很吵,瞬时速率一抖,终点左右甩。长窗口的斜率更稳,但对刚刚发生的换档反应迟钝,会在换档之后仍报旧世界的剩余。两者都不是「算错了」,是平稳假设被物理打穿:蜂窝网从 Wi-Fi 切走、压缩比突然变差、对端从闪存写到旋转盘、限速器介入。剩余时间对速率是除法,速率接近零时数字会炸向无限,再在速率回升时坠回几十秒,看起来像系统在撒谎,其实是除数在跳。
还有一个结构问题:工作不是同质的。前 80% 是传输,后 20% 是解压或校验,用传输速率去外推校验段,终点会在进入校验时突然变远。外推用错了线段。
边界
速率真正平稳的管道(本机总线、已协商好的固定带宽)上,外推可以安静,不必为了「可能跳」而拒绝给数字。刚开始的一两秒样本太少,外推没有历史,这一段不该出精确剩余,应等窗口里有足够完成量。用户自己暂停、切换网络,速率突变是人造成的,跳动反映的是新管道,不是算法抽风——但仍应平滑地改,而不是一帧从 8 秒跳到 8 分钟。单调进度禁止条回跳,剩余时间却会因速率下降而变长;变长不是倒退完成量,不要用禁倒退去禁剩余变长,否则只能撒谎说还是 8 秒。
怎么落地
- 用完成量对时间的平滑窗口(例如指数滑动)来算速率,不要用上一秒的瞬时字节数直接去除。
- 速率跌破阈值时不要让剩余爆炸成「999 小时」;改报阶段或改用区间,等窗口重新稳定。
- 分段工作按段外推:传输段用传输速率,进入处理段就换处理段的历史,不要用错线段。
- 验证:在 40% 处把带宽砍到十分之一再恢复。剩余数字若在一两秒内从分钟跳到小时再跳回秒,就是瞬时外推没被平滑。记下跳的幅度,作为窗口参数的验收,而不是当成文案问题。