01-项目性能优化环境搭建

发布时间:2024年01月17日

01-Linux版本JDK安装

#1. 查看当前Linux系统是否已经安装java
    rpm -qa | grep -i java
    
#2. 解压已上传的JDK压缩包,并移动到/usr/local目录下
   mkdir /usr/local/hero
   tar -zxvf /root/jdk-8u261-linux-x64.tar.gz -C /usr/local/hero

#3. 测试jdk
    /usr/local/hero/jdk1.8.0_261/bin/java -version
    
#4. 配置环境变量
  vim /etc/profile
     G 跳转到最后一行
     i 进入插入模式
     export JAVA_HOME=/usr/local/hero/jdk1.8.0_261
     export PATH=$PATH:$JAVA_HOME/bin
     esc 进入命令行模式
     :wq! 保存
  
#5. 更新环境变量
    source /etc/profile
  
#6. 测试
    java -version

02-Linux版本JMeter安装

# 1、下载、安装JMeter
wget -c https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.1.tgz
# 解压
tar -zxvf apache-jmeter-5.4.1.tgz -C /usr/local/hero
cd /usr/local/hero/apache-jmeter-5.4.1 

# 2、配置环境变量
    输入命令 vim /etc/profile ,在最下面添加如下内容:
        export JMETER_HOME=/usr/local/hero/apache-jmeter-5.4.1
        export PATH=$JMETER_HOME/bin:$PATH
# 3、保存后,输入命令 ,使修改的配置生效。
source /etc/profile 
# 4、测试是否安装成功
jmeter -v

03-JMeter插件Perfmon-监控服务器硬件资源【选做】

监控原理:

image-20210512085333763

配置服务端代理:

注意:服务器硬件资源的监控,必须在服务端安装serverAgent代理服务,jmeter才能实现监控服务端的cpu、内存、io的使用情况。

ServerAgent下载地址:https://github.com/undera/perfmon-agent/blob/master/README.md

## 默认启动运行 startAgent.sh 脚本即可

## 服务启动默认4444端口,根本连接不上,因此自己创建一个部署脚本文件对此进行部署,且把端口修改为7879
nohup java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 7879 --tcp-port 7879 > log.log 2>&1 &

## 赋予可执行权限
chmod 755 startAgent.sh

启用7879端口后,服务器的cpu,io,内存使用情况就顺利的监控到了。

04-JMeter在Linux中执行压测

为什么需要非GUI模式运行?

Don’t use GUI mode for load testing !, only for Test creation and Test debugging.

JMeter是Java语言开发,实际是运行在JVM中的,GUI模式运行需要耗费较多的系统资源,一般来说,GUI模式要占用10%-25%的系统资源。而使用非GUI模式可以降低对资源的消耗,提升单台负载机所能模拟的并发数。

1、启动JMeter,创建脚本【配置后置监听器,将数据打到InfluxDB】

如何查看压测结果:

  1. 可以使用命令行输出结果–类似于聚合报告(RT、TPS…)【不推荐】
  2. 导出测试结果下载到本地用GUI界面查看【不推荐】
  3. 使用后置监听器,将数据输出到InfluxDB【推荐】

脚本保存为helloworld.jmx,然后将文件上传至压测服务器。

2、运行脚本

上传本地配置好的测试脚本至压测服务器,执行测试命令

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
# 参数说明
-h 帮助:打印出有用的信息并退出
-n 非 GUI 模式:在非 GUI 模式下运行 JMeter
-t 测试文件:要运行的 JMeter 测试脚本文件
-l 日志文件:记录结果的文件
-r 远程执行:启动远程服务
-H 代理主机:设置 JMeter 使用的代理主机
-P 代理端口:设置 JMeter 使用的代理主机的端口号
-e:测试结束后,生成测试报告
-o:指定测试报告的存放位置

(1) 运行压测,记录压测结果

jmeter -n -t 01-helloworld.jmx -l 01-helloworld.jtl

(2) 运行压测,生成压测报告

jmeter -n -t 01-helloworld.jmx -l 01-helloworld.jtl -e -o ./01-helloworld-report-html

运行结果如下图:

3、查看测试报告

05-JMeter数据库压力测试案例

驱动下载

在测试计划中我们要及时的添加JDBC驱动链接。这里我用的mysql数据库是5.7版本,那么我相对应的JDBC驱动选择了5.x版本。JDBC驱动可以在mysql的官网下载,具体地址是:https://dev.mysql.com/downloads/file/?id=477058

下载驱动界面,不需要登录,直接下载即可:

image-20210223105711239

测试过程

1) 配置数据库驱动

下载后解压文件夹,把文件夹中的mysql-connector-java-8.0.17.jar copy到jmeter安装目录的bin文件下(其实不用放在bin目录下,只需要使用jmeter浏览jar所在位置即可)

2) 配置线程组
3) 配置JDBC 连接池

添加JDBC Connection Configuration(JDBC连接池也有人叫连接组)

image-20210524211428691

需要设置jdbc线程池名称,这个变量在JDBC Request中要使用的;还有要设置Database URL,格式为:

jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC&characterEncoding=utf-8

注意:

  • ?后面的serverTimezone=UTC&characterEncoding=utf-8不能缺少,否则会报时区错误。
  • 在配置的时候,jmeter如果报1045-Access denied for user ‘root’@‘localhost’(using password: YES)这类错误,请重置访问用户的密码,以及给与该用户权限。

重要配置说明

  • Variable Name :数据库连接池的名称

  • JDBC Connection Configuration 算是一个数据库连接池配置

  • Variable Name:连接池唯一标识,后面JDBC Request需要用到。

  • Max Number of Connection: 池中允许的最大连接数,可以设置为20,也可以将其设置为零(0),这意味着没有线程池。

  • Max Wait:参数表示从连接池获取连接的超时等待时间,单位毫秒

  • Database URL 数据库连接 URL

  • JDBC Driver class 数据库驱动

  • Username 数据库登录用户名

  • Password 数据库登录密码

注意:

  • 一个测试计划可以有多个JDBC Connection Configuration配置,只要名称不重复即可。JDBC Connection Configuration其实就是连接池配置。

思考:

  1. 是不是连接数越多服务性能越强呢?
  2. 从连接池获取连接的等待时间越短效率越高呢?

其他基本保持默认就行,也可根据需要进行修改 ,如下是所有参数详解:

1.连接池参数配置:

字段含义
Max Number of Connections最大连接数;做性能测试时,可以填 0。在开发的项目中按实际代码填写,默认是20。
Max Wait(ms)在连接池中取回连接最大等待时间,单位毫秒
Time Between Eviction Runs(ms)运行清除空闲connection的销毁线程间隔时间
Auto Commit自动提交sql语句,如:修改数据库时,自动 commit
Transaction isolation事务隔离级别
Preinit Pool立即初始化连接池如果为 False,则第一个 JDBC 请求的响应时间会较长,因为包含了连接池建立的时间
  • Transaction Isolation: 事务间隔级别设置,主要有如下几个选项:(对JMX加解密)
    • TRANSACTION_NODE 事务节点
    • TRANSACTION_READ_UNCOMMITTED 事务未提交读
    • TRANSACTION_READ_COMMITTED 事务已提交读
    • TRANSACTION_SERIALIZABLE 事务序列化
    • DEFAULT 默认
    • TRANSACTION_REPEATABLE_READ 事务重复读、
2.校验连接池
字段含义
Test While Idle空闲时测试
Soft Min Evictable Idle Time(ms)最小可收回空闲时间(ms)
Validation Query一个简单的查询,用于确定数据库是否仍在响应,默认为jdbc驱动程序的 isValid() 方法,适用于许多数据库
3.配置数据库连接
字段含义
Database URL数据库连接 URL
JDBC Driver class数据库驱动
Username数据库登录用户名
Password数据库登录密码
Connection Properties建立连接时要设置的连接属性
4.常见数据库的连接 URL和驱动:
数据库驱动URL
MySQLcom.mysql.jdbc.Driverjdbc:mysql://host:port/{dbname}
PostgreSQLorg.postgresql.Driverjdbc:postgresql:{dbname}
Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:user/pass@//host:port/service
sqlServercom.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver://host:port;databaseName=databaseName
4) 添加JDBC 请求

右键点击“连接mysql”,再添加一个采样器:JDBC request,在jmeter中request可以编辑select和insert等不同的采样器类别。即通过不同的类别添加配置我们需要的对mysql不同的操作。比如

image-20210524211524799
select id from tb_seckill_goods where id=1;

参数讲解:

  1. Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致
  2. Query Type:此处支持方式多样,可以用于添加或者筛选数据,根据需要和Query配合使用;
    • select statemen 查询
    • update statement 更新
    • prepared select statement 预处理参数查询
    • prepared update statement 预处理参数更新
  3. Query:填写的sql语句未尾可以不加“;”
  4. Parameter valus:参数值,顺序替代Query中的?;
    • 此处对应Query中的”?”,有几个”?”则此处要填写几个值,以”,”分隔;
  5. Parameter types:参数类型
    • 可参考:Javadoc for java.sql.Types
    • Parameter types则必须和Parameter values一一对应,且类型必须正确;
  6. Variable names:保存sql语句返回结果的变量名 ,用于作为参数供调用
  7. Result variable name:创建一个对象变量,保存所有返回的结果 ,供调用;
  8. Query timeout:查询超时时间
  9. Handle result set:定义如何处理由callable statements语句返回的结果。
5) 添加结果监听器
  • 聚合报告
  • 查看结果树
  • 活动线程数Active Threads Over Time
  • 每秒事务数TPS
  • 平均响应时间RT
  • 服务端:内存、网络、CPU、磁盘io、网络io【单位mb】
6) 查看测试结果

测试结论:连接数为0,数据库1.5W+的TPS

06-Linux版本OpenResty安装

# openresty 下载地址
http://openresty.org
http://openresty.org/cn/download.html

# 安装依赖环境
yum -y install pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc curl

# 下载openresty,根据最新版本下载即可,版本换为最新版本即可
# https://openresty.org/download/openresty-1.17.8.1.tar.gz
wget https://openresty.org/download/openresty-1.13.6.1.tar.gz

tar -zxvf openresty-1.13.6.1.tar.gz
cd openresty-1.13.6.1
./configure

# 默认会被安装到/usr/local/openresty目录下
# 编译并安装
make && make install
cd /usr/local/openresty

# 启动nginx
/usr/local/openresty/nginx/sbin/nginx -c /usr/local/openresty/nginx/conf/nginx.conf
ps -ef | grep nginx

# 停止nginx
/usr/local/openresty/nginx/sbin/nginx -s stop   #停止服务
	
# 重新加载配置,修改配置后执行
/usr/local/openresty/nginx/sbin/nginx -s reload

可以发现,nginx访问成功了,说明openresty已经ok了!!

07-Docker安装Redis安装

# 搜索redis镜像
docker search redis
# 拉取redis镜像
docker pull redis:5.0
# 创建容器,设置端口映射
docker run -id --name=redis -p 6379:6379 redis:5.0
# 配置开启6379端口
# 使用外部机器连接redis,测试

08-Docker中安装mysql

(1)拉取mysql镜像

docker pull mysql:5.7

(2)创建容器

docker run -di --name=cmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.6

docker run -id --name=c_mysql -p 3306:3306 \
-v /root/mysql/logs:/logs \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


docker cp c_mysql:/etc/mysql/conf.d .

-p 代表端口映射,格式为 宿主机映射端口:容器运行端口

-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登陆密码

(3)设置容器开机自动启动

docker update --restart=always 容器ID

(4)远程登录mysql

连接宿主机的IP ,指定端口为3306

09-压测监控平台

Docker+JMeter+InfluxDB+Grafana+node_exporter

开始时,在阿里云配置四台4C8G按量计费的服务器。注意:用完记得释放资源,免得一直计费!

9.1 配置Docker环境

1)yum 包更新到最新

sudo yum update

2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3)设置yum源为阿里云

配置yum源的代理,类似于maven镜像仓库,加速下载软件。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4)安装docker

sudo yum install docker-ce
# 启动
systemctl s

5)安装后查看docker版本

docker -v

9.2 安装InfluxDB

1)下载InfluxDB的镜像:

docker pull influxdb:1.8

2)启动InfluxDB的容器,并将端口 8083 和 8086 映射出来:

docker run -d --name influxdb -p 8086:8086 -p 8083:8083 influxdb:1.8

3)进入容器内部,创建名为jmeter的数据库:

进入 jmeter-influx 容器

docker exec -it influxdb /bin/bash
  • 输入influx命令,即可进入 influx 操作界面
  • 输入create database jmeter 命令,创建名为 jmeter 的数据库
  • 输入show databases 命令,查看数据库创建成功
root@517f57017d99:/# influx
Connected to http://localhost:8086 version 1.7.10
InfluxDB shell version: 1.7.10
> create database jmeter
> show databases

4)使用JMeter 库, select 查看数据,这个时候是没有数据的:

  • 输入use jmeter命令,应用刚才创建的数据库
  • 输入select * from jmeter命令,查询库中有哪些数据
> use jmeter
> select * from jmeter

9.3 设置JMeter脚本后置监听器

1)配置后置监听器

想要将 JMeter的测试数据导入 InfluxDB ,就需要在 JMeter中使用 Backend Listener 配置

image-20220805214905311

2)主要配置说明

implementation 选择 InfluxDB所对应的:

image-20220805215032797
  • influxdbUrl:需要改为自己influxdb的部署ip和映射端口,我这里是部署在阿里云服务器,所以就是47.93.59.248,口是容器启动时映射的8086端口,db后面跟的是刚才创建的数据库名称
  • application:可根据需要自由定义,只是注意后面在 grafana 中选对即可
  • measurement:表名,默认是 jmeter ,也可以自定义
  • summaryOnly:选择true的话就只有总体的数据。false会记录总体数据,然后再将每个transaction都分别记录
  • samplersRegex:样本正则表达式,将匹配的样本发送到数据库
  • percentiles:响应时间的百分位P90、P95、P99
  • testTitle:events表中的text字段的内容
  • eventTags:任务标签,配合Grafana一起使用

注意:云服务器配置开启端口8086

influxdbMetricsSender	org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender
influxdbUrl	http://47.93.59.248:8086/write?db=jmeter
application	hero_mall_one
measurement	jmeter
summaryOnly	false
samplersRegex	RT*
percentiles	90;95;99
testTitle	压力测试案例01
eventTags	

3)运行验证

运行 Jmeter 脚本,然后再次在 influxdb 中查看数据,发现类似下面的数据说明输入导入成功:

9.4 安装Grafana

1)下载Grafana镜像:

docker pull grafana/grafana

2)启动Grafana容器:

启动Grafana容器,将3000端口映射出来

docker run -d --name grafana -p 3000:3000 grafana/grafana

3)验证部署成功

网页端访问http://101.200.146.199:3000验证部署成功

默认账户密码:admin\admin

4)选择添加数据源

5)找到并选择 influxdb :

6)配置数据源

数据源创建成功时会有绿色的提示:

7)导入模板

模板导入分别有以下3种方式:

  • 直接输入模板id号
  • 直接上传模板json文件
  • 直接输入模板json内容

8)找展示模板

在Grafana的官网找到我们需要的展示模板

  • Apache JMeter Dashboard
    • dashboad-ID:5496
  • JMeter Dashboard(3.2 and up)
    • dashboad-ID:3351

9)导入找到的模板,使用模板id

导入模板,我这里选择输入模板id号,导入后如下,配置好模板名称和对应的数据源,然后 import 即可

10)查看效果

展示设置,首先选择创建的application

注意: 如果我们修改过表名,也就是在jmeter的Backend Listener的measurement配置(默认为jmeter),这个时候就需要去设置中进行修改,我这里使用的就是默认的,所以无需修改。

9.5 安装node_exporter

# 下载
wget -c https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
# 解压
tar zxvf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/hero/
# 启动
cd /usr/local/hero/node_exporter-0.18.1.linux-amd64
nohup ./node_exporter > node.log 2>&1 &

注意:在被监控服务器中配置开启端口9100

http://101.200.87.86:9100/metrics

9.6 安装Prometheus

1)下载解压运行

# 下载
wget -c https://github.com/prometheus/prometheus/releases/download/v2.15.1/prometheus-2.15.1.linux-amd64.tar.gz
# 解压
mkdir /usr/local/hero/
tar zxvf prometheus-2.15.1.linux-amd64.tar.gz -C /usr/local/hero/
cd /usr/local/hero/prometheus-2.15.1.linux-amd64
# 运行
nohup ./prometheus > prometheus.log 2>&1 &

2)配置prometheus

在prometheus.yml中加入如下配置:

  - job_name: 'hero-Linux'
    static_configs:
    - targets: ['172.17.187.78:9100','172.17.187.79:9100','172.17.187.81:9100']

3)测试Prometheus

测试Prometheus是否安装配置成功

http://101.200.146.199:9090/targets

3)在Grafana中配置Prometheus的数据源:

4)Grafana导入Linux展示模板

导入Linux系统dashboard

  • Node Exporter for Prometheus Dashboard EN 20201010
    • dashboard-ID: 11074
  • Node Exporter Dashboard
    • dashboard-ID: 16098

在prometheus.yml中加入如下配置:

  - job_name: 'hero-Linux'
    static_configs:
    - targets: ['172.17.187.78:9100','172.17.187.79:9100','172.17.187.81:9100']

3)测试Prometheus

测试Prometheus是否安装配置成功

http://101.200.146.199:9090/targets

[外链图片转存中…(img-Xwsf19JI-1705312571930)]

3)在Grafana中配置Prometheus的数据源:

[外链图片转存中…(img-5VptCKxc-1705312571930)]

[外链图片转存中…(img-Q8HhpFA3-1705312571930)]

4)Grafana导入Linux展示模板

导入Linux系统dashboard

  • Node Exporter for Prometheus Dashboard EN 20201010
    • dashboard-ID: 11074
  • Node Exporter Dashboard
    • dashboard-ID: 16098

[外链图片转存中…(img-zIFCRsea-1705312571931)]

[外链图片转存中…(img-2ZgxSfL0-1705312571931)]

部署一下我给大家提供的服务,暂时不给源码,仅测试用。

文章来源:https://blog.csdn.net/weixin_47772925/article/details/135607591
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。