首页/AI/大模型部署与运维速查/滚动重启:先排空再动手
运维监控与排障50 条

滚动重启:先排空再动手

重启推理服务的安全顺序:从负载均衡摘除实例 → 等运行中请求清零(有界等待)→ 发 SIGTERM 优雅退出 → 重启 → 就绪后回流量;直接 kill 会把在途请求变成错误。

滚动重启先排空

重启推理服务的安全顺序是:先从负载均衡摘除实例,再等运行中的请求清零(有界等待),然后发终止信号让进程优雅退出,重启并确认就绪后再回流量。直接杀掉进程会把在途请求全部变成错误,用户侧体感最差。

基本信息

第一步从负载均衡摘除实例
第二步有界等待在途请求清零
第三步发终止信号优雅退出
第四步重启并就绪后回流量
关键顺序不能颠倒

典型使用场景

  • 发布新版本时的实例轮换
  • 参数调整需要重启才能生效
  • 节点维护前的服务迁移
  • 排查「重启后出现一批错误」的问题
  • 把重启步骤写成脚本,减少执行时的顺序错误

摘除与等待

摘除与等待
# 反向代理侧摘除(示意):注释目标实例后重载
# 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 <引擎进程号>

四个阶段与失败表现

阶段动作失败表现
摘除停止新流量漏摘导致请求打到已停实例
等待有界轮询在途数等待无上限会拖长窗口
退出发终止信号直接杀会丢在途请求
回流量就绪后恢复过早放量会吃到启动失败
有界等待要设上限:请求长时间不归零时按超时处理并记录,否则重启窗口会被无限拉长。
托管场景把停止超时设成覆盖在途请求处理时间的上限,给优雅退出留出足够时间。
摘除后要确认实例确实没有新流量:只看自己这一侧动过手还不够,要核对网关侧的上游列表是否真的生效。
批量轮换的批大小要按剩余容量定:一次摘得太多会超出剩余实例的承载能力,重启期间整体性能明显下降。
把排空等待的时间记进发布耗时:窗口规划需要它作为输入,临时估算很容易低估。

易错点

  • 先杀进程再摘流量:顺序反了,客户端会先吃到一批连接错误
  • 等待没有上限:个别长请求把重启窗口拖成几十分钟
  • 就绪判断只看进程存活:模型还没加载完就回流量,请求直接失败
  • 一次重启全部实例:容量瞬间归零,需要按批次轮换
  • 在流量高峰做轮换:剩余实例很快达到饱和,重启期间的整体劣化被放大

数据来源与参考

  • nginx 官方文档:upstream 模块与 reload 机制(nginx.org)
  • vLLM 官方文档:Production Metrics(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌