Jmeter之es压测---从部署环境开始

JMeter压测ES实战
本文详细介绍如何搭建JDK及Elasticsearch环境,并利用JMeter进行ES压测。包括环境配置、常见问题解决及JMeter脚本编写。

前景:
因为要用Jmeter调es做一些操作,但是还没有环境,就自己搭了一个,所以就从部署基础环境开始吧。

一、安装jdk(已安装可跳过)

以下操作我这里都是用root操作的

jdk1.8下载地址

1、创建一个目录文件夹(用来放置jdk)

mkdir xxx   &   mkdir  -p  /xxx/java

2、解压jdk

tar -zxvf jdk-8u301-linux-x64.tar.gz

3、设置软连接(也可不设置,这里只是为了方便)

ln -s jdk1.8.0_121 jdk

4、配置环境变量

vim /etc/profile

将以下几行加入至文件中

export JAVA_HOME=/xxx/java/jdk    #你的jdk路径地址
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/ext:$JRE_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH

要注意的是,环境变量千万别改错咯,不然会影响到其他的命令使用!!!

*如果出现/usr/libexec/grepconf.sh: line 5: grep: command not found那就是环境变量配错了,用下面这个命令重新把profile这个文件改过来
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin*

5、生效环境变量

source /etc/profile

6、查看配置是否成功

java -version

出现以下代表配置完毕

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

二、部署es(已安装可跳过)

es下载地址

一样的步骤,自行创建一个文件夹用于放置下载的es文件

1、解压es

tar -zxvf elasticsearch-6.4.3.tar.gz

2、切换用户(es不能使用root用户启动,不然会报错)

groupadd es
useradd es -g es -p 123456
su - es

3、授权刚解压的es文件夹

chown -R es:es /xxx/es/elasticsearch-6.4.3

4、配置elasticsearch.yml(在config目录下)
在配置文件的底部加入以下两行,用于设置ip及端口

network.host: 0.0.0.0
http.port: 9200

5、启动es

./elasticsearch-6.4.3/bin/elasticsearch -d

6、配置密码

在elasticsearch.yml添加以下几行
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
然后重启es
使用./elasticsearch-setup-passwords interactive 设置密码

8、创建、查询索引

这里只简单讲解,详细可查看大佬的https://blog.youkuaiyun.com/sss294438204/article/details/122884953
注意:因为我们配置了密码,所以后续的操作都要带上es的账号密码才可进行

a)创建索引

curl -X PUT   "http://0.0.0.0:9200/test3" -u elastic:123456
出现{"acknowledged":true,"shards_acknowledged":true,"index":"test3"}代表创建成功

b)查询索引

curl -X GET "http://0.0.0.0:9200/test3/_search" -u elastic:123456
返回:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}

c)给索引加文档

我这里版本不支持 _ + name的类型 所以创建一个doc类型的id为1111的文档

curl -X PUT "http://0.0.0.0:9200/test3/doc/1111" -H 'Content-Type: application/json' -d '{"aaa":"asd","name":"as"}' -u elastic:123456
返回:
{"_index":"test3","_type":"doc","_id":"1111","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
再次查询:
curl -X GET "http://0.0.0.0:9200/test3/_search" -u elastic:123456
返回:
{"took":2,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"test3","_type":"doc","_id":"1111","_score":1.0,"_source":{"aaa":"asd","name":"as"}}]}}
可以看到数据已经写进去了,那我们测试数据准备完毕

三、使用Jmeter编写es脚本

因为es是暴露了restful api,所以可以直接用Jmeter的http请求来进行编写

只需要填写这些参数就可以了(ip地址就写es机器所在地址),是不是很简单!入参如果有查询条件再写,没有的话就不用写,也可以跟在路径后面,毕竟是get的嘛


成功返回
在这里插入图片描述

这里需要注意的是,这是在es还没有账户密码的情况下调用的,而我们现在设置了账户密码,那自然需要加上用户密码进行访问,与curl的-u会有所不同!

Jmeter添加es账户密码方式:

1、需要添加HTTP信息头管理器,添加Authorization字段,值为base64加密值,值需要为“Basic +加密值”
在这里插入图片描述

2、加密值通过beanshell的方式来取(也可以写个jar包,通过java请求),在HTTP信息头管理器前面加上BeanShell 预处理程序,代码如下:

import java.nio.charset.StandardCharsets;
import java.util.Base64;

String name = "elastic";

String password = "123456";

String basebase = name + ":" + password;

log.info("auth string: " + basebase);

//Base64编码
Base64.Encoder encoder = Base64.getEncoder();

String s = encoder.encodeToString(basebase.getBytes(StandardCharsets.UTF_8));

log.info("______________________________________________________");
log.info("s="+s);

vars.put("userpasswd",s)

至此,全部设置完毕,可进行配置线程进行压测啦!

四、遇到的问题

es启动日志默认在安装包目录下的logs文件夹的elasticsearch.log,可看到es启动情况

a)es启动出现如下报错在这里插入图片描
启动没多久后ps -ef | grep ela 发现没有es的进程了,发现es被自动关闭了!

因为es索引文件是映射到虚拟内存空间的,只有当访问索引的时候,才会从磁盘读到物理内存里(提高查询速度),这里看到es需要的最低虚拟内存空间是252144,而我这只有65530,所以导致es报错无法启动

解决办法:使用root 临时修改sysctl -w vm.max_map_count=262144
永久修改:echo vm.max_map_count=262144>> /etc/sysctl.conf sysctl -p

b)es配置密码时出现以下报错

Unexpected response code [403] from calling GET http://xxx:9200/_xpack/security/_authenticate?pretty
It doesn't look like the X-Pack security feature is available on this Elasticsearch node.
Please check if you have installed a license that allows access to X-Pack Security feature.

原因是没开启X-pack安全

解决办法:curl -H "Content-Type:application/json" -XPOST  http://localhost:9200/_xpack/license/start_trial?acknowledge=true
再使用./elasticsearch-setup-passwords interactive 设置密码

c)curl、Jmeter未加用户密码访问报错

如果es配置了账户密码,但是在进行操作es时没有加上用户密码就会报以下的错
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/test3/_create/1111]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/test3/_create/1111]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
<think>我们正在分析XXL-JOB在高并发场景下的性能瓶颈。根据引用内容,XXL-JOB是一个分布式任务调度框架,常用于大规模分布式系统。为了监控其性能瓶颈,我们需要使用性能监控工具来收集关键指标,如任务执行时间、调度延迟、资源利用率等。步骤:1.确定监控指标:包括但不限于:-任务调度延迟(从任务触发到实际开始执行的时间)-任务执行时间(任务从开始执行到结束的时间)-系统资源:CPU、内存、磁盘I/O、网络I/O-线程池状态(如活跃线程数、队列大小)-数据库性能(XXL-JOB使用数据库存储任务信息,需监控数据库连接池、慢查询等)-执行器负载情况(引用[4]提到忙碌转移策略,需监控执行器负载)2.选择监控工具:-APM工具:如SkyWalking,Pinpoint,Zipkin(用于分布式链路跟踪)-系统监控:Prometheus+Grafana(收集系统指标和自定义指标)-JVM监控:使用JMX或JavaAgent(如Micrometer)暴露JVM指标(GC、堆内存等)-日志分析:ELK(Elasticsearch,Logstash,Kibana)收集和分析日志3.集成XXL-JOB与监控工具:-在XXL-JOB调度中心和执行器上部署监控代理。-使用Prometheus收集指标:可以通过在XXL-JOB中集成Micrometer,将指标暴露给Prometheus。-配置Grafana仪表板展示关键指标。4.模拟高并发场景:-使用试工具(如JMeter)模拟大量任务调度请求。-逐步增加并发任务数,观察系统行为。5.分析瓶颈:-观察在并发增加时,哪些指标出现异常(如调度延迟增加、任务失败率上升、资源耗尽等)。-定位瓶颈点:可能是调度中心的数据库力过大,或者执行器的线程池不足,或者网络带宽瓶颈等。6.优化建议:-根据瓶颈点调整配置,如增加数据库连接池大小、优化SQL、调整线程池参数、增加执行器节点等。-引用[4]提到的阻塞处理策略和忙碌转移策略,可以调整这些策略以优化任务分配。引用[1]提到XXL-JOB支持任务的监控和报警,因此我们可以利用其内置的监控功能,同时结合外部工具进行更全面的监控。具体操作:1.监控调度中心:-调度中心是XXL-JOB的核心,负责触发任务调度。需要监控其处理请求的吞吐量和延迟。-数据库监控:XXL-JOB的调度中心使用数据库存储任务和日志,监控数据库性能(如慢查询、连接数)。2.监控执行器:-每个执行器负责执行任务。监控执行器的线程池状态(如活跃线程数、队列积)和任务执行时间。-如果使用忙碌转移策略(引用[4]),需要监控执行器的负载情况,确保任务被正确转移到空闲执行器。3.分布式链路跟踪:-通过SkyWalking等工具跟踪任务调度的完整链路,识别延迟发生在哪个环节(调度中心、网络传输、执行器)。4.日志监控:-收集XXL-JOB的调度日志和执行日志,分析错误日志和超时日志。示例:使用Prometheus监控XXL-JOB执行器的线程池在SpringBoot执行器项目中,添加Micrometer依赖,暴露线程池指标:```java@BeanpublicMeterRegistryCustomizer<MeterRegistry>metricsCommonTags(){returnregistry->registry.config().commonTags("application","xxl-job-executor");}//监控线程池@ResourceprivateThreadPoolTaskExecutorxxlJobExecutor;//假设这是XXL-JOB的执行线程池@PostConstructpublicvoidmonitorThreadPool(){//注册线程池指标newExecutorServiceMetrics(xxlJobExecutor.getThreadPoolExecutor(),"xxl-job-executor-pool",Collections.emptyList()).bindTo(Metrics.globalRegistry);}```然后在Prometheus中配置抓取该应用的指标,在Grafana中创建仪表板。相关问题:1.如何配置XXL-JOB的忙碌转移策略以应对高并发?2.在XXL-JOB中,如何优化数据库性能以减少调度延迟?3.如何使用SkyWalking对XXL-JOB进行分布式链路跟踪?4.如何调整XXL-JOB执行器的线程池参数来提升并发处理能力?</think>### 如何监控XXL-JOB在高并发场景下的性能瓶颈 #### 一、关键监控维度 1. **调度中心性能** - **调度延迟**:使用APM工具(如SkyWalking)跟踪任务从触发到执行的延迟时间 - **线程池状态**:监控调度线程池的活跃线程数/队列积量(如`admin.threadpool.task_thread_num`) - **DB力**:重点监控任务日志表`xxl_job_log`的读写延迟(引用[1]) 2. **执行器性能** - **任务执行时间**:通过`@XxlJob`注解方法的执行耗时统计 - **资源瓶颈**:实时监控CPU/内存/网络IO(使用Prometheus+Grafana) - **线程池阻塞**:关注`executor.threadpool`的拒绝策略触发频率(引用[4]) 3. **分布式协调** - **注册中心负载**:监控执行器注册心跳频率(默认30秒) - **跨节点通信**:抓取调度中心→执行器的HTTP调用延迟(关键路径) #### 二、推荐监控工具栈 | 工具 | 监控场景 | 配置示例 | |---------------|----------------------------------|-----------------------------| | **Prometheus** | 实时指标采集 | 暴露`/actuator/prometheus`端点 | | **Grafana** | 性能仪表板 | 内置XXL-JOB监控模板[^3] | | **Arthas** | JVM级诊断(线程阻塞/GC问题) | `thread -b`查阻塞线程 | | **SkyWalking** | 分布式链路追踪 | 植入XXL-JOB调用链探针 | #### 三、高并发方法 1. **模拟负载工具** ```bash # 使用JMeter模拟任务触发 jmeter -n -t xxl-job-test.jmx -q config.prop -l result.jtl ``` - 重点参数:任务触发QPS、任务执行时长模拟 2. **瓶颈分析流程** ```mermaid graph TD A[并发任务增加] --> B{监控指标异常点} B -->|调度延迟↑| C[检查DB索引/连接池] B -->|执行器超时↑| D[分析线程池/GC日志] B -->|注册中心延迟| E[优化ZK/DB配置] ``` #### 四、典型优化策略 1. **数据库层面** - 对`xxl_job_log`表进行分库分表(按日期分区) - 增加连接池大小:`spring.datasource.hikari.maximum-pool-size=50` 2. **执行器优化** ```java // 配置定制化线程池(避免默认队列无限堆积) @Bean public Executor xxlJobExecutor() { return new ThreadPoolExecutor(10, 100, 60s, new LinkedBlockingQueue(1000), // 限制队列大小 new ThreadPoolExecutor.CallerRunsPolicy()); } ``` 3. **调度策略调优** - 启用`忙碌转移(BUSYOVER)`策略(引用[4]) - 设置合理的阻塞处理策略:`DISCARD_LATER`(丢弃后续) #### 五、报警阈值建议 | 指标 | 警告阈值 | 紧急阈值 | |---------------------|---------------|------------------| | 调度延迟 | >500ms | >2000ms | | 线程池队列积 | >80%容量 | 100%容量 | | DB连接等待时间 | >100ms | >500ms | | 任务失败率 | >5% | >20% | > **重要提示**:在高并发场景下需特别关注执行器节点的**负载均衡**状态,避免出现单节点过载导致的级联故障(引用[4])。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值