滚动重启先排空
重启推理服务的安全顺序是:先从负载均衡摘除实例,再等运行中的请求清零(有界等待),然后发终止信号让进程优雅退出,重启并确认就绪后再回流量。直接杀掉进程会把在途请求全部变成错误,用户侧体感最差。
基本信息
| 第一步 | 从负载均衡摘除实例 |
|---|---|
| 第二步 | 有界等待在途请求清零 |
| 第三步 | 发终止信号优雅退出 |
| 第四步 | 重启并就绪后回流量 |
| 关键 | 顺序不能颠倒 |
典型使用场景
- 发布新版本时的实例轮换
- 参数调整需要重启才能生效
- 节点维护前的服务迁移
- 排查「重启后出现一批错误」的问题
- 把重启步骤写成脚本,减少执行时的顺序错误
摘除与等待
摘除与等待
# 反向代理侧摘除(示意):注释目标实例后重载
# upstream llm_backend {
# # server 127.0.0.1:8001;
# server 127.0.0.1:8002;
# }
# nginx -t && nginx -s reload
while :; do
running=$(curl -s http://127.0.0.1:8001/metrics | awk '/num_requests_running/ {print $2; exit}')
[ "${running%%.*}" -eq 0 ] && break
sleep 3
done
kill -TERM <引擎进程号>四个阶段与失败表现
| 阶段 | 动作 | 失败表现 |
|---|---|---|
| 摘除 | 停止新流量 | 漏摘导致请求打到已停实例 |
| 等待 | 有界轮询在途数 | 等待无上限会拖长窗口 |
| 退出 | 发终止信号 | 直接杀会丢在途请求 |
| 回流量 | 就绪后恢复 | 过早放量会吃到启动失败 |
有界等待要设上限:请求长时间不归零时按超时处理并记录,否则重启窗口会被无限拉长。
托管场景把停止超时设成覆盖在途请求处理时间的上限,给优雅退出留出足够时间。
摘除后要确认实例确实没有新流量:只看自己这一侧动过手还不够,要核对网关侧的上游列表是否真的生效。
批量轮换的批大小要按剩余容量定:一次摘得太多会超出剩余实例的承载能力,重启期间整体性能明显下降。
把排空等待的时间记进发布耗时:窗口规划需要它作为输入,临时估算很容易低估。