【vLLM服务器并发能力测试程序】写一个python小程序来进行并发测试
由于配置好了vLLM服务器,想知道它和Ollama在并发能力上的处理差距,所以写了一个简单的并发测试程序来看看各自的处理能力(术语是吞吐量)
测试程序分享:
先把程序贴出来:
python
import requests
import time
import json
from concurrent.futures import ThreadPoolExecutor, as_completed
# ===================== 配置项(根据你的环境修改) =====================
# Text Generation Web UI 的 API 地址(WSL的局域网IP + 端口)
BASE_URL = "http://localhost:7988" # 注意:API端口
# 并发数(固定10)
CONCURRENT_NUM = 10
# 测试用的提示词(可自定义)
TEST_PROMPT = "请简要介绍一下人工智能的发展历程,控制在200字以内。"
# 模型名称(需和Web UI中加载的模型名一致)
MODEL_NAME = "nemotron-3-nano:latest"
# ===================== 核心函数 =====================
def send_chat_request(prompt, request_id):
"""发送单条聊天请求,返回耗时和结果"""
url = f"{BASE_URL}/v1/chat/completions"
headers = {"Content-Type": "application/json"}
data = {
"model": MODEL_NAME,
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 8192, # 和提示词匹配的生成长度
"temperature": 0.7,
"stream": False # 非流式,便于统计耗时
}
try:
start_time = time.time()
response = requests.post(url, headers=headers, json=data, timeout=60) # 超时60秒
end_time = time.time()
elapsed = round(end_time - start_time, 2)
if response.status_code == 200:
return {
"request_id": request_id,
"status": "success",
"elapsed_time": elapsed,
"response": response.json()["choices"][0]["message"]["content"] #[:50] + "..." # 截取部分结果
}
else:
return {
"request_id": request_id,
"status": "failed",
"elapsed_time": elapsed,
"error": f"HTTP状态码: {response.status_code}, 响应: {response.text[:100]}"
}
except Exception as e:
end_time = time.time()
elapsed = round(end_time - start_time, 2)
return {
"request_id": request_id,
"status": "error",
"elapsed_time": elapsed,
"error": str(e)[:100]
}
def run_benchmark():
"""运行10并发压测并统计结果"""
print(f"=== 开始10并发压测 ===\nAPI地址: {BASE_URL}\n模型: {MODEL_NAME}\n提示词: {TEST_PROMPT}\n")
start_total = time.time()
results = []
# 创建线程池,设置10个并发
with ThreadPoolExecutor(max_workers=CONCURRENT_NUM) as executor:
# 提交10个请求
future_to_request = {
executor.submit(send_chat_request, TEST_PROMPT, i+1): i+1
for i in range(CONCURRENT_NUM)
}
# 收集结果
for future in as_completed(future_to_request):
request_id = future_to_request[future]
try:
result = future.result()
results.append(result)
# 实时打印单个请求结果
if result["status"] == "success":
print(f"请求{request_id} ✅ 耗时: {result['elapsed_time']}s | 结果: {result['response']}")
else:
print(f"请求{request_id} ❌ 耗时: {result['elapsed_time']}s | 错误: {result['error']}")
except Exception as e:
print(f"请求{request_id} ⚠️ 获取结果失败: {str(e)[:100]}")
# 统计结果
end_total = time.time()
total_elapsed = round(end_total - start_total, 2)
success_num = len([r for r in results if r["status"] == "success"])
fail_num = len([r for r in results if r["status"] in ["failed", "error"]])
success_times = [r["elapsed_time"] for r in results if r["status"] == "success"]
print("\n=== 压测结果统计 ===")
print(f"总耗时: {total_elapsed}s")
print(f"总请求数: {CONCURRENT_NUM} | 成功: {success_num} | 失败: {fail_num}")
print(f"成功率: {success_num/CONCURRENT_NUM*100:.1f}%")
if success_times:
print(f"成功请求平均耗时: {sum(success_times)/len(success_times):.2f}s")
print(f"成功请求最快耗时: {min(success_times):.2f}s")
print(f"成功请求最慢耗时: {max(success_times):.2f}s")
if __name__ == "__main__":
run_benchmark()
你需要把Base URL的端口和地址改为你需要的地址和端口。
然后并发数 CONCURRENT_NUM = 10 这个值设置成为你希望测试的数量。当然,你可以加一个外部循环来实现步进式测试,可以通过实验来获取不同并发数对于两者服务器处理能力的曲线图(当我还在读大学的时候经常做这种事情)。
我的测试提问比较简单:要求200字左右的回答,请你自行修改。MODEL_NAME = "nemotron-3-nano:latest" 这个地方可以修改模型名称,可以换成热门的"Qwen3-Coder-Next"。
结论:
由于Ollama重点对Qwen3-Coder-Next做了不少优化,让这个模型相对比与以往的qwen3-Coder有了很大的提升,因为在生成速度上,vLLM可能并没有多大优势,只能在并发数量上看看能不能有点用武之地了。
有兴趣做更多测试的大神可以回复一下更多测试结果。我就先告辞了~~哈哈