☰
基于 JMeter 的 SSE LLM 插件:轻松进行大模型性能测试
2026/9/28 4:37:22 网站建设 项目流程

文章目录

    • 🚀 项目背景
    • 📦 什么是 jmeter-sse-llm-plugin?
    • ✨ 核心功能
    • 🛠️ 快速上手
      • 1. 安装插件
      • 2. 配置 SSE-LLM Stream Sampler
    • 📊 典型使用场景
      • 场景一:压测 GPT-4 响应速度
      • 场景二:Dify 工作流性能测试
      • 场景三:Claude 流式对话测试
    • 📈 近期更新 (v1.0.0)
    • 💡 最佳实践
      • 1. 变量替换:动态测试不同输入
      • 2. 分步测试策略:从单用户到大规模并发
      • 3. 阈值设置:及时发现接口抖动
      • 4. 日志分析:多维度排查问题
      • 5. JMeter 中配置插件详解
      • 6. 结果导出 Excel 两种方式
    • 📥 获取与反馈
    • 🙏 结语

🚀 项目背景

随着大模型(LLM)的快速普及,性能测试成为验证系统承载能力的关键环节。然而,传统的 JMeter 测试大模型接口面临两大痛点:

协议复杂:需要处理 SSE(Server-Sent Events)等实时流式协议

逻辑繁琐:需要手动解析流式响应、计算 Token 速率等

jmeter-sse-llm-plugin应运而生,专为解决这些痛点而设计。

📦 什么是 jmeter-sse-llm-plugin?

一个基于 Apache JMeter 的 SSE 协议插件,支持主流大模型 API 格式,包括:

  • OpenAI 兼容格式(GPT-4, GPT-3.5 等)
  • Dify API 格式
  • Claude API 格式
  • Gemini API 格式

插件通过 SSE 协议实时接收流式响应,并提供完整的性能指标采集能力。

✨ 核心功能

特性说明
SSE 流式接收原生支持 Server-Sent Events 协议,实时接收模型响应
多协议支持支持 OpenAI、Dify、Claude、Gemini 等主流格式
实时指标统计Token 速率、响应时间、错误率实时监控
图形化配置直观的 GUI 界面,无需手写复杂的 Groovy 脚本
自定义请求体支持 JSON 模板、变量替换,灵活适配不同场景

🛠️ 快速上手

1. 安装插件

# 通过 Maven 构建mvn clean package# 将生成的 JAR 放入 JMeter 的 lib/ext 目录# 重启 JMeter 使其生效

2. 配置 SSE-LLM Stream Sampler

在 JMeter 测试计划中:

右键测试计划 -> 添加 -> SSE-LLM Stream Sampler (注意:JMeter 界面显示为此名称)

  • 设置目标 URL(如https://api.openai.com/v1/chat/completions)
  • 选择 API 格式(下拉菜单:OpenAI/Dify/Claude/Gemini)
  • 配置认证信息(API Key 等)
  • 设置请求体模板并启用变量替换
  • 勾选 “Enable Stream Parse” 启用流式指标统计

关键点:虽然 JMeter 界面显示为 “SSE-LLM Stream Sampler”,但其底层 Java 类名为SseStreamSampler(继承AbstractSampler),两者是一一对应的。文章后文提到的SseStreamSampler类名均指代这个 JMeter Sampler。

📊 典型使用场景

场景一:压测 GPT-4 响应速度

目标:验证GPT-4在不同并发下的Token生成速度。

配置示例:

# Sampler配置 URL: https://api.openai.com/v1/chat/completions API Format: OpenAI Concurrent Users: 10, 50, 100 (分步测试) Payload Template: { "model": "gpt-4", "messages": [{"role": "user", "content": "${username}"}], "temperature": 0.7, "stream": true } # JMeter变量准备 # 在 CSV 文件中准备不同的 username 值 # 或使用 RandomString sampler 生成动态内容 # 期望指标关注 # - TTFT (首Token延迟) 随并发是否线性增长 # - Token/sec 是否在承受范围内 # - 错误率是否保持在可接受阈值以内

典型结果分析:

并发数Avg TTFT (ms)Avg Token/secError RateObservation
10850250%基线性能
50920230.5%轻微下降
1001100182.1%性能瓶颈显现
2002100128.5%触发阈值,需优化

从图中可以清晰看到:并发50左右是系统的最佳平衡点,超过该阈值性能呈指数级下降。这也提醒我们在规划容量时,需要预留一定的安全margin。

# 配置示例 URL: https://api.openai.com/v1/chat/completions Model: gpt-4 Concurrent Users: 10-100 Payload: { "messages": [{"role": "user", "content": "${username}"}], "temperature": 0.7 }

场景二:Dify 工作流性能测试

目标:测试Dify平台内置工作流的流式响应性能。

配置示例:

# Sampler配置 URL: https://your-dify-instance.com/v1/run API Format: Dify Workflow ID: text-summary-workflow Payload Template: { "query": "${user_input}", "response_type": "stream", "user": "${user_id}", "files": [] // 如需上传文件 } # 特殊配置 # Dify特有:支持 event 类型过滤 # 可在插件配置中过滤特定事件类型(如: "ChatMessage", "MessageDelta") # 监控重点 # - 不同事件类型的响应时间差异 # - 文件上传场景下的带宽利用率 # - 工作流执行的完整耗时

Dify特有指标解析:

Dify的SSE响应包含多种事件类型,插件支持实时统计:

事件类型说明关注指标
ChatMessage完整的消息内容事件Token总数, 响应时长
MessageDelta消息增量事件(流式输出的核心)Token/sec, 每 delta 的 token 数
ThreadStart线程开始事件连接建立时间
ThreadEnd线程结束事件完整响应耗时
Feedback用户反馈事件业务层面的标记

实战技巧:在压测Dify工作流时,可以通过过滤MessageDelta事件,专门监控 Token 生成的实时速率,这比单纯看总响应时间更能反映模型的输出流畅度。

URL: https://your-dify-instance/v1/run Workflow ID: your-workflow-id Input: {"question": "${user_input}"}

场景三:Claude 流式对话测试

目标:评估Claude模型的对话流畅度和Token输出速率。

配置示例:

# Sampler配置 URL: https://api.anthropic.com/v1/messages API Format: Claude Model: claude-3-5-sonnet-20240620 Payload Template: { "model": "claude-3-5-sonnet-20240620", "max_tokens": 1024, "temperature": 0.5, "stream": true, "messages": [{"role": "user", "content": "${dialogue_prompt}"}] } # Claude特有特性 # - 支持 content block 的流式输出 # - 可监控每个 delta 的 token 变化 # - 特有的 stop reason 监控(如: end_turn, tool_use) # 关键指标 # - 每轮对话的首Token延迟 # - 连续输出的平滑度(无明显卡顿) # - Token成本与速率的平衡点

Claude协议细节:

Claude的SSE响应结构与OpenAI有所不同,关键特性包括:

  • Delta 结构:每个data:事件包含delta对象,其中delta.text为实际的文本片段,delta.stop表示是否为最后一段
  • Content Block:支持多个 content block 同时流式输出,插件会对其进行拼接计算
  • Stop Reason:响应结束时的stop_reason字段(end_turn,tool_use,max_tokens等)可用于判断生成是否正常结束

监控建议:在Claude测试中,重点关注Time Between Deltas指标,该值越接近恒定,说明模型输出的平滑度越高,用户体验更好。

URL: https://api.anthropic.com/v1/messages Max Tokens: 1024 Temperature: 0.5

📈 近期更新 (v1.0.0)

本次发布包含:

✅ 支持 OpenAI 兼容 API 格式
✅ 支持 Dify API 格式
✅ 支持 Claude API 格式
✅ 支持 Gemini API 格式
✅ SSE 协议流式解析
✅ 完整的性能指标统计
✅ 图形化配置面板
✅ Groovy 脚本移除,纯 Java 实现

关键改进:移除了原有的 Groovy Sampler 文件,改用纯 Java 实现,提升稳定性和兼容性。同时插件内置了 15+ 维度的实时指标监控,无需手动后处理即可获取完整的性能数据。

💡 最佳实践

1. 变量替换:动态测试不同输入

利用 JMeter 的${}语法可以轻松实现动态测试。例如:

  • ${username}:测试不同用户的对话内容
  • ${prompt_content}:批量测试多种场景下的模型响应
  • 通过 CSV Data Set Config 读取大规模测试数据集
  • 结合 Random String Generator 生成随机参数,覆盖更多边缘情况

实战技巧:在SSE-LLM Stream Sampler(技术类名SseStreamSampler) 的请求体模板中,使用${VARIABLE_NAME}语法自动填充,无需手动修改 JSON 结构。配合 JDBC Request 或 CSV File Reading, 可实现"一次配置,多轮变参"测试。

2. 分步测试策略:从单用户到大规模并发

性能测试应遵循"由简入繁"的原则:

测试阶段目标关注指标
阶段一:单用户验证验证基本连接和响应首Token延迟 (TTFT), 连接成功率, 基础Token速率
阶段二:并发逐步增加发现性能瓶颈Token/sec变化趋势, TTFT随并发的增长情况, 错误率上升临界点
阶段三:峰值负载测试确定系统上限最大支持并发数, 尾延迟 (P99) 效应, 资源耗尽前的警告信号
阶段四: 长时间稳定性验证系统稳定性内存泄漏迹象, 连接累积, 逐渐恶化的性能趋势

避坑指南:

  • 每个并发层级运行足够时间(建议5-10分钟),确保数据的显著性
  • 留出安全 margin,实际生产负载建议预留 20% 性能头room
  • 注意观察 SseMetrics 中的连接计数,防止连接泄漏

3. 阈值设置:及时发现接口抖动

合理的阈值配置是测试能否及时发现问题的关键。建议阈值设置参考:

指标推荐阈值触发警报阈值严重阈值
错误率< 1%> 3%> 5%
首Token延迟 (TTFT)< 1000ms> 2000ms> 5000ms
Token速率> 15 tokens/sec< 10 tokens/sec< 5 tokens/sec
响应时长< 3000ms> 5000ms> 10000ms

实战技巧:

  • 在 JMeter 的SseMetricsListenerGui中配置颜色编码的阈值警报
  • 设置SseBackendListenerClient的自动停止条件,避免异常时长跑测
  • 结合过滤器,仅监控MessageDelta事件类型的核心指标,降噪分析

4. 日志分析:多维度排查问题

有效的问题排查需要同时关注 JMeter 侧和模型侧的日志:

JMeter 日志关注点:

  • SseStreamSampler(JMeter 显示名:SSE-LLM Stream Sampler) 的INFO级别输出,包含连接建立、流式数据接收状态
  • 查看jmeter.log中的WARN/ERROR,定位协议解析异常
  • 监控SseBackendListenerClient的心跳日志,检测连接中断原因

模型侧日志关注点:

  • API 请求的完整原始日志,验证请求体是否符合预期
  • Token 生成的计数日志,与 JMeter 采集的 Token 总数对比
  • 错误码和 retry 机制的日志输出,确认是客户端还是服务端问题

排查思路:

  1. 首先通过SseMetricsListenerGui定位性能瓶颈在哪个指标
  2. 查看对应模型的 API 文档,确认响应格式是否变更
  3. 检查网络环境是否有丢包、延迟波动
  4. 通过对比原始响应日志,确认是解析错误还是数据传输异常

5. JMeter 中配置插件详解

将SSE-LLM Stream Sampler(技术类名SseStreamSampler) 集成到测试计划的完整步骤:

步骤 1:插件安装

# Maven 构建生成 JARmvn clean package# 将 target/jmeter-sse-llm-plugin-1.0.0.jar 复制至 JMeter 的 lib/ext 目录# 重启 Jmeter 使插件生效

步骤 2:配置面板展示

将SSE-LLM Stream Sampler添加到测试计划后,可以清晰看到插件的配置面板:

添加后,很清楚看到插件的配置面板:

步骤 2:Sampler 配置面板关键参数

打开测试计划,右键添加 ->SSE-LLM Stream Sampler(JMeter 界面显示名称,对应类名SseStreamSampler),配置面板如下:

参数分类关键配置说明
基本设置Server Name or IP目标 API 的主机地址
基本设置Protocol通常留空,由 URL 决定
基本设置PortAPI 服务端口,如 443
基本设置Path完整请求路径,如/v1/chat/completions
认证信息API Key直接在插件中输入,或通过 HTTP Header Manager 传递
认证信息Auth Type选择 Bearer Token 等
请求体配置API Format下拉选择:OpenAI / Dify / Claude / Gemini
请求体配置Request Body TemplateJSON 模板,支持${variable}变量替换
请求体配置Enable Stream Parse必填:开启后才会统计 Token/秒等流式指标
请求体配置Timeout (s)超时时间,防止连接挂起,建议 60-120s

步骤 3:配套监控组件

为获得完整监控效果,建议在测试计划中添加:

  • SseBackendListenerClient:后端监听器,负责采集 SSE 流数据
  • SseMetricsListenerGui:可视化视图面板,实时展示 Token/sec, TTFT, 错误率等
  • JSR223 Post Processor:可在采样器后添加自定义结果处理逻辑

配置示例截图描述:

SseStreamSampler 配置面板展示了 API Format 选择、Request Body Template 输入框以及 Enable Stream Parse 选项开关。界面友好,无需编写 Groovy 脚本即可完成复杂的 SSE 协议配置。

6. 结果导出 Excel 两种方式

测试结束后,将结果导出 Excel 便于分析和报告:

方式一:右键菜单导出(最常用)

在 JMeter 左侧树中选中Test Plan或Thread Group

点击右键,选择Save Response Data或Save Sampler Data

在弹出的对话框中选择Save as CSV或Save as XML

使用 Excel 打开.csv文件,或通过Data->From Text/CSV导入

  • 优点:操作简单,适合快速查看关键指标
  • 缺点:大文件时可能存在性能损耗,格式需二次整理

方式二:结果收集器导出(适合大规模数据)

在测试计划中添加CSV Result Service或JDBC Result Collector

配置输出路径和格式(逗号分隔、制表符分隔等)

测试运行完成后,结果文件将自动写入指定目录

使用 Python/Pandas 等工具进行深度分析:

importpandasaspd df=pd.read_csv('jmeter-results.csv')# 关键分析:df.groupby('合并指标').agg(['mean', 'max', 'count'])
  • 优点:适合自动化 CI/CD 流程,支持大数据量、自定义字段
  • 缺点:需要一定的技术成本配置和后处理脚本

方式二:结果收集器导出(适合大规模数据)

在测试计划中添加CSV Result Service或JDBC Result Collector

配置输出路径和格式(逗号分隔、制表符分隔等)

测试运行完成后,结果文件将自动写入指定目录

使用 Python/Pandas 等工具进行深度分析:

importpandasaspd df=pd.read_csv('jmeter-results.csv')# 关键分析:df.groupby('合并指标').agg(['mean', 'max', 'count'])
  • 优点:适合自动化 CI/CD 流程,支持大数据量、自定义字段
  • 缺点:需要一定的技术成本配置和后处理脚本

实战建议:

  • 日常分析选用右键菜单导出 CSV,快速查看 TTFT、Token/sec 等核心指标变化
  • 项目复盘或正式报告选用CSV Result Collector,结合 Python 脚本生成包含置信区间的统计图表
  • 两种方式可结合使用:先用右键快速筛选异常样本,再用正式导出进行深入分析

📥 获取与反馈

  • GitHub: https://github.com/7dgroup-ai/jmeter-sse-llm-plugin
  • Release: v1.0.0 (已发布,可直接下载 JAR)
  • issues: 欢迎提交 Bug 和 feature request

🙏 结语

无论你是想进行大模型 API 的性能基准测试,还是需要验证自己的部署环境,jmeter-sse-llm-plugin都能帮你事半功能。从今天开始,用 JMeter 来"体检"你的大模型服务吧!🩺

star 仓库支持开源项目的持续发展

本文由 [7dgroup-ai] 发布,旨在分享 JMeter 生态中的实用工具。如有问题或建议,欢迎在 GitHub Issues 中交流。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询