阅读 335

测试篇-压力测试工具tsung安装与简单使用

前言

一直想撸测试专题的,拖了很久,这次终于抽时间安排上了。做为一名合格的开发人员,掌握一种压测工具,并切实应用到实践环境中,并以此不断迭代,以压力测试驱动推动开发后端应用处理性能逐渐完善。这是一种常用的手段。只有通过压力测试界定了系统能够承载具体的容量上限,才能从容应对业务的运营需要,扩容或缩容,心中有底。

目前成熟的支持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语言开发的,我们下载源码安装

  1. 初始化下载目录并进入目录

    mkdir -p /download
    cd /download
    复制代码
  2. 安装依赖项

    yum install -y epel-release
    复制代码
  3. 下载软件包

    wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
    复制代码
  4. 添加存储库条目

    rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
    复制代码
  5. 安装erlang

    yum install -y erlang
    复制代码
  6. 验证是否安装成功

    erl -version
    复制代码

安装tsung

Mac OS 可以使用brew install tsung安装

Ubuntu 可以使用apt-get install tsung安装

其他系统需要下载源码安装,源码包下载地址,这里安装的是tsung-1.7.0版本:

  1. 初始化下载目录并进入目录

    mkdir -p /download
    cd /download
    复制代码
  2. 下载源码

    wget http://tsung.erlang-projects.org/dist/tsung-1.7.0.tar.gz
    复制代码
  3. 解压

    tar -zxf tsung-1.7.0.tar.gz
    复制代码
  4. 进入源码目录

    cd tsung-1.7.0
    复制代码
  5. 配置,生成Makefile

    ./configure                  
    复制代码
  6. 编译

    make
    复制代码
  7. 安装

    make install                  
    复制代码
  8. 验证安装是否成功

    tsung -h
    复制代码

    image-20200819170938672

  9. 常用目录说明

    • /usr/share/doc/tsung/examples 样例目录
    • $HOME/.tsung/log 日志目录
    [root@localhost ~]# find / -name http_simple.xml
    /usr/share/doc/tsung/examples/http_simple.xml
    复制代码

    image-20200819170756077

    image-20200819170712119

安装生成报表需要的依赖

tsung执行后会生成日志,然后使用tsung_stats.pl工具生成报表-静态文件

  1. 安装gnuplot初

    yum install -y gnuplot
    复制代码
  2. 安装 perl

    yum install -y perl
    复制代码
  3. 安装perl-Template-Toolkit

    yum install -y perl-Template-Toolkit
    复制代码

安装nginx

想查看报表中的静态文件,需要搭个简易的静态资源服务器,这里使用nginx。

  1. gcc安装

    yum install -y gcc-c++
    复制代码
  2. PCRE pcre-devel安装

    yum install -y pcre pcre-devel
    复制代码
  3. zlib安装

    yum install -y zlib zlib-devel
    复制代码
  4. OpenSSL 安装

    yum install -y openssl openssl-devel
    复制代码
  5. 初始化下载目录并进入目录

    mkdir -p /download
    cd /download
    复制代码
  6. 下载源码包

    wget https://nginx.org/download/nginx-1.16.1.tar.gz
    复制代码
  7. 解压

    tar -zxvf nginx-1.16.1.tar.gz
    复制代码
  8. 进入源码目录

    cd nginx-1.16.1
    复制代码
  9. 配置,生成Makefile

    ./configure
    复制代码
  10. 编译

    make
    复制代码
  11. 安装

    make install
    复制代码
  12. 启动

    # 进入目录
    cd /usr/local/nginx/sbin/
    # 启动
    ./nginx 
    复制代码

    其他命令:

    # 停止
    ./nginx -s stop
    # 退出
    ./nginx -s quit
    # 重载配置
    ./nginx -s reload
    复制代码
  13. 验证

    访问验证前要先进行防火墙设置,当然,最简单的方式就是关闭防火墙。

    • 罗列当前开放端口

      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
      复制代码

image-20200819182933443

浏览器访问:

image-20200819183018814

其他命令:

# 删除端口
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服务为样例做说明。

  1. 创建工作目录

    mkdir -p /test
    复制代码
  2. 新增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
       
    复制代码
  3. 开始压测

    tsung -f /test/helloworld.xml start
    复制代码
  4. 查看实时日志

 tail -f  ~/.tsung/log/$(ls -t ~/.tsung/log/ | awk 'NR==1')/tsung.log
复制代码

image-20200819191825571

image-20200819191803565

运行过程中浏览器访问http://ip:8091可查看实时结果

image-20200819191904882

  1. 生成报表

    日志目录格式: /root/.tsung/log/20200819-1917

    这里时候一些命令技巧,按目录降序,然后取第一行

    1. 创建生成报表存放目录,并进入

      mkdir -p /usr/local/nginx/html/result
      cd /usr/local/nginx/html/result
      复制代码
    2. 生成报表

      生成报表使用的是tsung_stats.pl,如果找不到的可使用find命令进行文件搜索。

    /usr/lib/tsung/bin/tsung_stats.pl --stats ~/.tsung/log/$(ls -t ~/.tsung/log/ | awk 'NR==1')/tsung.log
    复制代码

    image-20200819192941259

  2. 浏览器访问

    http://ip/result/report.html

    image-20200819193235994

    image-20200819193256959

小结

本文主要是先安装压测环境tsung,然后跑了一个简单的压测样例。并没有对tsung进行过多的介绍,下一篇会对tsung的xml配置和报表收集的数据进行详细说明。当然,后续会围绕这个压测工具对springboot的hello进行压测调优,感兴趣的小伙伴可以关注一下。

相关文章

测试篇-压测工具tsung详解