文章目录
-
- 🚀 项目背景
- 📦 什么是 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 是否在承受范围内
# – 错误率是否保持在可接受阈值以内
典型结果分析:
| 10 | 850 | 25 | 0% | 基线性能 |
| 50 | 920 | 23 | 0.5% | 轻微下降 |
| 100 | 1100 | 18 | 2.1% | 性能瓶颈显现 |
| 200 | 2100 | 12 | 8.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 机制的日志输出,确认是客户端还是服务端问题
排查思路:
5. JMeter 中配置插件详解
将 SSE-LLM Stream Sampler(技术类名 SseStreamSampler) 集成到测试计划的完整步骤:
步骤 1:插件安装
# Maven 构建生成 JAR
mvn 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 决定 |
| 基本设置 | Port | API 服务端口,如 443 |
| 基本设置 | Path | 完整请求路径,如 /v1/chat/completions |
| 认证信息 | API Key | 直接在插件中输入,或通过 HTTP Header Manager 传递 |
| 认证信息 | Auth Type | 选择 Bearer Token 等 |
| 请求体配置 | API Format | 下拉选择:OpenAI / Dify / Claude / Gemini |
| 请求体配置 | Request Body Template | JSON 模板,支持 ${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 等工具进行深度分析:
import pandas as pd
df = pd.read_csv('jmeter-results.csv')
# 关键分析:df.groupby('合并指标').agg(['mean', 'max', 'count'])
- 优点:适合自动化 CI/CD 流程,支持大数据量、自定义字段
- 缺点:需要一定的技术成本配置和后处理脚本
方式二:结果收集器导出(适合大规模数据)
在测试计划中添加 CSV Result Service 或 JDBC Result Collector
配置输出路径和格式(逗号分隔、制表符分隔等)
测试运行完成后,结果文件将自动写入指定目录
使用 Python/Pandas 等工具进行深度分析:
import pandas as pd
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 中交流。



