Java秒杀实战 (四)JMeter压测

转自:https://blog.csdn.net/qq_41305266/article/details/81071278、

一、JMeter入门

下载链接 http://jmeter.apache.org/download_jmeter.cgi

添加线程组

设置http请求默认值

添加待压测的http请求

添加聚合报告监听器

启动测试

1000个线程,循环10次,即10000个请求

二、redis 压测

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

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‘,‘set‘)"

三、SpringBoot打war包

pom添加依赖

<!-- provided表示 编译时依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
启动类gen更改如下:

package com.wings.seckill;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class MainApplication extends SpringBootServletInitializer{

public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);

}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(MainApplication.class);
}
}
三、JMeter命令行

总体思路:

1.在windows上录好jmx;

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

3.把result.jtl导入到jmeter

pom文件去掉war包相关依赖及插件,添加以下插件

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
入口类改回最清爽模式

package com.wings.seckill;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class MainApplication{

public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);

}
}
批量新增用户相关辅助类

package com.wings.seckill.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class DBUtil {

private static Properties props;

static {
try {
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("application.properties");
props = new Properties();
props.load(in);
in.close();
}catch(Exception e) {
e.printStackTrace();
}
}

public static Connection getConn() throws Exception{
String url = props.getProperty("spring.datasource.url");
String username = props.getProperty("spring.datasource.username");
String password = props.getProperty("spring.datasource.password");
String driver = props.getProperty("spring.datasource.driver-class-name");
Class.forName(driver);
return DriverManager.getConnection(url,username, password);
}
}
package com.wings.seckill.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.wings.seckill.domain.SeckillUser;

public class UserUtil {

private static void createUser(int count) throws Exception {
List<SeckillUser> users = new ArrayList<SeckillUser>(count);
// 生成用户
for (int i = 0; i < count; i++) {
SeckillUser user = new SeckillUser();
user.setId(13000000000L + i);
user.setLoginCount(1);
user.setNickname("user" + i);
user.setRegisterDate(new Date());
user.setSalt("1a2b3c");
user.setPassword(Md5Util.inputPass2DbPass("123456", user.getSalt()));
users.add(user);
}
System.out.println("create user");
/* // 插入数据库
Connection conn = DBUtil.getConn();
String sql = "insert into seckill_user(login_count, nickname, register_date, salt, password, id)values(?,?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
for (int i = 0; i < users.size(); i++) {
SeckillUser user = users.get(i);
pstmt.setInt(1, user.getLoginCount());
pstmt.setString(2, user.getNickname());
pstmt.setTimestamp(3, new Timestamp(user.getRegisterDate().getTime()));
pstmt.setString(4, user.getSalt());
pstmt.setString(5, user.getPassword());
pstmt.setLong(6, user.getId());
pstmt.addBatch();
}
pstmt.executeBatch();
pstmt.close();
conn.close();
System.out.println("insert to db");*/
// 登录,生成token
String urlString = "http://localhost:8080/login/do_login";
File file = new File("D:/tokens.txt");
if (file.exists()) {
file.delete();
}
RandomAccessFile raf = new RandomAccessFile(file, "rw");
file.createNewFile();
raf.seek(0);
for (int i = 0; i < users.size(); i++) {
SeckillUser user = users.get(i);
URL url = new URL(urlString);
HttpURLConnection co = (HttpURLConnection) url.openConnection();
co.setRequestMethod("POST");
co.setDoOutput(true);
OutputStream out = co.getOutputStream();
String params = "mobile=" + user.getId() + "&password=" + Md5Util.inputPass2FormPass("123456");
out.write(params.getBytes());
out.flush();
InputStream inputStream = co.getInputStream();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte buff[] = new byte[1024];
int len = 0;
while ((len = inputStream.read(buff)) >= 0) {
bout.write(buff, 0, len);
}
inputStream.close();
bout.close();
String response = new String(bout.toByteArray());
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);
}
}
JMeter添加CSV文件

优化前结果:

1000 * 10

QPS:109

出现超卖现象:

原文地址:https://www.cnblogs.com/sharpest/p/10960374.html

时间: 2024-11-10 21:24:17

Java秒杀实战 (四)JMeter压测的相关文章

java多线程&amp;&amp;Jmeter压测实现

笔者最近在看jmeter源码,对多线程处理部分的了解记录如下. Part1 线程与多线程概念 提到线程先来看一下进程(线程的容器)的概念,进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示. 对于jmeter来说,运行中的jmeter程序实例便是一个进程.而该进程中会包含大量线程. 线程是程序执行流的最小单位,是一组命令的集合.在jmeter中一

jmeter压测网站

1.Jmeter介绍 Jmeter是apache组织开发的基于java的压力测试工具. Jmeter可以用于对服务器.网络活对象模拟巨大的负载,来自不同压力类别下测试他们的强度和分析整体性能.另外,jmeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果.为了最大限度的灵活性,jmeter允许使用正则表达式创建断言. 2.Jmeter工作原理 image001 3.Jmeter安装 实验环境:系统:centos6.6 64位Java:1.8.0_65Jm

jmeter压测、操作数据库、分布式linux下运行、webservice接口测试、charles抓包

一.jmeter压测 在线程组中设置好,然后添加http请求,t添加聚合报告查看压力测试结果,如图: 一般压测时间10-15分钟,如果是稳定性测试,一般n*12小时,这些并发用户一直在请求. tps:服务端每秒钟能处理的请求数. 响应时间:就是你从发出请求到服务端返回给你数据的时间. 二.jmeter操作数据库 在测试计划中添加mysql-connector-java-5.1.7-bin.jar 最后添加查看结果树.如果既要查询又要修改操作选择Callable Statement这个模式. 断言

jmeter压测学习1-window环境准备与案例

前言 最近用jmeter做一些接口的压力测试,记录下使用过程中遇到的一些问题. 在使用window机器做并发压测的时候,发现并发数设置100的时候,会出现报错:java.net.SocketException: Socket operation on nonsocket: connect 环境准备: java 1.8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境,需安装JDK1.8环境,JDK环境安装网上一大堆教程,自己去想办法吧,我这里就不多说了. jmeter

jmeter压测app

使用代理的方式,录制app端脚本,之后用jmeter压测就没啥好说的了 1.电脑端谷歌设置本地代理(端口号为8888) 2.jmeter设置HTTP代理服务器(端口号为8888) 3.手机端wifi设置HTTP手动代理(服务器为电脑的IP,端口号为8888) 4.jmeter启动代理 5.手机端登陆使用app,jmeter录制到了脚本

jmeter压测

压测指标:TPS/QPS,响应时间 jmeter压测设置 jmeter压测结果监听器添加 jmeter压测结果查看(Samples:请求次数,Average:平均响应时间/ms,Throughput:TPS) jmeter加压力机(压力机之间能ping通) 各压力机下bin执行jmeter-server.bat,启动 修改jmeter.properties中remote_hosts参数添加压力机IP和端口(端口默认1099),示例如下 remote_hosts=localhost:1099,10

手把手教你jmeter压测--适合入门

[后台测试]手把手教你jmeter压测 我知道我迟早是要踏上了后台测试之路的,只是没想到来的这么突然.新接手了一个项目,在第一版发出后,产品需要做运营活动拉量,因为我担心突然的流量涌入是否会对后台造成压力呢?因此决定做一下压测: 下面就一步一步的介绍我从0到1的压测过程吧. 我下载的是 apache-jmeter-2.13,因为这个包下载下来通用linux和windows的,所以我们现在windows下打开它. 直接点击bat,打开jmeter: 添加一个线程组: 添加完成之后,先设置这两项:

java编写jmeter压测脚本

目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJavaSamplerClient 设置请求参数,这些参数在导入进jmeter之后会在java请求页面显示出来 具体的请求方法可以写在test方法里,获取请求的结果resultData,然后对resultData里的内容解析,判断接口调用成功or失败 将项目导出成jar包,导入到jmeter中,在jmete

JMeter压测分布式部署

监控JMeter压力机的性能 netstat -an | find "TCP" /C 处理过程: 一:调度机master启动以后,会拷贝本地的jmx文件分发到远程的slave机器上: 二:slave机器拿到脚本以后启动命令行模式去执行脚本,对于每台slave机器拿到的脚本都是一样的,所以如果jmx脚本为50个线程跑3分钟,那么实际并发就是50*3=150个线程并发跑3分钟: 三:执行时,slave会把执行获得的数据结果传给master机器,master机器会收集所有slave机器的信息