Jmeter压测遇到的问题

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中途还挂了一次,可能是单机资源限制,暂且研究到这里
相关推荐
未若君雅裁1 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记2 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI2 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding3 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路3 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇3 小时前
linux 检索库 判断库是否支持
java·linux·服务器
她的男孩4 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构
RainCity4 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Sam_Deep_Thinking4 小时前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构