LLM 知识库(RAG)接口压测实录:为什么 20 并发就让接口崩掉

LLM 知识库(RAG)接口压测实录:为什么 20 并发就让接口崩掉

导读:这篇实录回答"RAG 知识库接口在并发下扛不扛得住":对"检索+生成"串行链路的知识库问答接口做 JMeter 阶梯压测,结论是 1 并发成功率 100%(平均响应 3.6s),到 20 并发时成功率跌到 87%、平均响应 47.8s、吞吐掉到约 1.4,接口基本崩掉。关键判断是瓶颈不在机器(显存/内存全程稳定),而在串行的检索与生成链路,并给出多线程调用、检索链路两个方向的优化建议。适合要压测 LLM/RAG 或知识库类接口的测试工程师与后端开发者阅读。

分类:性能测试 | 标签:LLM、RAG、压测

背景:业务要接 RAG,先问问接口扛不扛得住

做自建 LLM 知识库的团队大概都有这个经历:单条对话问起来体验还不错,可真要往业务上接的时候,心里没底——「并发一上来它到底行不行」?

这次就是这样一个场景。我们自建了一套基于检索增强生成(RAG)的知识库问答接口:用户提问后,服务端先在知识库中检索相关片段,再把片段连同问题一起交给大模型生成答案。在正式接入业务之前,我用 JMeter 对测试环境做了一轮接口压测,想看看它在并发之下的真实表现。

结论先说:20 并发的场景下,接口基本就崩掉了。这篇文章把这轮压测的过程和数据完整记录下来,给同样在压 RAG / 知识库类接口的同学一个参考。

被测对象:一条典型的 RAG 问答链路

  • 接口:知识库问答接口(通用路径 /v1/kb/chat),一次请求完成「检索 + 生成」全流程;
  • 参数:请求中指定所需的知识库(knowledge_base_name),并设置相似度阈值 score_threshold = 1(最严格档,只保留高置信命中);
  • 部署环境:内部测试环境服务器,内存 30G、显存 17.6G;
  • 施压与监控:本地机器运行 JMeter 施压,压测期间对被压机器做性能监控(取样约 1 分钟)。

这类接口和普通 HTTP 接口最大的不同在于:平均响应时间是"秒"级的,链路里既有向量检索(embedding 检索 + 重排),又有大模型自回归生成,任何一环变慢都会被放大。

压测设计:从 1 并发基准起步,阶梯加压

压测的目的是找到并发拐点,所以采用了阶梯式加压:

阶段 并发数 持续时长 说明
基准 1 VU 3 min 单用户基准,先摸清单请求基线
加压 10 VU 3 min 中等并发,观察吞吐与响应变化
加压 20 VU 3 min 高并发,验证是否出现劣化与失败

每档记录:成功率、平均响应时间、90% 响应时间(P90)、QPS/吞吐量、服务端是否报错,以及被测机器显存/内存占用。

一个小遗憾:本轮只压了 1 / 10 / 20 三档,中间没有补 5 并发这一档,导致「拐点到底落在 10~20 之间的哪一点」无法精确定位,这也是后续补测要补的档位。

关键数据:1 并发还行,20 并发直接崩

JMeter 原始数据整理如下(数据已做脱敏示意,仅保留数量级,用于技术参考):

场景 并发 时长 服务端报错 成功率 平均响应时间 P90 响应时间 QPS/吞吐量 显存 内存
基准测试 1 3 min 否 100% 3574 ms 6476 ms 28.1/min 13.8G 23.9G
压力测试 10 3 min 否 100% 23688 ms 35322 ms 24.2/min 13.8G 23.9G
压力测试 20 3 min 否 87% 47778 ms 60034 ms 约 1.4 13.8G 23.9G

几个值得注意的点:

  • 1 并发(基准):成功率 100%,平均响应 3.6s,P90 约 6.5s。单看功能是通的,但基线已经不算快——「检索 + 生成」决定了它天然是秒级接口。
  • 10 并发:成功率仍 100%,但平均响应飙到 23.7s,P90 到了 35s;吞吐(约 24 请求/分钟)相比单并发几乎没有提升,甚至略有下降——并发上来之后并不是在并行处理,而是在排队。
  • 20 并发:平均响应 47.8s,P90 约 60s,成功率跌到 87%——约 13% 的请求没能正常返回;QPS/吞吐量掉到约 1.4,比单用户时还低,接口实际上已经不可用。

补充:服务端日志没有显式报错,13% 的失败更多表现为请求超时 / 生成长时间未完成。

分析与结论:瓶颈不在机器,在链路

  • 显存/内存全程稳定在 13.8G / 23.9G 附近,资源并没有被打满——瓶颈不在单机算力;
  • 真正的瓶颈在调用与检索链路:RAG 链路里「检索 + 生成」串行执行,单请求 3.6s 起步的长响应在并发下迅速堆积,线程被占满后大量请求排队甚至超时;
  • 20 并发时平均响应 47.8s、成功率 87%,意味着当前实现扛不住业务并发,暂不适合接入业务。

结论(结合原报告口径稍作展开):

  1. 优化多线程调用:线程池与并发度控制、超时与重试策略、长请求的流式 / 异步化改造;
  2. 优化检索链路:向量索引与结果缓存、相似度阈值调优、减少无效命中,缩短单请求耗时;
  3. 在优化完成并复测达标之前,不建议让该接口直接接入业务。

写在最后

这次压测给我们的教训很直观:RAG 接口不能只测"能不能用",要测"扛不扛得住"。单并发 3.6s 的接口,任谁也很难猜到 20 并发就会崩——只有阶梯加压压到拐点,数据才会说话。

如果你也要压 RAG / 知识库类接口,建议从 1 并发基准开始,每档 2-3 分钟逐级加压,把成功率、P90、吞吐量一起盯住,中间档位不要跳太多。别等业务接上去了,才发现接口在真实流量下不堪一击。