1.什么是Jmeter
- Jmeter是一种压测工具,压测就是压力测试,模拟并发量来对系统进行模拟冲击,比如高并发,可以看报告中的QPS,吞吐量,进行性能分析,从而进行优化
2.使用步骤
1.进入下载jmeter的文件,进入bin,打开cmd,输入jmeter,打开jmeter
2.创建线程组

3.在线程组下创建http请求

4.在该http请求下添加监听器,查看结果树和聚合报告比较常用

5.如果需要传入参数,需要模拟大量用户的请求数据体,可以在添加csv,这个文件作为读取的用户数据

- 添加好后进入配置,文件名就是文件的位置,而这个csv文件可以由java程序生成

6.生成数据文件demo
java
public class Main {
public static void main(String[] args) throws IOException {
// 1.准备书写器
FileWriter writer = new FileWriter("users.csv");
// 2.写入
for(int i = 1; i <= 3000; i++) {
writer.write("{\"userId\":" + i + ",\"voucherId\":1}\n");
}
// 3.关闭书写器
writer.close();
}
}
7.线程组配置线程
- rame-up的含义是2500个线程在1秒内打完
- 循环次数就是线程请求重复的次数

8.配置http信息头管理器
- application/json表示请求发给接口的是json数据

3.错误捕捉不细致
- 到底是kafka消息发送失败了,还是序列化失败了,异常捕捉要细致一点,不然真的不好排查问题,增加补偿机制.
java
try {
String json = objectMapper.writeValueAsString(eventMessage);
log.info("json序列化成功, json = {}", json);
kafkaTemplate.send(KafkaConstants.SECKILL_TOPIC, String.valueOf(userId), json);
log.info("kafka发送成功, orderId = {}", orderId);
} catch (com.fasterxml.jackson.core.JsonProcessingException e) {
log.info("json序列化失败, orderId = {}", orderId);
compensateRedis(voucherId, userId);
} catch (Exception e) {
log.info("kafka消息发送失败, orderId = {}", orderId);
compensateRedis(voucherId, userId);
throw new BusinessException(10003, "json序列化失败");
}
4.发送失败补偿机制
- 由于是单机,简单的redis回滚补偿
java
private void compensateRedis(Long voucherId, Long userId) {
String stockKey = "seckill:stock:" + voucherId;
String userSetKey = "seckill:order:users:" + voucherId;
stringRedisTemplate.execute(
compensateScript,
Arrays.asList(stockKey, userSetKey),
String.valueOf(userId)
);
}
5.consumer转换对象字段为空
- 在consumer接收到对象过后,需要把它转换成po插入数据库,这个时候po有些字段映射后是空的,由于unique限制,所以插入失败,这个问题非常常见,注意看你插入的对象的字段和数据表的要求
6.老毛病,字段传错,值没赋对,报错和报空
7.tomcat性能优化
- 经过多次极限压测后,并发量在2500左右,在2650时出现连接被拒绝的错误,性能瓶颈锁定在tomcat
accept-count
- 1.功能:控制请求进不进得来
- 2.流程:请求 -> accept队列 -> 工作线程 -> 业务代码
thread-max
- 功能:控制同时能处理多少请求
thread-min-space
- 功能:空余线程数量
- 但是我修改了tomcat的配置,但是再次打2500的时候,发现只成功了一半,这到底是怎么一回事,我估计是CPU的问题,由于我是单机,同时启动docker、mysql等服务,kafka中途还挂了一次,可能是单机资源限制,暂且研究到这里