一,压力测试
1,压测是什么
压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。主要检测服务器的承受能力,包括用户承受能力(多少用户同时玩基本不影响质量)、流量承受等。
2, 为什么要压测
压测的目的就是通过压测(模拟真实用户的行为),测算出机器的性能(单台机器的QPS),从而推算出系统在承受指定用户数(100W)时,需要多少机器能支撑得住。压测是在上线前为了应对未来可能达到的用户数量的一次预估(提前演练),压测以后通过优化程序的性能或准备充足的机器,来保证用户的体验。
3,压测类型
解释压力测试(Stress Testing)
也称之为强度测试,测试一个系统的最大抗压能力,在强负载(大数据、高并发)的情况下,测试系统所能承受的最大压力,预估系统的瓶颈
并发测试(Concurrency Testing)
通过模拟很多用户同一时刻访问系统或对系统某一个功能进行操作,来测试系统的性能,从中发现问题(并发读写、线程控制、资源争抢)
耐久性测试(Configuration Testing)
通过对系统在大负荷的条件下长时间运行,测试系统、机器的长时间运行下的状况,从中发现问题(内存泄漏、数据库连接池不释放、资源不回收)
二,LLM的同步和异步
1.LLM的同步:
LLM如果只使用huggingface或者魔搭社区上的方法创建大模型时,通常你是在以同步的方式与模型进行交互。这意味着当你发送一个请求给模型(例如生成文本),你需要等待直到该请求完成并返回结果,期间你的程序会处于阻塞状态。这就是LLM的同步,同步调用可能会导致资源利用率不高,因为每次调用都会占用线程直到操作完成,代码也易于理解编写,仅仅适合适合于单用户环境或低并发需求的应用场景。
2.LLM的异步:
如果以异步方式与LLM进行交互时,可以发送多个请求而无需等待每个请求完成,这可以显著提高效率,尤其是在处理多个并发请求或长时间运行的任务时。异步引擎能够更好地利用系统资源,因为它可以在等待I/O操作完成的同时执行其他任务,从而实现更高效的多任务处理。虽然提供了更高的性能和灵活性,但编写和管理异步代码可能会增加开发的复杂性,需要开发者对异步编程有一定的了解。更适合于高并发、高性能要求的服务端应用,如在线API服务、实时聊天机器人等。
在现代软件开发中,高并发 API 测试是确保系统在高负载下稳定运行的关键步骤。本文将探讨在进行高并发 API 测试时,为什么选择协程(Coroutine)而不是线程(Thread),并提供相应的示例代码。
三,并行与并发
在深入讨论之前,有必要了解并行(Parallelism)和并发(Concurrency)的区别。
并发(Concurrency)
并发是指在同一时间段内处理多个任务的能力。并发并不一定意味着同时执行,而是指任务之间可以交替进行,从而在宏观上看起来是同时进行。
特性
任务交替执行:在单核处理器上,通过时间片轮转或任务切换实现多个任务的交替执行。
资源共享:并发任务通常共享系统资源,如 CPU、内存和 I/O 设备。
非阻塞:通过异步编程、事件驱动或多线程实现非阻塞操作,提高系统的响应能力。
并行(Parallelism)
并行是指在同一时刻同时执行多个任务。并行通常需要多核处理器或多台计算机来实现真正的同时执行。
特性
同时执行:多个任务在不同的处理器核心上同时执行。
独立任务:并行任务通常是相互独立的,不需要频繁的通信或共享资源。
提高吞吐量:通过同时执行多个任务,提高系统的整体处理能力。
线程与协程
在了解了并行与并发的区别后,我们来具体介绍线程和协程。
线程(Thread)
线程是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流。
特性
并行执行:多个线程可以在多核处理器上并行执行。
资源共享:同一进程内的线程共享内存和资源。
开销较大:线程的创建和上下文切换开销较大。
协程(Coroutine)
协程是一种比线程更轻量级的并发模型。协程在单线程的情况下也能实现并发操作,通过事件循环来调度任务。
特性
轻量级:协程的创建和上下文切换开销较低。
非阻塞:通过异步 I/O 操作实现非阻塞,适合 I/O 密集型任务。
单线程:协程在单线程事件循环中运行,不能利用多核处理器的并行能力。
为什么选择协程进行高并发测试?
在进行高并发 API 测试时,选择协程而不是线程有几个重要原因:
资源消耗
线程:线程的创建和上下文切换开销较大,可能导致系统资源耗尽。
协程:协程的创建和上下文切换开销较低,可以更高效地利用系统资源。
I/O 密集型任务
线程:虽然可以处理 I/O 密集型任务,但线程的高开销使其在处理大量 I/O 操作时效率不高。
协程:在处理大量 I/O 操作时表现优异,能够更高效地模拟高并发场景。
对于高并发的 API 测试,协程通常是更优的选择,因为它们在处理大量 I/O 操作时更加高效,资源消耗更低。如果你的测试场景主要是 I/O 密集型(例如大量的网络请求),使用协程(如 asyncio
和 aiohttp
****)能够更有效地模拟高并发场景。
四,LLM基准测试
LLM
性能的标准化基准测试可以使用许多工具完成,包括长期存在的工具(如Locust
和K6
),以及专门用于LLM
的新开源工具(如NVIDIA GenAI-Perf
和LLMPerf
)。这些客户端工具为基于**LLM
**的应用程序提供了特定的指标,但在如何定义、度量和计算不同的指标方面并不一致。本指南试图阐明常见的度量标准及其差异和局限性。还提供了一个分步指南,介绍如何使用我们首选的工具GenAI-Perf
对LLM
应用程序进行基准测试。
值得注意的是,性能基准测试和负载测试是评估大型语言模型部署的两种不同方法。
- 如
K6
等工具所示,负载测试侧重于模拟对模型的大量并发请求,以评估其模拟真实世界流量和规模的能力。这种类型的测试有助于识别与服务器容量、自动扩展策略、网络延迟和资源利用率相关的问题。 - 相反,如
NVIDIA
的GenAI-Perf
工具所示,性能基准测试关注的是测量模型本身的实际性能,如吞吐量、延迟和token-level
指标。
本文主要关注这种类型的测试,并帮助识别与模型效率、优化和配置相关的问题。虽然负载测试对于确保模型能够处理大量请求至关重要,但性能测试对于理解模型高效处理请求的能力也至关重要。通过结合这两种方法,开发人员可以全面了解其大型语言模型部署的能力,并确定需要改进的地方。
五,locust框架WEB端参数
Type:请求类型
Name:请求路径
Requests:请求数量
Fails:当前失败请求数量
Median:中间值,一半服务器响应时间高于该值,一半低于该值
90%ile:90%服务器响应时间
Average:所有请求的平均响应时间
Min:请求的最少响应时间
Max:请求的最大响应时间
Average size:请求的平均大小
Current RPS:当前每秒请求数
Current Failures/s:每秒失败请求
每秒请求总数:如果上下波动较大,说明性能不稳定
响应时间:黄色为最大时间,绿色为最小时间。一般3-5秒为最佳,超过10秒为较差,最大值如果持续高位就需要进行性能优化。
虚拟用户数
GitHub压测工具:
https://github.com/lework/llm-benchmark