如何通过jmeter测试大模型性能【QPS篇】
1. 测试计划整体架构与设计思路
本教程将详细讲解如何构建一个完整的JMeter测试计划,用于评估通义千问(Qwen)大模型API在高并发场景下的每秒查询率(QPS)性能。JMeter测试计划采用XML格式(.jmx文件),其结构遵循严格的层次化设计,所有测试元件通过<hashTree>标签组织成树状结构。
步骤一:理解JMX文件根结构
测试计划文件以<jmeterTestPlan>作为根元素,声明JMeter版本信息。在本配置中使用的是JMeter 5.6.3版本:
<?xml version="1.0" encoding="utf-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3">
<hashTree>
<!-- 测试计划主体内容 -->
</hashTree>
</jmeterTestPlan>
步骤二:配置TestPlan主节点
<TestPlan>元素定义测试计划的基本属性,包括名称、注释和执行模式:
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="通义千问API QPS性能测试" enabled="true">
<stringProp name="TestPlan.comments">用于测试通义千问API的QPS性能和并发能力</stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
</TestPlan>
|
属性名称 |
配置值 |
功能说明 |
|---|---|---|
|
functional_mode |
false |
关闭功能测试模式,启用性能测试模式 |
|
tearDown_on_shutdown |
true |
测试结束时执行清理操作 |
|
serialize_threadgroups |
false |
允许线程组并行执行 |
测试计划组件层次结构
整个测试计划按照以下层次组织,确保各组件协同工作:
|
层级 |
组件类型 |
组件名称 |
作用 |
|---|---|---|---|
|
第1层 |
配置元件 |
API配置变量 |
定义全局参数 |
|
第2层 |
线程组 |
QPS测试线程组 |
控制并发执行 |
|
第3层 |
配置元件 |
HTTP请求默认值/信息头管理器 |
预设HTTP参数 |
|
第3层 |
采样器 |
通义千问API请求 |
发送实际请求 |
|
第4层 |
定时器 |
固定/高斯随机定时器 |
控制请求间隔 |
|
第4层 |
断言 |
状态码/JSON/持续时间断言 |
验证响应 |
|
第3层 |
监听器 |
聚合报告等5种监听器 |
收集结果 |
2. 用户自定义变量配置
用户自定义变量是JMeter实现参数化配置的核心机制,通过将API密钥、服务器地址等可变内容提取为变量,既便于维护又增强了测试计划的可移植性。
步骤一:创建Arguments配置元件
在测试计划节点下添加<Arguments>元件,使用collectionProp容器存放所有变量定义:
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="API配置变量" enabled="true">
<stringProp name="TestPlan.comments">配置通义千问API相关参数</stringProp>
<collectionProp name="Arguments.arguments">
<!-- 变量定义列表 -->
</collectionProp>
</Arguments>
步骤二:定义API_KEY变量
API密钥是调用通义千问API的身份凭证,必须配置为用户自定义变量以便灵活替换:
<elementProp name="API_KEY" elementType="Argument">
<stringProp name="Argument.name">API_KEY</stringProp>
<stringProp name="Argument.value">YOUR_API_KEY_HERE</stringProp>
<stringProp name="Argument.desc">请替换为您的通义千问API密钥</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
步骤三:定义BASE_URL变量
指定DashScope平台的API服务器域名:
<elementProp name="BASE_URL" elementType="Argument">
<stringProp name="Argument.name">BASE_URL</stringProp>
<stringProp name="Argument.value">dashscope.aliyuncs.com</stringProp>
<stringProp name="Argument.desc">API服务器地址</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
步骤四:定义MODEL和TIMEOUT变量
MODEL变量控制测试使用的模型,TIMEOUT设置请求超时阈值:
<elementProp name="MODEL" elementType="Argument">
<stringProp name="Argument.name">MODEL</stringProp>
<stringProp name="Argument.value">qwen-turbo</stringProp>
<stringProp name="Argument.desc">使用的模型名称</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="TIMEOUT" elementType="Argument">
<stringProp name="Argument.name">TIMEOUT</stringProp>
<stringProp name="Argument.value">30000</stringProp>
<stringProp name="Argument.desc">请求超时时间(毫秒)</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
变量配置汇总表
|
变量名 |
默认值 |
用途 |
引用方式 |
|---|---|---|---|
|
API_KEY |
YOUR_API_KEY_HERE |
API身份认证 |
${API_KEY} |
|
BASE_URL |
dashscope.aliyuncs.com |
服务器地址 |
${BASE_URL} |
|
MODEL |
qwen-flash |
测试模型 |
${MODEL} |
|
TIMEOUT |
30000 |
超时时间(ms) |
${TIMEOUT} |
3. 线程组详细配置
线程组是JMeter性能测试的执行引擎,通过配置线程数量、启动策略和循环次数来模拟真实的并发用户行为。精确的线程组配置是获得可靠QPS测试结果的关键。
步骤一:创建ThreadGroup基础结构
线程组通过<ThreadGroup>元素定义,包含多个关键属性控制执行行为:
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="QPS测试线程组" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<!-- 详细配置参数 -->
</ThreadGroup>
on_sample_error属性设置为continue,确保单个请求失败不会中断整个测试流程。
步骤二:配置并发线程数(num_threads)
num_threads参数决定模拟的并发用户数量,直接影响测试压力强度:
<stringProp name="ThreadGroup.num_threads">10</stringProp>
配置为10个线程意味着最多有10个虚拟用户同时发送请求。线程数的选择需要考虑API的并发限制和测试机器的资源能力。
步骤三:配置Ramp-Up时间(ramp_time)
Ramp-Up时间控制线程启动的渐进性,避免瞬时流量冲击:
<stringProp name="ThreadGroup.ramp_time">10</stringProp>
设置为10秒表示10个线程将在10秒内逐步启动,即每秒启动1个新线程。这种渐进式加压更接近真实场景,也便于观察系统在不同负载下的性能表现。
步骤四:启用调度器控制测试时长(scheduler/duration)
通过调度器可以精确控制测试的运行时长:
<boolProp name="ThreadGroup.scheduler">true</boolProp>
<stringProp name="ThreadGroup.duration">60</stringProp>
<stringProp name="ThreadGroup.delay">0</stringProp>
|
参数 |
值 |
说明 |
|---|---|---|
|
scheduler |
true |
启用调度器功能 |
|
duration |
60 |
测试持续60秒后自动停止 |
|
delay |
0 |
无启动延迟,立即开始 |
步骤五:配置循环控制器(LoopController)
循环控制器定义每个线程执行请求的次数:
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">100</stringProp>
</elementProp>
配置100次循环意味着每个线程将执行100次请求。由于同时启用了60秒的duration限制,实际执行以先达到的条件为准——如果60秒内未完成100次循环则测试自动结束。
线程组参数对照表
|
参数名称 |
XML属性 |
配置值 |
计算说明 |
|---|---|---|---|
|
并发用户数 |
num_threads |
10 |
最大同时活跃线程数 |
|
启动时间 |
ramp_time |
10秒 |
线程启动速率=10/10=1个/秒 |
|
循环次数 |
loops |
100 |
理论最大请求数=10×100=1000 |
|
持续时间 |
duration |
60秒 |
实际测试时长上限 |
|
理论QPS上限 |
- |
- |
1000/60≈16.7(不含定时器延迟) |
4. HTTP请求配置
HTTP请求配置是与通义千问API交互的核心部分,需要精确设置服务器连接参数、认证头和符合API规范的请求体。
4.1 HTTP请求默认值配置
步骤一:创建ConfigTestElement
HTTP请求默认值为所有HTTP请求预设通用参数,避免重复配置:
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP请求默认值" enabled="true">
<stringProp name="HTTPSampler.domain">${BASE_URL}</stringProp>
<stringProp name="HTTPSampler.port">443</stringProp>
<stringProp name="HTTPSampler.protocol">https</stringProp>
<stringProp name="HTTPSampler.connect_timeout">${TIMEOUT}</stringProp>
<stringProp name="HTTPSampler.response_timeout">${TIMEOUT}</stringProp>
</ConfigTestElement>
|
属性 |
值 |
说明 |
|---|---|---|
|
domain |
${BASE_URL} |
引用变量,实际值为dashscope.aliyuncs.com |
|
port |
443 |
HTTPS标准端口 |
|
protocol |
https |
使用HTTPS加密协议 |
|
connect_timeout |
${TIMEOUT} |
连接超时30秒 |
|
response_timeout |
${TIMEOUT} |
响应超时30秒 |
4.2 HTTP信息头管理器配置
步骤二:配置认证和内容类型头
通义千问API需要Bearer Token认证和JSON内容类型声明:
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP信息头管理器" enabled="true">
<collectionProp name="HeaderManager.headers">
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Authorization</stringProp>
<stringProp name="Header.value">Bearer ${API_KEY}</stringProp>
</elementProp>
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Content-Type</stringProp>
<stringProp name="Header.value">application/json</stringProp>
</elementProp>
<elementProp name="" elementType="Header">
<stringProp name="Header.name">X-DashScope-SSE</stringProp>
<stringProp name="Header.value">disable</stringProp>
</elementProp>
</collectionProp>
</HeaderManager>
HTTP头配置说明表
|
头名称 |
值 |
作用 |
|---|---|---|
|
Authorization |
Bearer ${API_KEY} |
API身份认证,${API_KEY}运行时替换为真实密钥 |
|
Content-Type |
application/json |
声明请求体为JSON格式 |
|
X-DashScope-SSE |
disable |
禁用流式输出,获取完整响应便于性能测量 |
4.3 HTTPSamplerProxy请求体配置
步骤三:构造POST请求采样器
HTTP请求采样器是实际发送API请求的组件,需要配置请求方法、路径和JSON请求体:
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="通义千问API请求" enabled="true">
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<stringProp name="HTTPSampler.path">/api/v1/services/aigc/text-generation/generation</stringProp>
<!-- 请求体配置 -->
</HTTPSamplerProxy>
步骤四:编写符合API规范的JSON请求体
通义千问API要求特定的JSON结构,包含model、input和parameters三个顶级字段:
{
"model": "${MODEL}",
"input": {
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "请用一句话介绍人工智能。"
}
]
},
"parameters": {
"result_format": "message",
"max_tokens": 100,
"temperature": 0.7
}
}
请求体参数说明
|
字段路径 |
值 |
说明 |
|---|---|---|
|
model |
${MODEL} |
使用qwen-turbo模型 |
|
input.messages |
数组 |
对话消息列表 |
|
parameters.result_format |
message |
返回消息格式 |
|
parameters.max_tokens |
100 |
限制输出长度以控制成本 |
|
parameters.temperature |
0.7 |
生成随机性参数 |
5. 定时器配置
定时器用于控制请求之间的间隔时间,既能模拟真实用户行为,又能避免过于密集的请求触发API限流。本测试计划采用固定定时器与高斯随机定时器组合的策略。
步骤一:配置固定定时器
固定定时器在每个请求前添加恒定的等待时间:
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="固定定时器" enabled="true">
<stringProp name="ConstantTimer.delay">100</stringProp>
</ConstantTimer>
delay属性设置为100毫秒,意味着每次请求前至少等待0.1秒。这确保了请求频率的基本控制。
步骤二:配置高斯随机定时器
高斯随机定时器在固定延迟基础上增加随机波动,使请求模式更接近真实场景:
<GaussianRandomTimer guiclass="GaussianRandomTimerGui" testclass="GaussianRandomTimer" testname="高斯随机定时器" enabled="true">
<stringProp name="ConstantTimer.delay">100</stringProp>
<stringProp name="RandomTimer.range">300</stringProp>
</GaussianRandomTimer>
定时器计算公式
高斯随机定时器的实际延迟遵循正态分布:
-
固定基础延迟:100ms
-
随机偏差范围:±300ms(实际偏差服从标准差为range/3的正态分布)
-
实际延迟范围:约0ms~400ms(中心在100ms)
定时器组合效果
|
定时器类型 |
延迟值 |
叠加效果 |
|---|---|---|
|
固定定时器 |
100ms |
每次请求必定等待100ms |
|
高斯随机定时器 |
100±300ms |
在固定延迟基础上叠加随机延迟 |
|
总延迟范围 |
100~500ms |
平均约300ms,符合真实用户行为 |
两个定时器的延迟会叠加生效,使得每次请求间隔在200ms~500ms之间波动,平均约300ms,换算为单线程理论QPS约3.3次/秒。
6. 断言配置
断言是JMeter验证响应正确性的机制。在QPS测试中,断言不仅用于功能验证,还直接影响测试结果中的成功/失败统计。本测试计划配置了三种互补的断言类型。
6.1 HTTP状态码断言
步骤一:配置ResponseAssertion验证HTTP 200
HTTP状态码断言检查服务器返回的响应状态:
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="HTTP状态码断言" enabled="true">
<stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
<stringProp name="Assertion.assume_success">false</stringProp>
<intProp name="Assertion.test_type">8</intProp>
<collectionProp name="Asserion.test_strings">
<stringProp name="49586">200</stringProp>
</collectionProp>
</ResponseAssertion>
|
属性 |
值 |
说明 |
|---|---|---|
|
test_field |
Assertion.response_code |
检查响应状态码 |
|
test_type |
8 |
匹配模式:等于 |
|
test_strings |
200 |
期望状态码为HTTP 200 OK |
6.2 JSON路径断言
步骤二:配置JSONPathAssertion验证输出字段
JSON路径断言用于验证响应体中是否包含预期的数据结构:
<JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="JSON路径断言" enabled="true">
<stringProp name="JSON_PATH">$.output</stringProp>
<stringProp name="EXPECTED_VALUE"/>
<boolProp name="JSONVALIDATION">false</boolProp>
<boolProp name="EXPECT_NULL">false</boolProp>
<boolProp name="INVERT">false</boolProp>
<boolProp name="ISREGEX">true</boolProp>
</JSONPathAssertion>
JSON_PATH设置为$.output,验证通义千问API响应中包含output字段。EXPECTED_VALUE为空表示只检查字段存在性,不验证具体内容。
6.3 持续时间断言
步骤三:配置DurationAssertion设置超时阈值
持续时间断言确保响应时间不超过预设阈值:
<DurationAssertion guiclass="DurationAssertionGui" testclass="DurationAssertion" testname="持续时间断言" enabled="true">
<stringProp name="DurationAssertion.duration">30000</stringProp>
</DurationAssertion>
duration设置为30000毫秒(30秒),超过此时间的响应将被标记为失败,与TIMEOUT变量保持一致。
断言配置汇总
|
断言类型 |
检查内容 |
阈值/期望值 |
失败含义 |
|---|---|---|---|
|
HTTP状态码断言 |
响应状态码 |
200 |
服务器返回错误 |
|
JSON路径断言 |
$.output字段 |
存在即可 |
响应格式异常 |
|
持续时间断言 |
响应耗时 |
≤30000ms |
响应超时 |
7. 结果聚合报告配置
监听器是JMeter收集和展示测试结果的组件。本测试计划配置了5种不同类型的监听器,覆盖实时监控、统计分析和数据导出等多种需求。
步骤一:配置聚合报告(StatVisualizer)
聚合报告是最常用的性能统计组件,提供QPS、响应时间、错误率等核心指标:
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration"/>
</objProp>
<stringProp name="filename"/>
</ResultCollector>
步骤二:配置查看结果树(ViewResultsFullVisualizer)
查看结果树展示每个请求的详细信息,便于调试和问题排查:
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="查看结果树" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<!-- 配置同上 -->
</ResultCollector>
步骤三:配置响应时间图(GraphVisualizer)
响应时间图以可视化方式展示延迟随时间的变化趋势:
<ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="响应时间图" enabled="true">
<!-- 配置同上 -->
</ResultCollector>
步骤四:配置汇总报告(SummaryReport)
汇总报告提供精简的统计摘要:
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="汇总报告" enabled="true">
<!-- 配置同上 -->
</ResultCollector>
步骤五:配置简单数据写入器(SimpleDataWriter)
简单数据写入器将原始测试数据导出为CSV文件,便于后续分析:
<ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="简单数据写入器" enabled="true">
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename">qps_test_results.csv</stringProp>
</ResultCollector>
监听器功能对照表
|
监听器类型 |
GUI类 |
输出形式 |
主要用途 |
|---|---|---|---|
|
聚合报告 |
StatVisualizer |
统计表格 |
查看QPS/平均响应时间/错误率 |
|
查看结果树 |
ViewResultsFullVisualizer |
树形列表 |
调试请求/响应详情 |
|
响应时间图 |
GraphVisualizer |
折线图 |
观察延迟变化趋势 |
|
汇总报告 |
SummaryReport |
简表 |
快速查看总体结果 |
|
简单数据写入器 |
SimpleDataWriter |
CSV文件 |
导出原始数据深度分析 |
8. QPS计算方法和性能指标解读
QPS(Queries Per Second)是衡量API性能的核心指标,表示系统每秒能处理的查询请求数量。理解QPS的计算方法和相关指标对于准确评估测试结果至关重要。
生活比喻新建连接QPS和并发连接的关系:
新建连接 = 每秒进多少人
并发连接 = 商场里同时有多少人
连接存活时间 = 每个人逛多久
人进的快,待的久 = 商场里人就多(并发高)
步骤一:理解QPS的计算公式
JMeter聚合报告中的Throughput(吞吐量)即为实际测得的QPS:
QPS=测试持续时间(秒)总请求数
例如:在60秒测试中完成了300次请求,则QPS = 300/60 = 5次/秒。
步骤二:解读关键性能指标
|
指标名称 |
计算方式 |
参考基准 |
优化方向 |
|---|---|---|---|
|
QPS/吞吐量 |
总样本÷时间 |
越高越好 |
增加并发、减少响应时间 |
|
平均响应时间 |
Σ响应时间÷样本数 |
越低越好 |
优化网络、选择快速模型 |
|
错误率 |
失败数÷总数×100% |
<1%为佳 |
检查认证、网络、限流 |
|
90%响应时间 |
90%请求的响应上限 |
评估稳定性 |
优化长尾请求 |
|
标准差 |
响应时间离散程度 |
越小越稳定 |
识别性能波动 |
步骤三:理论QPS与实际QPS
本测试计划的理论QPS上限受以下因素制约:
|
因素 |
配置值 |
影响分析 |
|---|---|---|
|
并发线程数 |
10 |
最多10个请求并行 |
|
定时器延迟 |
200~500ms |
单线程约2~5次/秒 |
|
API响应时间 |
约1~3秒 |
大模型推理耗时 |
|
理论单线程QPS |
约0.3~0.5 |
受响应时间主导 |
|
理论总QPS |
约3~5 |
10线程×单线程QPS |
实际测试时,QPS主要受API响应时间限制,大模型推理通常需要1~3秒,因此实际QPS可能在3~10之间。
9. 实战操作指南与参数调优建议
9.1 测试执行步骤
步骤一:导入测试计划
启动Apache JMeter(5.0及以上版本),通过菜单"文件→打开"加载测试计划文件:
文件路径:qianwen_api_qps_test.jmx
步骤二:配置真实API密钥
在左侧树形结构中展开"测试计划",点击"API配置变量"节点,将API_KEY变量的值从YOUR_API_KEY_HERE修改为您在阿里云DashScope平台申请的真实API密钥。
步骤三:执行测试
点击工具栏绿色启动按钮(或按Ctrl+R)开始测试。测试将持续60秒后自动停止。
步骤四:查看结果
在"聚合报告"监听器中查看QPS(Throughput列)、平均响应时间、错误率等指标。
9.2 参数调优建议
根据不同测试目的,推荐以下配置方案:
|
测试场景 |
线程数 |
Ramp-Up |
持续时间 |
定时器 |
适用说明 |
|---|---|---|---|---|---|
|
功能验证 |
2 |
2秒 |
30秒 |
保持默认 |
验证配置正确性 |
|
基线测试 |
5 |
5秒 |
60秒 |
保持默认 |
建立性能基准 |
|
标准压测 |
10 |
10秒 |
60秒 |
保持默认 |
常规性能评估 |
|
高压测试 |
30 |
30秒 |
120秒 |
减半 |
评估并发上限 |
|
极限测试 |
50 |
10秒 |
60秒 |
禁用 |
测试峰值承压能力 |
9.3 注意事项
|
类别 |
注意事项 |
建议措施 |
|---|---|---|
|
API限流 |
通义千问存在并发限制 |
查阅官方文档确认账户额度 |
|
费用控制 |
每次调用消耗Token |
使用qwen-turbo,设置max_tokens=100 |
|
模型选择 |
不同模型响应速度差异大 |
QPS测试推荐qwen-turbo |
|
网络环境 |
延迟影响测试结果 |
使用稳定网络或同区域云主机 |
|
结果分析 |
关注错误率异常 |
高错误率可能是限流导致 |
10. 生成文件路径
本教程涉及的JMeter测试计划文件:
-
JMX测试计划文件:qianwen_api_qps_test.jmx
-
测试结果输出:qps_test_results.csv(测试执行后在JMeter工作目录生成)
该JMX文件为标准XML格式,兼容Apache JMeter 5.x版本,配置好保存下来可直接导入运行。使用前请确保已将API_KEY变量替换为有效的通义千问API密钥。
11. 配置和效果图展示(具体参可数根据具体情况进行调整)
提醒:Don't use GUI mode for load testing !only for Test creation and Test debugging.For load testing, use CLI Mode





12. API限频说明(并发线程数超过一定值就会出现限频)

通义千问(DashScope)API 的限频(Rate Limit)策略根据模型、用户类型(免费/付费)和具体服务等级而有所不同。以下是基于当前常见情况的总结,但最准确的限频信息请务必以阿里云平台官方文档为准。
核心限频规则(典型参考)
|
用户类型 / 模型 |
默认 QPS (每秒请求数) |
说明 |
|---|---|---|
|
免费用户 |
较低 (通常为 1-5 QPS) |
为体验和轻量使用设计,例如qwen-turbo可能为 2 QPS。极易触发限流,不适合压测或生产。 |
|
付费用户(按量付费) |
较高 (通常为 5-50 QPS 或更高) |
基础商用级别。例如qwen-turbo可能默认为 20-50 QPS。具体额度在开通付费后可在控制台查看。 |
|
企业级/高需求用户 |
可协商 (可达数百甚至上千 QPS) |
通过工单联系阿里云客服,根据业务需求和承诺用量申请提升配额。 |
关键特性与注意事项
-
限频维度:限频通常基于 API Key 进行。同一个账户下的不同Key可能有独立或共享的限额。
-
错误响应:当触发限频时,API会返回 Throttling.RateQuota,限流速率的配额。
-
模型差异:更高阶的模型(如 qwen-max)其默认QPS可能低于 qwen-turbo,因为计算资源消耗更大。
-
突发限制:除了QPS,还可能存在并发连接数、每分钟/每日请求总数等限制。
给您的 JMeter 测试建议
-
确认您的账户限额:登录 阿里云DashScope控制台。在 “配额管理” 或 “调用统计” 相关页面,查找您所用模型(如 qwen-turbo)的 “QPS限制”。
-
在测试中处理限频:监控429错误:在JMeter的聚合报告或查看结果树中密切关注429状态码的出现。添加定时器:如果触发限频,可以在JMeter线程组中增加 “常数吞吐量定时器” 或 “高斯随机定时器”,将请求速率控制在实际QPS限制以下。解析响应头:可以添加 “正则表达式提取器” 或 “JSON提取器” 来捕获 X-RateLimit-Reset等头信息,实现更智能的退避重试。
-
申请更高的测试额度(如需):如果默认付费额度仍无法满足压测需求,请通过阿里云工单系统,说明您的测试目的、所需模型、目标QPS和测试时长,申请临时的额度提升。
总结:对于您正在进行的性能测试,最关键的一步是先在控制台查明您账户下qwen-turbo模型的确切QPS限制,并将JMeter的并发数(线程数/Ramp-up)设置在该限制以内,否则测试结果将充满429错误,无法反映真实性能。 如需更高并发,请务必提前申请。
更多推荐



所有评论(0)