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

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

相关推荐
深蓝电商API1 小时前
爬虫日志分析:快速定位被封原因
爬虫·python
weixin199701080162 小时前
海外淘宝商品详情页前端性能优化实战
大数据·前端·python
珠穆峰2 小时前
linux find 命令使用
linux·运维·服务器
深蓝海拓2 小时前
PySide6的QTimeLine详解
笔记·python·qt·学习·pyqt
纯.Pure_Jin(g)2 小时前
【Python练习四】Python 算法与进阶特性实战:数组、序列化与位运算专项练习(3道经典练习带你巩固基础——看完包会)
开发语言·vscode·python
TongSearch2 小时前
Tongsearch分片的分配、迁移与生命周期管理
java·服务器·数据库·elasticsearch·tongsearch
龙山云仓2 小时前
No152:AI中国故事-对话祖冲之——圆周率与AI精度:数学直觉与极限探索
大数据·开发语言·人工智能·python·机器学习
琅琊榜首20202 小时前
AI+Python实操指南:用编程赋能高质量网络小说创作
开发语言·人工智能·python