1。Foreword对于运维工程师来说,他们需要知道自己维护的服务器的性能瓶颈,比如我现在架构的每秒并发数,我的服务器能接受的最大并发数,是什么原因导致我的性能有问题;如果当前架构即将达到性能瓶颈,无论是水平扩展还是垂直扩展的性能都有很大的提升。如果要知道这些信息,需要做两方面的工作,一是测试服务器的性能,二是监控服务器的性能。通过服务器的性能测试:可以了解当前架构的性能瓶颈,也可以测试架构的水平扩展和垂直扩展,为后期的架构扩展提供数据参考。通过监控服务器的性能:可以知道当前服务器的CPU、内存、IO等资源是否耗尽。我们可以在监控系统中添加触发器。一旦服务器资源即将达到瓶颈,我们可以触发告警,让服务器可以由维护人员处理,也可以触发架构自动扩容(如果是云平台,直接调用api创建主机,并部署应用程序和程序)。本文将介绍我在工作中使用jmeter测试性能瓶颈的一些实践。本文的性能测试适用于移动互联网架构,非移动互联网架构还有其他更好的测试方法。2、Jmeter分布式压测介绍在工作中使用jmeter做大并发压测的场景下,单机的内存、CPU、网络IO是有限的,服务器压力还没有增加,但是压力由于压力太大,测试服务器已经模拟了。大崩溃。为了让jmeter工具提供更强大的负载能力,jmeter提供了多台机器同时产生负载的机制。下面是架构图。原理:比如我在jmeter服务器上配置线程数为10,循环数为100,就会向测试服务器发起1000次请求。我有3个代理服务器。如果我选择在服务器端远程启动压力测试,那么每个代理都会向测试服务器发起10*100次请求,所以这次压力测试产生的请求是10*100*3=3000次。如果你对原理不是很了解,看完下面的操作你就会明白了。3、Jmeter分布式压力测试环境搭建3.1.搭建前服务器环境说明:可根据需要直接在云平台购买压机进行性能测试,测试结束后释放压机。分布式环境压力服务器要求:需要server(控制机)和agent(压力机),agent搭建在linux(centos6.5)服务器环境,server搭建在windows(server2012)环境。压力测试的瓶颈主要是带宽。需要保证压机的带宽高于服务器的带宽,否则压力不会增加。需要保证agent和server都在同一个网络,在多网卡环境下,需要保证启动的网卡都在同一个网段。需要保证服务器和代理之间的时间同步。关闭防火墙。3.2.jmeter的windows部署(1)部署jdk环境,配置path变量,安装完成如下(2)直接去官网下载最新的二进制源码包。(3)将jmeter解压到指定目录,设置路径变量,安装完成后,在命令行运行jmeter命令。如果jmeter可以正常启动,说明环境配置没问题。3.3.Linux部署jmeter(一)下载安装wgethttp://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-3.1.zipunzipapache-jmeter-3.1.zip-d/usr/local/cd/usr/local/ln-sapache-jmeter-3.1/jmeter(2)配置启动脚本#!/bin/bash#chkconfig:3452674#description:jmeteragentmyip=`ifconfigeth0|awk'/inetaddr/{gsub(/addr:/,"");print$2}'`cmd="/usr/local/jmeter/bin/jmeter-server-Djava.rmi.server.hostname=$myip"start(){$cmd&}stop(){jmeter_pid=`psaux|grepjmeter服务器|grep-vgrep|awk'{print$2}'`forpidin$jmeter_pid;dokill-9$piddone}act=$1case$actin'start')start;;'停止')停止;;'重启')停止睡眠2开始;;*)echo'[开始|停止|重启]';;esac(3)启动jmeteragent服务,验证是否监听1099端口[root@jmeter-agent-01~]#/etc/init.d/jmeter-agentstart[root@jmeter-agent-01~]#netstat-lntp|grep1099tcp000.0.0.0:10990.0.0.0:*听414/java3.4。分布式环境配置(1)确保server和agnet安装正确(2)agent启动,监听1099端口。(3)在server机器jmeter安装目录下的bin目录下,找到properties文件,修改远程主机选项,并添加3个代理服务器的地址。(4)启动jmeterserver,多网卡模式需要指定IP地址启动jmeter-Djava.rmi.server.hostname=192.168.10.61(5)验证分布式环境是否搭建成功1.jmeter启动后,在下面的选项中,会出现你添加的远程主机列表2.创建请求测试:创建访问百度的请求,访问次数为1,配置如下:直接点击启动,jmeterservermachine发起请求,结果如下请求完之前所有的请求数据,选择remotestartall后,发起的请求次数为3次,即每个代理服务器根据服务器的配置请求一次。如果你的环境选择全部启动后没有报错,并且发起的请求数与agent服务器数相同,说明jmeter分布式压力测试环境已经搭建成功,可以进行测试了。4.Jmeter断言4.1.断言介绍常用的jmeter断言有两种,一种是响应断言,一种是响应时间断言,如果响应内容不符合断言的配置,则认为请求失败。响应断言:判断响应内容是否包含指定的字符信息,用于判断api接口返回的内容是否正确。响应时间断言:判断响应时间是否超过预期时间,用于判断API接口的返回时间是否超过预期时间。4.2.断言配置(1)修改http为实际api测试请求。(2)如何添加断言:在测试计划的http请求上右击,选择Add→Assertion→AddResponseAssertionandAssertionDuration。(3)配置响应断言:我们的接口正常返回code值为2000,如果接口返回的code值不是2000,说明接口异常。为了测试,这里修改为表示接口返回非2222的code值,表示访问失败。(4)配置断言响应时间:如果请求接口时间设置超过1毫秒,则认为请求失败。(5)验证断言配置:当发起http请求时,返回内容码值不是2222,访问时间超过1毫秒,则认为访问失败。5.Jmeter变量配置变量使用场景示例:我们需要测试性能曲线模型,即从轻压到重压,来测试我们的性能拐点。这时候jmeter需要配置多个线程组。每个线程组需要设置http请求,如下图;由于每次测试性能的曲线模型都是同一个接口,所以每次修改接口,都需要修改http请求。如果此时使用变量,则意味着每次修改api只需要修改api的变量即可。如何设置变量:测试计划中参考变量:6.Jmeter性能测试结果分析下面是我进行了性能曲线模型测试(请求从每秒3000增加到30000)的聚合报告:看看就可以了看到性能拐点是27000请求/秒,TPS处理能力可以达到6000/秒,99%的用户响应时间是60毫秒,最大响应时间是71毫秒。性能还是不错的。并发瓶颈:当请求从每秒27000增加到30000时,我们的TPS从6000下降到4500。我们可以看到并发瓶颈是每秒最多6000个请求。响应时间:可以看到TPS保持在3500以下,99%的用户响应时间为11毫秒。随着TPS的增加,我们的响应时间也会增加。可以看出,当我们的TPS以每秒3500响应时,响应时间Time是没有影响的。请注意,这只是我业务中的接口之一。我们在生产中有数百个接口。不同的接口返回数据和代码逻辑,以及执行SQL。如果你需要做性能测试,你应该选择一个热点接口。对每个接口进行性能测试,得出结果后具体分析性能瓶颈是什么?聚合报告参数说明:单位为毫秒label:定义HTTP请求名称Samples:表示本次测试发送了多少个请求Average:平均响应时间——默认为单个请求的平均响应时间Median:中位数,也就是50%用户的响应时间为90%Line:90%用户的响应时间Min:被访问页面的最小响应时间Max:被访问页面的最大响应时间Error%:错误请求数/总请求数Throughput:默认表示每秒完成的请求数(requestpersecond)KB/Sec:每秒从服务器接收的数据量7.测试过程中的监控7.1.并发测试监控并发测试直接发起指定数量的请求,比如100000一起请看一下系统的处理能力。如果此时需要服务器的资源使用信息,则不能使用zabbix监控系统,因为一般处理10万个请求对我们来说20秒就可以处理完,但是zabbix数据采集是每分钟一次,采集的数据在这种方式显然是不准确的,所以需要使用系统自带的监控命令实时查询服务器的性能。例如,可以使用dstat或glances等动态监控命令来分析系统的性能。补充:并不是每个接口都需要实时测试。比如我的大部分接口都能达到5000TPS,但是有一个接口只能达到2000,这时候就需要在测试的时候实时监控,看看到底是什么原因导致性能不好。是不是因为返回的数据太大,导致网络带宽被占满;或者SQL执行时间过长,导致数据库负载过高,或者代码有问题导致web服务占用大量cpu。7.2.稳定性测试监控稳定性测试是连续模拟指定数量的请求访问服务器。例如,我每秒向测试服务器发送4000个请求,持续12小时,以查看服务器发生了什么情况。这时候就需要用到zabbix进行监控了。下面是我用来做性能测试的部分监控界面,包括tomcat每秒请求数、服务器入口流量、整个集群每分钟请求数的http状态码统计、服务器资源使用信息。欢迎大家关注我的微信公众号【移民哥技术之路】,最新2TB技术干货:包括架构师实战教程、大数据、Docker容器、系统运维、数据库、redis、MogoDB、电子书,Java基础课程,Java实战项目,ELKStack,机器学习,BAT面试精讲视频等。只需在“打工哥技术之路”微信公众号对话框回复关键字:1024即可获取全部资料.
