雪崩Snowball效应请求量突然增大 → NPU 利用率 100% → 新请求排队 → 排队超过超时时间 → 客户端重试 → 请求量更大。这篇讲在昇腾NPU推理服务上怎么限流防止雪崩。限流层级客户端 ↓ LB 层限流SLB/QPS 限制 ↓ 推理服务层限流并发数/排队时间 ↓ NPU 层限流显存/利用率三层都要有限流任何一层失效都会导致雪崩。LB 层限流# Nginx 限流配置 http { limit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; server { location /generate { limit_req zoneapi burst20 nodelay; proxy_pass http://inference_backend; } } }rate10r/s每个 IP 每秒最多 10 个请求burst20允许突发 20 个请求排队nodelay突发请求不延迟立即处理或拒绝推理服务层限流策略 1并发数限流fromfastapiimportFastAPI,HTTPExceptionimportasyncio appFastAPI()semaphoreasyncio.Semaphore(32)# 最多 32 个并发请求app.post(/generate)asyncdefgenerate(prompt:str):ifsemaphore.locked():raiseHTTPException(status_code503,detailServer busy)asyncwithsemaphore:resultawaitmodel.generate(prompt)returnresult并发数 NPU 能同时处理的请求数。Atlas 800I A2 单卡约 32 个并发batch32。策略 2排队时间限流importtime request_queue[]app.post(/generate)asyncdefgenerate(prompt:str):request_idlen(request_queue)request_queue.append(time.time())# 排队超过 5 秒直接拒绝wait_timetime.time()-request_queue[request_id]ifwait_time5:raiseHTTPException(status_code503,detailQueue timeout)resultawaitmodel.generate(prompt)request_queue.pop(request_id)returnresult策略 3动态限流根据 NPU 利用率importtorch_npudefis_npu_overloaded():utiltorch_npu.npu.utilization(0)returnutil90# NPU 利用率 90% 时限流app.post(/generate)asyncdefgenerate(prompt:str):ifis_npu_overloaded():raiseHTTPException(status_code503,detailNPU overloaded)resultawaitmodel.generate(prompt)returnresultNPU 层限流策略 1KV Cache 余量检查defis_kv_cache_full():# 假设 KV Cache 最大 48GB已用 45GBreturnkv_cache_used45*1024*1024*1024app.post(/generate)asyncdefgenerate(prompt:str):ifis_kv_cache_full():raiseHTTPException(status_code503,detailKV Cache full)resultawaitmodel.generate(prompt)returnresult策略 2显存余量检查defis_memory_full():allocatedtorch_npu.memory_allocated(0)total64*1024*1024*1024# 64GBreturnallocated0.95*totalapp.post(/generate)asyncdefgenerate(prompt:str):ifis_memory_full():raiseHTTPException(status_code503,detailMemory full)resultawaitmodel.generate(prompt)returnresult优雅降级NPU 满载时降级到简化模型如 7B → 3Bmodels{full:LLM(llama2-7b,devicenpu:0),lite:LLM(llama2-3b,devicenpu:0),}defget_available_model():iftorch_npu.npu.utilization(0)80:returnmodels[lite]returnmodels[full]app.post(/generate)asyncdefgenerate(prompt:str):modelget_available_model()resultawaitmodel.generate(prompt)returnresult实战配置在线对话服务QPS100# Nginxlimit_req_zone:20r/s burst50# 推理服务max_concurrent:64# 2 张 NPU每张 32 并发max_queue_time:3s# 排队超过 3 秒拒绝kv_cache_threshold:90%# KV Cache 超过 90% 拒绝新请求# NPU 监控utilization_threshold:85%# 利用率 85% 触发告警memory_threshold:92%# 显存 92% 触发告警压测验证用wrk或locust压测# 100 并发持续 60 秒wrk-t10-c100-d60s http://localhost:8000/generate# 观察# - 99% 请求延迟 500ms# - 0% 请求超时# - NPU 利用率稳定在 80-90%不雪崩限流是推理服务的保险丝。LB 层限制单个 IP服务层限制并发数和排队时间NPU 层限制显存和 KV Cache。三层联动才能防止雪崩。仓库在这里https://atomgit.com/cann/ATB