性能测试入门及JMH、JMeter、Gatling、ab、Siege、Wrk、Locust、sysbench工具简介 📅 发布时间:2026/8/30 11:53:35 👁 浏览次数: 性能测试性能测试的目的是发现系统的瓶颈做性能测试前需要对系统有较好的了解能预估出系统的瓶颈。性能测试有两种类型负载测试和压力测试负载测试Load Testing主要是测试软件系统是否达到需求文档设计的目标如软件在一定时期内最大支持多少并发用户数软件请求出错率等。关注点是在满足响应正常的条件下请求的极限值能有多高。压力测试Stress Testing主要是测试硬件系统是否达到需求文档设计的性能目标如在一定时期内系统的CPU利用率内存使用率磁盘I/O吞吐率网络吞吐量等。关注点是性能指标给定一个较高的基准系统的最好响应情况。压力测试压测时重点关注的指标并发用户数、TPS、RT、事务失败率、吞吐量、CPU和内存占用量。注意事项测试机与被测试机要分开不要对线上的服务器做压力测试负载测试一般情况是没有必要严格区别压力测试和负载测试目标都是为了评估系统的极限工作状态或者发现系统的性能瓶颈进一步做系统性能优化下面列举的工具一般情况下对这两种测试场景都是支持的。指标指标可简单分类为Web站点指标和服务器指标。Web站点指标包括QPSQuery Per Second每秒查询数指服务器每秒能响应的查询次数包括峰值QPS、平均QPS单机QPS、集群QPS等不同度量TPSTransaction Per Second每秒事务数。相对于查询事务一般指写请求PVPage View页面访问量即页面浏览量或点击量用户每次刷新或一定间隔后如5分钟即被计算一次。可分析服务访问日志计算得到UV Unique Visitor独立访客统计1天内访问站点的不同用户数。同样也可分析服务访问日志计算得到RTResponse Time响应时间是指系统对请求作出响应的时间一般取平均响应时间。可通过Nginx、Apache之类的Web Server得到。DAUDaily Active User日活跃用户数。常用于反映站点等运营情况。统计周期为一日不同公司站点对活跃的定义不一致MAUMonth Active User月活跃用户数服务器指标CPU使用率一般不应超过80%Mem同上文件句柄数Throughput吞吐量系统在单位时间内处理请求的数量可具化为TPS、QPS等吞吐率Requests per second总请求数/处理完成这些请求数所花时间延迟并发数Concurrency Level并发度并发连接数指系统同时能处理的请求数量或同时在线用户数等用户平均请求等待时间处理完成所有请求数所花费的时间/总请求数/并发用户数服务器平均请求等待时间处理完成所有请求数所花费的时间/总请求数目标发现系统的指标量级和性能瓶颈进一步为性能优化提供可视化的依据故而最好需要压测工具自带生成报告的能力站在管理员的角度考虑需要关注的性能点响应时间服务器资源使用情况是否合理应用服务器和数据库资源使用是否合理系统能否实现扩展系统最多支持多少用户访问、系统最大业务处理量是多少系统性能可能存在的瓶颈在哪里更换那些设备可以提高性能系统能否支持7×24小时的业务访问站在开发设计人员角度去考虑架构设计是否合理数据库设计是否合理代码是否存在性能方面的问题系统中是否有不合理的内存使用方式系统中是否存在不合理的线程同步方式系统中是否存在不合理的资源竞争分类性能测试看要测试什么对象如代码的执行性能接口的耗时单机的承载DB的读写极限等根据不同的待压测对象使用不同的工具代码JMH接口JMeterweb前端页面知识盲区DBsysbench应用类型CPU密集型应用IO密集型应用JMH另起一章参考基准测试工具JMH。JMeter另起一章参考JMeter学习笔记。Gatling官网使用ScalaJava实现、开源GitHub7K Star1.2K Fork压力测试神器官方宣言Load test as code即用代码方式做压力测试。从代码级别支持性能测试能生成丰富多彩的报告包含测试案例中收集的所有指标。同时提供脚本从命令行运行性能测试支持录制(record)功能。实战dependencygroupIdio.gatling/groupIdartifactIdgatling-core/artifactIdversion3.3.1/version/dependency每一个Gatling测试都要继承Simulation类importio.gatling.core.Predef._importio.gatling.http.Predef._importscala.concurrent.duration._classApiGatlingSimulationTestextendsSimulation{// 定义protocolval httpProtocolhttp.baseUrl(http://computer-database.gatling.io)// 相对路径的根路径.acceptHeader(text/html,application/xhtmlxml;q0.9,*/*;q0.8)// 通用头.doNotTrackHeader(1).acceptLanguageHeader(en-US,en;q0.5).acceptEncodingHeader(gzip, deflate).userAgentHeader(Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0)// 一个repeat对应一次模拟测试使用{}val scnscenario(InjectAndGet).repeat(1000,n){exec(http(AddPerson-API).post(http://localhost:8080/api).header(Content-Type,application/json).body(StringBody({firstName:John${n},lastName:Smith${n},birthDate:1980-01-01,address:{country:pl,city:Warsaw,street:Test${n},postalCode:02-200,houseNo:${n}}})).check(status.is(200)))// 或.pause(629 milliseconds).pause(Duration.apply(5,TimeUnit.MILLISECONDS))}.repeat(1000,n){exec(http(GetPerson-API).get(http://localhost:8080/api/${n}).check(status.is(200)))}// 30个并发用户测试10minsetUp(scn.inject(atOnceUsers(30))).maxDuration(FiniteDuration.apply(10,minutes)//.protocols(httpProtocol))}对于POST请求还支持formParam.exec(http(post-demo).post(/api).formParam(name,Beautiful Computer)// Note the triple double quotes: used in Scala for protecting a whole chain of characters (no need for backslash).formParam(introduced,2012-05-30))配置maven插件buildpluginsplugingroupIdio.gatling/groupIdartifactIdgatling-maven-plugin/artifactIdversion${gatling-plugin.version}/versionconfiguration!-- 测试脚本 --simulationClasscom.anoyi.test.ApiGatlingSimulationTest/simulationClass!-- 结果输出地址 --resultsFolder/Users/admin/code/gatling/resultsFolder/configuration/plugin/plugins/build执行命令mvn gatling:execute生成的所有HTML报告都可以在performance-test/build/gatling-results目录下找到abApache Benchmark统计功能强大。默认使用GET方法测试。实战Ubuntu安装sudo apt-get install apache2-utilsRedhat安装yum -y install httpd-tools命令格式ab -n 100 -c 10 http://10.34.216.49:8000/test常用参数-cconcurrency测试并发度即连接数 -t测试时间此时默认-n默认为50000 -n测试请求次数一般-t或-n选一个 -ppostfile读取json文本request需要一并使用-T-uputfile发送PUT请求时需要上传的文件需要一并使用-T -TContent-Type指明请求数据格式示例# 如果只用到一个Cookie只需键入命令ab n100C keyvalue http://test.com/# 如果需要多个Cookie就直接设Headerab-n100-HCookie: Key1Value1; Key2Value2http://test.com/比较重要的返回信息信息示例解读Concurrency Level1000并发数Time per request(mean)465.338[ms]所有并发用户都请求一次的平均时间Time request0.247[ms]单个用户请求一次的平均时间计算全部次数的均值Requests per second(mean)2148平均每秒请求数服务器的吞吐量Percentage of the requests served within a certain time(ms)95% 84695%的请求在846ms内返回可看95线99线测试POST方法时requestBody一般是JSON文本需要放入txt格式文件中且以括起来使用-p -T。测试遇到socket: Too many open files时需调整可打开文件句柄数ulimit -n 20480。问题无法直接在命令行测试不同URL只能测试一个URL输出结果格式无法修改wrk几乎纯C实现、开源GitHub40.4K Star3K Forkwrk只能运行在类Unix的系统上。git clone源码make编译make成功后同目录生成wrk文件可复制到bin目录。使用wrk选项被测HTTP服务的URL-c, --connections跟服务器建立并保持的TCP连接数量 -d, --duration压测时间 -t,--threads配置线程 -s, --script指定Lua脚本路径 -H, --header为每一个HTTP请求添加HTTP头 --latency在压测结束后打印延迟统计信息 --timeout超时时间 -v,--version打印正在使用的wrk的详细版本信息# 其中数字参数支持国际单位 (1k, 1M, 1G)# 其中时间参数支持时间单位 (2s, 2m, 2h)示例wrk -t8 -c200 -d30s --latency http://www.baidu.comSiege官网http://www.joedog.org一款HTTP/HTTPS负载测试和基准测试工具支持基本身份验证、Cookie、HTTP、HTTPS和FTP协议可配置模拟并发用户数。实战安装yum install siege -y安装成功与否查看版本siege -V帮助文档siege--help-C, --config查看siege当前的配置信息 -V, --version版权说明信息 -c,--concurrentNUM并行启动访问用户数默认是10 -t,--timeNUMm压力测试时间比如-t5表示持续时间是5分钟 -b, --benchmark基准测试请求之间没有延迟。 -g,--getget方式请求 -d,--delayNUM 时间延迟每个请求之间的延迟时间 -i,--internet模拟用户随机点击的URL -r,--repsNUM每个连接发出的请求数量与t有些类似两者设置一个即可 -f,--fileFILE对应一个文件这个文件里每一行为一个URL链接格式如 -m,--marktext在日志里标记的字符串标识 -H,--headertext在Header里增加的字符串标识 -A, --user-agenttext在user-agent里增加的字符串标识 -u,--urlURL设置被测Web的URL举例10个并发每个连接10个请求间隔1秒请求压测。siege-uwww.baidu.com-d1-r10-c10HTTP/1.12000.05secs:143913bytesGET /static/superman/js/lib/jquery-1-cc52697ab1.10.2.js Transactions:1017hits // 总处理数量 Availability:100.00% // 成功请求百分百 Elapsed time:10.06secs //总耗时 Data transferred:35.65MB //总传输数据量 Response time:0.03secs // 响应时间 Transaction rate:101.09trans/sec // 每秒处理请求数 Throughput:3.54MB/sec // 吞吐量 Concurrency:3.38// 并发数 Successful transactions:1017//成功处理次数 Failed transactions:0//请求失败数 Longest transaction:0.33// 请求最长耗时 Shortest transaction:0.00//请求最短耗时Locust官网使用Python语言写的分布式开源GitHub28.1K Star3.2K Fork压测工具。实战基于pip安装pip install locustio使用官方提供的云服务Locust Could。使用Locust时依赖的Python模块参考setup.pygevent在Python中实现协程的第三方库。协程又叫微线程Corouine。使用gevent可以获取极高的并发能力flaskPython的一个web开发框架和django相当requests支持http/https访问的库msgpack一种快速、紧凑的二进制序列化格式使用与类似json的数据pyzmqMQ中间件可以把Locust运行在多个进程或多个机器分布式geventhttpclient-wheelsConfigArgParsepsutilFlask-BasicAuth入门示例fromlocustimportHttpUser,task,betweenclassQuickstartUser(HttpUser):wait_timebetween(1,2)defon_start(self):self.client.post(/login,json{username:foo,password:bar})taskdefhello_world(self):self.client.get(/hello)self.client.get(/world)task(3)defview_item(self):foritem_idinrange(10):self.client.get(f/item?id{item_id},name/item)Locust压力测试使用总结Locust压测框架入门sysbench模块化跨平台以及多线程的DB性能测试工具参考