大模型压力测试脚本

大模型压力测试脚本

安装依赖库

python 复制代码
pip install aiohttp

创建压测脚本(如下脚本直接在终端执行即可)

python 复制代码
cat > test_concurrency.py <<'PY'
import asyncio
import aiohttp
import time
import statistics

URL = "http://127.0.0.1:9025/v1/chat/completions"
MODEL = "Qwen3.5"

# 总请求数量
TOTAL_REQUESTS = 100

# 并发数
CONCURRENCY = 10

# 每个请求最大输出 token
MAX_TOKENS = 1024

PROMPT = """小明有10个苹果,先给小红3个,又买了5个,最后给小刚4个,请问小明还剩多少个苹果?请说明计算过程。"""


async def request(session, request_id):
    payload = {
        "model": MODEL,
        "messages": [
            {
                "role": "user",
                "content": PROMPT
            }
        ],
        "temperature": 0.6,
        "max_tokens": MAX_TOKENS,
        "stream": True
    }

    start = time.perf_counter()

    try:
        async with session.post(
            URL,
            json=payload,
            timeout=aiohttp.ClientTimeout(total=300)
        ) as response:

            text = await response.text()
            elapsed = time.perf_counter() - start

            if response.status == 200:
                return {
                    "id": request_id,
                    "success": True,
                    "time": elapsed,
                    "status": response.status,
                    "error": None
                }

            return {
                "id": request_id,
                "success": False,
                "time": elapsed,
                "status": response.status,
                "error": text[:500]
            }

    except Exception as e:
        elapsed = time.perf_counter() - start

        return {
            "id": request_id,
            "success": False,
            "time": elapsed,
            "status": 0,
            "error": str(e)
        }


async def worker(semaphore, session, request_id):
    async with semaphore:
        return await request(session, request_id)


async def main():

    print("=" * 60)
    print("vLLM 并发测试")
    print("=" * 60)
    print(f"URL          : {URL}")
    print(f"Model        : {MODEL}")
    print(f"Total        : {TOTAL_REQUESTS}")
    print(f"Concurrency  : {CONCURRENCY}")
    print(f"Max tokens   : {MAX_TOKENS}")
    print("=" * 60)

    semaphore = asyncio.Semaphore(CONCURRENCY)

    connector = aiohttp.TCPConnector(
        limit=CONCURRENCY,
        limit_per_host=CONCURRENCY
    )

    async with aiohttp.ClientSession(
        connector=connector
    ) as session:

        start_all = time.perf_counter()

        tasks = [
            asyncio.create_task(
                worker(semaphore, session, i + 1)
            )
            for i in range(TOTAL_REQUESTS)
        ]

        results = await asyncio.gather(*tasks)

        total_time = time.perf_counter() - start_all

    success = [r for r in results if r["success"]]
    failed = [r for r in results if not r["success"]]

    times = [r["time"] for r in success]

    print()
    print("=" * 60)
    print("测试结果")
    print("=" * 60)

    print(f"总请求数       : {TOTAL_REQUESTS}")
    print(f"成功请求       : {len(success)}")
    print(f"失败请求       : {len(failed)}")
    print(f"成功率         : {len(success) / TOTAL_REQUESTS * 100:.2f}%")
    print(f"总耗时         : {total_time:.2f} 秒")

    if success:
        print(f"平均响应时间   : {statistics.mean(times):.2f} 秒")
        print(f"最小响应时间   : {min(times):.2f} 秒")
        print(f"最大响应时间   : {max(times):.2f} 秒")

        sorted_times = sorted(times)

        def percentile(data, p):
            index = int(len(data) * p)
            index = min(index, len(data) - 1)
            return data[index]

        print(f"P50            : {percentile(sorted_times, 0.50):.2f} 秒")
        print(f"P95            : {percentile(sorted_times, 0.95):.2f} 秒")
        print(f"P99            : {percentile(sorted_times, 0.99):.2f} 秒")

        print(f"请求吞吐       : {len(success) / total_time:.2f} req/s")

    print("=" * 60)

    if failed:
        print()
        print("失败请求:")

        for r in failed[:10]:
            print(
                f"Request {r['id']} "
                f"status={r['status']} "
                f"error={r['error']}"
            )


if __name__ == "__main__":
    asyncio.run(main())
PY

执行

python 复制代码
python test_concurrency.py
相关推荐
岁月失语唯石能言2 天前
《 Web项目测试实战:博客系统的功能/接口/自动化/性能全流程测试报告》
自动化测试·功能测试·selenium·jmeter·接口测试·压力测试·性能测试
CaoMei_HuaCha7 天前
硬件测试内容之二十二:压力测试
硬件工程·压力测试
Alan CGH7 天前
一次非寻常的压测优化经历
java·网络·压力测试
汽车仪器仪表相关领域12 天前
ZDT‑I伺服电机测试系统:四象限动态加载
大数据·数据库·分布式·功能测试·汽车·压力测试·可用性测试
星核0penstarry16 天前
边缘AI选型:记录NVIDIA Holoscan测试
人工智能·硬件架构·压力测试·ai编程
奔跑中的小象17 天前
NVIDIA GPU 硬件压力测试实战:gpu‑burn 完整使用文档与踩坑排错
压力测试·uos·gpu-burn
游戏开发爱好者819 天前
带签名时间戳接口的重放与压力测试实战,用动态值在发送前现算签名
网络协议·计算机网络·网络安全·ios·adb·https·压力测试
汽车仪器仪表相关领域21 天前
SIRIUS R1DB/R2DB便携式一体化数据采集系统
大数据·人工智能·功能测试·深度学习·压力测试
汽车仪器仪表相关领域22 天前
KRYPTON坚固型IP67 EtherCAT总线数据采集模块:工业级分布式采集方案
分布式·功能测试·汽车·压力测试·可用性测试