前言
一直想撸测试专题的,拖了很久,这次终于抽时间安排上了。做为一名合格的开发人员,掌握一种压测工具,并切实应用到实践环境中,并以此不断迭代,以压力测试驱动推动开发后端应用处理性能逐渐完善。这是一种常用的手段。只有通过压力测试界定了系统能够承载具体的容量上限,才能从容应对业务的运营需要,扩容或缩容,心中有底。
目前成熟的支持TCP、HTTP等连接通道的压测工具不少,以前接触过Apache Jmeter,然后最近接触了Tsung,发现这个使用更方便些,所以就强力推荐了。
为什么选择Tsung?
- 基于Erlang,并发处理性能好,可以模拟足够多海量用户,只要你有足够多的机器
- 受益于Erlang,天然支持分布式,很欢快的运行在一个集群中
- 支持协议众多 WebDAV/WebScoket/MQTT/MySQL/PGSQL/Shell/AQMP/JABBER/XMPP/LDAP 等
- 传输通道支持 TCP/UDP/SSL,更底层支持IPv4/IPv6
- 支持单机绑定多个IP:无论是虚拟IP,还是物理网卡绑定IP,可以突破单机端口65535的限制,扩展尽可能多的网络连接出口地址
- 支持监控被压测的服务器,通过Erlang Agent/SNMP/Munin
- 压测细节XML可配置,这是一个完全基于情景的压力测试行为清单,依赖于你的想象,呈现完整业务的表达
- 场景可以是动态的,来自于文件、代码或者服务器响应可以构成下一个请求的参数,这就是可编程的请求嘛
- 行为可以混搭,会话可以在不同场景中,按照不同的行为规范各自平行进行
- 休眠,或暂停机制,是可以随机的,亲
- 压测用户产生方式,动态有序或随机
总之,Tsung是一款开源的高性能分布式压力测试工具,支持可编程的情景化测试方案,要向发挥它的特性,依赖于人们的想象力和创造性。
引用自:Tsung笔记之开篇
为什么要压力测试驱动?
软件/系统架构往往着眼于总体结构,这个可以是一个逐渐完善的过程。这种自我的不断完善的驱动往往来自于实践、线上考验。而压力测试可以提供一种推动,尽心尽力暴露着架构在性能容量存在的一些不足和缺陷,促使着向着更好的方向发展。
系统的构建依赖于具体参与执行的人,就算是一群资深的工程师,业务上每一次功能的快速更迭、任何潜在局部修改都会导致影响、拖垮整体性能,这就是人们常说的 ”蝴蝶效应“,牵一发而动全身。
如何提早感知并且提早修复,这就需要压力测试的驱动,并且压力测试应该成为一个常规化的例行行为,日常化的动作。在每一次修改之后,都要过一轮的压测的碾压之后,提供当前后端应用处理的性能、容量等具体指标,用于指导后续业务上线业务的开展。
引用自:Tsung笔记之开篇
环境准备
查看当前版本:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
Centos7是最小化安装的,需要安装一些工具
yum install -y wget
安装erlang环境
tsung是使用erlang语言开发的,我们下载源码安装
-
初始化下载目录并进入目录
mkdir -p /download cd /download -
安装依赖项
yum install -y epel-release -
下载软件包
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm -
添加存储库条目
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm -
安装erlang
yum install -y erlang -
验证是否安装成功
erl -version
安装tsung
Mac OS 可以使用brew install tsung安装
Ubuntu 可以使用apt-get install tsung安装
其他系统需要下载源码安装,源码包下载地址,这里安装的是tsung-1.7.0版本:
-
初始化下载目录并进入目录
mkdir -p /download cd /download -
下载源码
wget http://tsung.erlang-projects.org/dist/tsung-1.7.0.tar.gz -
解压
tar -zxf tsung-1.7.0.tar.gz -
进入源码目录
cd tsung-1.7.0 -
配置,生成Makefile
./configure -
编译
make -
安装
make install -
验证安装是否成功
tsung -h -
常用目录说明
/usr/share/doc/tsung/examples样例目录$HOME/.tsung/log日志目录
[root@localhost ~]# find / -name http_simple.xml /usr/share/doc/tsung/examples/http_simple.xml
安装生成报表需要的依赖
tsung执行后会生成日志,然后使用tsung_stats.pl工具生成报表-静态文件
-
安装gnuplot初
yum install -y gnuplot -
安装 perl
yum install -y perl -
安装perl-Template-Toolkit
yum install -y perl-Template-Toolkit
安装nginx
想查看报表中的静态文件,需要搭个简易的静态资源服务器,这里使用nginx。
当然也可以使用 如下命令开启一个简单的python服务:
python -m SimpleHTTPServer
-
gcc安装
yum install -y gcc-c++ -
PCRE pcre-devel安装
yum install -y pcre pcre-devel -
zlib安装
yum install -y zlib zlib-devel -
OpenSSL 安装
yum install -y openssl openssl-devel -
初始化下载目录并进入目录
mkdir -p /download cd /download -
下载源码包
wget https://nginx.org/download/nginx-1.16.1.tar.gz -
解压
tar -zxvf nginx-1.16.1.tar.gz -
进入源码目录
cd nginx-1.16.1 -
配置,生成Makefile
./configure -
编译
make -
安装
make install -
启动
# 进入目录 cd /usr/local/nginx/sbin/ # 启动 ./nginx其他命令:
# 停止 ./nginx -s stop # 退出 ./nginx -s quit # 重载配置 ./nginx -s reload -
验证
访问验证前要先进行防火墙设置,当然,最简单的方式就是关闭防火墙。
-
罗列当前开放端口
firewall-cmd --list-ports -
开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent -
开放8091端口
- 默认情况下,控制节点会启动一个嵌入的网站服务器,侦听
8091端口(可以用-n选项禁用)
firewall-cmd --zone=public --add-port=8091/tcp --permanent - 默认情况下,控制节点会启动一个嵌入的网站服务器,侦听
-
重载配置
firewall-cmd --reload -
重新查看开放端口
firewall-cmd --list-ports
-
浏览器访问:
其他命令:
# 删除端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
#centos7启动防火墙
systemctl start firewalld.service
#centos7停止防火墙/关闭防火墙
systemctl stop firewalld.service
#centos7重启防火墙
systemctl restart firewalld.service
#设置开机启用防火墙
systemctl enable firewalld.service
#设置开机不启动防火墙
systemctl disable firewalld.service
Tsung样例
为了方便,这里以本地nginx服务为样例做说明。
-
创建工作目录
mkdir -p /test -
新增xml配置
这里的样例是使用
/usr/share/doc/tsung/examples/http_simple.xml文件修改的。cat << EOF > /test/helloworld.xml <?xml version="1.0"?> <!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd"> <tsung loglevel="notice" version="1.0"> <!-- Client side setup --> <clients> <client host="localhost" use_controller_vm="true" maxusers="10000"> </client> </clients> <!-- Server side setup --> <servers> <server host="localhost" port="80" type="tcp" weight="1"></server> </servers> <!-- to start os monitoring (cpu, network, memory). Use an erlang agent on the remote machine or SNMP. erlang is the default --> <monitoring> <monitor host="localhost" type="snmp"></monitor> </monitoring> <load> <!-- several arrival phases can be set: for each phase, you can set the mean inter-arrival time between new clients and the phase duration --> <arrivalphase phase="1" duration="60" unit="minute"> <users maxnumber="100000" arrivalrate="5000" unit="second"></users> </arrivalphase> </load> <options> <option type="ts_http" name="user_agent"> <user_agent probability="80">Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21</user_agent> <user_agent probability="20">Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4</user_agent> </option> </options> <!-- start a session for a http user. the probability is the frequency of this type os session. The sum of all session's probabilities must be 100 --> <sessions> <session name="http-example" probability="100" type="ts_http"> <!-- full url with server name, this overrides the "server" config value --> <transaction name="hello"> <request subst="true"> <http url="/" method="GET"> </http> </request> </transaction> </session> </sessions> </tsung> EOF -
开始压测
tsung -f /test/helloworld.xml start -
查看实时日志
tail -f ~/.tsung/log/$(ls -t ~/.tsung/log/ | awk 'NR==1')/tsung.log
运行过程中浏览器访问http://ip:8091可查看实时结果
-
生成报表
日志目录格式:
/root/.tsung/log/20200819-1917这里时候一些命令技巧,按目录降序,然后取第一行
-
创建生成报表存放目录,并进入
mkdir -p /usr/local/nginx/html/result cd /usr/local/nginx/html/result -
生成报表
生成报表使用的是
tsung_stats.pl,如果找不到的可使用find命令进行文件搜索。
/usr/lib/tsung/bin/tsung_stats.pl --stats ~/.tsung/log/$(ls -t ~/.tsung/log/ | awk 'NR==1')/tsung.log -
-
浏览器访问
http://ip/result/report.html
小结
本文主要是先安装压测环境tsung,然后跑了一个简单的压测样例。并没有对tsung进行过多的介绍,下一篇会对tsung的xml配置和报表收集的数据进行详细说明。当然,后续会围绕这个压测工具对springboot的hello进行压测调优,感兴趣的小伙伴可以关注一下。