现象
灰度把某模型 max_num_seqs 调低,配置中心改完却不生效。环境变量读进来是字符串 "32":一处把它当布尔值,非空字符串恒为真;另一处 int() 失败后走了默认 256。限流没加上,GPU 照样打满。
根因归类
Python 服务里配置漂移常见三种:
- 类型不纯:YAML/ENV 全是 str,靠运气转换
- 默认值吞异常:
try/except: return default把错误配置藏起来 - 多来源覆盖顺序不清:文件、环境变量、启动参数谁说了算
改法
用明确的 schema(Pydantic 等)在启动时一次校验,失败直接拒绝启动,比跑起来再默默用默认值安全。
from pydantic import BaseModel, Field
class ModelSpec(BaseModel):
alias: str
max_num_seqs: int = Field(gt=0, le=512)
max_model_len: int = Field(gt=0)
qpm: int = Field(gt=0)
class GatewayConfig(BaseModel):
models: dict[str, ModelSpec]
布尔值环境变量白名单解析:1/true/yes 才为真,其它非法直接报错,不接受「有这个变量就算开」。
发布时
配置变更和代码变更一样走 diff:打印「加载后的生效配置」(脱敏)到日志,灰度前后对一下。没有这行日志,只能靠猜。
转载请注明:周志洋的博客 » Python服务配置漂移:字符串配置把限流吞掉


