【vLLM服务器并发能力测试程序】写一个python小程序来进行并发测试

【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可能并没有多大优势,只能在并发数量上看看能不能有点用武之地了。

有兴趣做更多测试的大神可以回复一下更多测试结果。我就先告辞了~~哈哈

相关推荐
卡尔特斯15 小时前
uv 精简使用教程
python·ai编程
子豪-中国机器人15 小时前
python AI自动化
java·前端·python
2501_9454235415 小时前
数据分析师的Python工具箱
jvm·数据库·python
水哥ansys15 小时前
Pyansys基本介绍及环境配置
python·水哥ansys
2401_8796938715 小时前
自动化与脚本
jvm·数据库·python
SunnyRivers15 小时前
快速理解vLLM命令行工具serve
命令行·serve·vllm
野犬寒鸦15 小时前
从零起步学习AI大模型应用开发 || 第三章:智能体项目实战中的问题与解决方案及思路详解
java·服务器·数据库·人工智能·后端·面试
久绊A15 小时前
服务器磁盘只读/故障排
java·linux·服务器
马猴烧酒.15 小时前
【Java复习|Lambda表达式】Java Lambda 表达式、函数式接口与匿名内部类:从起源到原理
java·开发语言·ide·笔记·python·spring