Java基础之《JVM性能调优(15)—系统并发性能jmeter压测》

一、估算系统的性能最大吞吐量

1、首页获取商品列表
模拟APP首页产生10KB的数据。

2、在https://start.spring.io/生成一个springboot项目
添加:ItemVO.java

package com.example.demo;

public class ItemVO {
    private int id;

    private String name;

    private String city;

    private int price;

    private int number;

    private String picture;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }
}

添加:ItemController.java

package com.example.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ItemController {

    @RequestMapping("/home")
    public List<ItemVO> home() throws InterruptedException {
        byte[] bytes1 = new byte[1024*5];
        //模拟业务操作,睡5毫秒
        Thread.sleep(5);
        byte[] bytes2 = new byte[1024*5];
        //模拟业务操作,睡5毫秒
        Thread.sleep(5);

        List<ItemVO> lists = getItems();
        return lists;
    }

    private List<ItemVO>getItems() {
        List<ItemVO> lists = new ArrayList<>();
        for(int i=0; i<10; i++) {
            ItemVO item = new ItemVO();
            item.setId(i+1000);
            item.setName("商品"+i);
            item.setCity("上海");
            item.setNumber(i);
            item.setPrice(i);
            item.setPicture("http://www.picture.com");
            lists.add(item);
        }
        return lists;
    }

}

外部配置文件:application.properties

server.port=8080

3、上传文件到服务器,并启动
java -jar -Xms200m -Xmx200m -Dspring.config.location=/appserver/application.properties demo-0.0.1-SNAPSHOT.jar &

4、访问地址http://IP地址:8080/home

5、第一步:估算QPS理论值
先看单次请求多少毫秒
假设是200毫秒

QPS = 1000 / 200 = 5
所以压测的时候,在5左右上下浮动,是对的,和这个值偏离太多就要找原因。

1条线程,QPS = 5
10条线程,QPS = 50
100条线程,QPS = 500
200条线程,QPS = 1000

二、采用jmeter压测,验证系统吞吐量最大理论值

1、jmeter
jmeter是基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。
https://jmeter.apache.org/

2、运行
windows下运行jmeter.bat

3、操作
1)设置语言
Options - Choose Language - Chinese

2)设置名称:demo测试

3)添加线程组
demo测试 - 右键 - 添加 - 线程(用户) - 线程组
线程数:200
Ramp-Up时间(秒):1
循环次数:500(假设我们要10万并发)

4)添加结果报告
线程组 - 右键 - 添加 - 监听器 - 查看结果树
线程组 - 右键 - 添加 - 监听器 - 汇总报告
线程组 - 右键 - 添加 - 监听器 - 聚合报告

5)添加HTTP请求
线程组 - 右键 - 添加 - 取样器 - HTTP请求

协议:http,服务器名称或IP:192.168.3.203,端口号:8080
HTTP请求:GET,路径:/home
去掉跟随重定向、使用KeepAlive

三、第一次压测(验证单条线程的最大QPS)

1、改tomcat配置文件
只配1条线程:

server.port=8080
server.tomcat.threads.max=1

2、内存给512M
年轻代=170M(Eden=136M,survivor0=17M,survivor1=17M)
老年代=341M
体验下效果

3、重新打包,名称为demo-0.0.1-SNAPSHOT-1.jar
java -jar -Xms512m -Xmx512m -Dspring.config.location=/appserver/application.properties demo-0.0.1-SNAPSHOT.jar &

4、jmeter点击启动

5、报告
1)汇总报告

吞吐量是86,远远大于预计的5,这是为啥

2)查看结果树
勾选仅错误日志,查看错误

四、分别测试
1条线程:吞吐量80
10条线程:吞吐量95
    错误Connection timed out: connect
    错误Connection refused: connect
100条线程:吞吐量85
    错误Connection timed out: connect
    错误Connection refused: connect
200条线程:吞吐量86
    错误Connection timed out: connect
    错误Connection refused: connect
    错误Read timed out

五、tomcat线程
tomcat用的是nio模式,如果最大线程设置为10,则exec线程有10个

 1924 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.22 http-nio-8080-e                                                                                                                     
 1925 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1926 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1927 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1928 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1929 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1930 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1931 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1932 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1933 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.00 http-nio-8080-e                                                                                                                     
 1934 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.01 http-nio-8080-P                                                                                                                     
 1935 root      20   0 2587756 281976  13540 S  0.0 15.0   0:00.01 http-nio-8080-A

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值