秒杀系统Web实践——04压力测试(性能测试JMeter)

第四章秒杀压测

目录

第四章秒杀压测

1.SpringBoot打包

1.1SpringBoot打jar包

1.2SpringBoot打war包

2.JMeter

2.1Windows下使用

2.2命令行下使用

3.自定义变量模式多用户

4.Redis压测工具redis-benchmark

综述


1.SpringBoot打包

1.1SpringBoot打jar包

注意把packaging标签改为jar,此标签也可不写,springboot默认打包方式为jar。

com.example
springboot-upload
0.0.1-SNAPSHOT
jar
//注意把packaging标签改为jar,此标签也可不写,默认打包方式为jar。
 

    
        
            org.springframework.boot
            spring-boot-maven-plugin
            
                true
            
        
    

使用idea打包: 在IDEA右侧Maven Projects栏双击package等待Build Success即可

使用命令行打包:

a.黑窗口cd到根目录(和pom.xmltarget同级),也可在idea工具中选择Terminal

  b.执行打包命令 mvn clean package (跳过测试类命令 mvn clean package -Dmaven.test.skip=true)

c.打包成功结果如下

秒杀系统Web实践——04压力测试(性能测试JMeter)_第1张图片

运行jar包

java -jar jar包的名字.jar

1.2SpringBoot打war包

pom.xml中把jar改成war,并且添加外置tomcat依赖

war



    org.springframework.boot
    spring-boot-starter-tomcat
    provided

在这里将 scope属性设置为provided,这样在最终形成的 WAR 中不会包含这个JAR包,因为TomcatJetty等服务器在运行时将会提供相关的API类。

在入口类中继承SpringBootServletInitializer并重写configure方法

@SpringBootApplication
public class SpringbootUploadApplication extends SpringBootServletInitializer {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringbootUploadApplication.class, args);
    }
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
        return builder.sources(SpringbootUploadApplication.class);
    }
}

输入命令 mvn clean package打包,把target目录下生成的war放到tomcatwebapps目录下即可。

运行tomcat就可以访问了

2.JMeter

2.1Windows下使用

基本结构有一个线程组包含:HTTP请求,HTTP请求默认值,CSV数据文件设置,聚合报告等。我们接下来说一下常用的操作。

线程组:可以设置线程数和循环次数

秒杀系统Web实践——04压力测试(性能测试JMeter)_第2张图片

HTTP请求默认值:常用于设置域名或ip、端口号、协议,还可以添加参数

秒杀系统Web实践——04压力测试(性能测试JMeter)_第3张图片

聚合报告:会显示吞吐率也就是我们常说的QPS

秒杀系统Web实践——04压力测试(性能测试JMeter)_第4张图片

CSV数据文件设置:从文件中读取数据

秒杀系统Web实践——04压力测试(性能测试JMeter)_第5张图片

数据文件如图

秒杀系统Web实践——04压力测试(性能测试JMeter)_第6张图片

而对应改变的就是http请求的参数

秒杀系统Web实践——04压力测试(性能测试JMeter)_第7张图片

2.2命令行下使用

1.在windows下录制好jmx,上传(设置好所用请求和参数)

2.命令行:sh jmeter.sh -n -t XXX.jmx -l result.jtl

3.把result.jtl导入jmeter

3.自定义变量模式多用户

public class UserUtil {
    private static void createUser(int count) throws Exception{
        List users = new ArrayList(count);
        //生成用户
        for(int i=0;i= 0) {
                bout.write(buff, 0 ,len);
            }
            inputStream.close();
            bout.close();
            String response = new String(bout.toByteArray());
            System.out.println(response);
            JSONObject jo = JSON.parseObject(response);
            String token = jo.getString("data");
            System.out.println("create token : " + user.getId());

            String row = user.getId()+","+token;
            raf.seek(raf.length());
            raf.write(row.getBytes());
            raf.write("\r\n".getBytes());
            System.out.println("write to file : " + user.getId());
        }
        raf.close();

        System.out.println("over");
    }

    public static void main(String[] args)throws Exception {
        createUser(5000);
    }
}

4.Redis压测工具redis-benchmark

Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。 你可以使用 redis-benchmark -h 来查看基准参数。

以下参数被支持:
 
Usage: redis-benchmark [-h ] [-p ] [-c ] [-n  [-k ]
 
 -h       Server hostname (default 127.0.0.1)
 -p           Server port (default 6379)
 -s         Server socket (overrides host and port)
 -a       Password for Redis Auth
 -c        Number of parallel connections (default 50)
 -n       Total number of requests (default 100000)
 -d           Data size of SET/GET value in bytes (default 2)
 -dbnum         SELECT the specified db number (default 0)
 -k        1=keep alive 0=reconnect (default 1)
 -r    Use random keys for SET/GET/INCR, random values for SADD
  Using this option the benchmark will expand the string __rand_int__
  inside an argument with a 12 digits number in the specified range
  from 0 to keyspacelen-1. The substitution changes every time a command
  is executed. Default tests use this to hit random keys in the
  specified range.
 -P         Pipeline  requests. Default 1 (no pipeline).
 -q                 Quiet. Just show query/sec values
 --csv              Output in CSV format
 -l                 Loop. Run the tests forever
 -t          Only run the comma separated list of tests. The test
                    names are the same as the ones produced as output.
 -I                 Idle mode. Just open N idle connections and wait.

1.redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000

向127.0.0.1的6379端口,100个并发连接,100000个请求

2.redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100

存取大小为100字节的数据包

3.redis-benchmark -t set,lpush  -q -n 100000

只测试部分操作

4.redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')" 

只测试某些数值存取的性能


综述

这一章节我们了解了JMeter,我们使用JMeter测试发现在目前,接口性能较差,QPS较低。我们使用redis-benchmark发现,redis的性能比数据库更加快速,说以,我们下一章节将对性能方面进行优化

你可能感兴趣的:(秒杀项目实战)