1. jemter 脚本编写、配置
使用jemeter 的最基础环境是需要java环境,java环境配置就不赘述了
这里我使用的版本是 apache-jmeter-5.1.1
1)定义全局变量-用户参数
比如定义一些全部变量值,就可以用这个,比如域名、环境变量之类的参数
路径为 添加-前置处理器-用户参数
2)定义全局 头部参数
路径-添加配置元件-HTTP信息头部管理器
3)参数设置- 使用文件内容下的列作为参数
添加一个配置元件,选择
配置数据文件内容的变量名,作为接口取值的一个参数
接口取值变量,使用 ${key} 这样来取值
4) 串联接口传参 - 使用 json提取器
提取多个的话也是用, 隔开
5)使用Beashell 后置处理程序
import org.json.*;
String responsedata = prev.getResponseDataAsString();
log.info("Response Data: " + responsedata);
try {
JSONObject data_obj = new JSONObject(responsedata);
String id = data_obj.getJSONObject("content").getString("No"); # 提取返回的值
String order_num = data_obj.getJSONObject("content").getString("Num");
vars.put("id", id); # 赋值给变量,后面的接口取值用 ${id} 这样
vars.put("num", num);
} catch (JSONException e) {
log.error("Error parsing JSON: " + e.getMessage());
}
6) 脚本使用redis 赋值session
有很多接口需要鉴权才能取值,通常我们是去刷新缓存的session 进行赋值的
import redis.clients.jedis.JedisPoolConfig ;
import redis.clients.jedis.JedisPool ;
import redis.clients.jedis.Jedis ;
import java.util.ArrayList;
import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.params.SetParams;
String session_id = "${session_demo}${__threadNum}";
String host = "${redis_host}"; //服务器地址
int port = ${redis_port}; //端口号
String password = "${redis_pwd}"; //redis密码
int index = 1; //redis db,
String key = "user:login:session_id:"+ session_id; //key值
log.info("key:" + key);
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲连接数,应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
config.setMaxIdle(200);
//最大连接数,应用自己评估,不要超过ApsaraDB for Redis每个实例最大的连接数
config.setMaxTotal(300);
config.setTestOnBorrow(false);
config.setTestOnReturn(false);
JedisPool pool = new JedisPool(config, host, 6379, 3000, password);
Jedis jedis = null;
log.info("beanshell set token...");
String tokenDemo="{\"userId\":${userId},\"account\":\"${loginAccount}\",\"name\":\"${loginName}\",\"superAdmin\":${isSuperAdmin}}";
//String tokenDemo="{\"userId\":${userId},\"account\":\"${ldap_name}\",\"name\":\"${emp_name}\",\"superAdmin\":${isSuperAdmin}}";
try {
jedis = pool.getResource();
// 设置key 有效期10分钟
SetParams params=new SetParams();
jedis.set(key,tokenDemo,params.ex(60));
String value= jedis.get(key); //获取key值
log.info(value);
} finally {
if (jedis != null) {
jedis.close();
}
}
pool.destroy();
log.info("redis disconn...");
vars.put("session_id", session_id);
2. 配置压测脚本
1) 新建一个压测计划
2) 计划先新建一个线程组
3)设置 全局变量和 头部参数
4) 按需求配置token 脚本
5)如果需要循环取 csv 里的数据,需要先配置一个循环控制器,把文件参数和对应的取值接口放在下面
6) 配置接口
7) 在下面可以配置一个结果数和统计结果,以便我们看错压测情况,以及接口的运行情况
3. 开始压测
配置线程数,运行时间,开始压测,然后可以查看统计数据情况,接口运行情况
4. 压测数据分析
- 查看压测结果情况
2)观察服务器内存使用情况,一般使用命令 top 检测一下就行
3)查看数据库负载情况,我们使用的是阿里云的 rds和prodb 数据库,可以实时看到,里面也会抓慢SQL数据,我们设置的是超过1s即认为是 慢SQL
4) 根据接口去阿里云上捞日志,我们有加一个tid 去唯一记录整个接口的运行链路,找出运行比较慢的接口去 skywalking 上根据tid搜索,就可以定位到哪个链路上比较慢了
然后再去一步异步分析慢的原因,大概是这样的流程了。
今日语录:焦虑是自由引发的眩晕