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

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-监控服务器硬件资源【选做】

监控原理:

配置服务端代理:

注意:服务器硬件资源的监控,必须在服务端安装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

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

测试过程

1) 配置数据库驱动

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

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

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

需要设置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
MySQL com.mysql.jdbc.Driver jdbc:mysql://host:port/{dbname}
PostgreSQL org.postgresql.Driver jdbc:postgresql:{dbname}
Oracle oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:user/pass@//host:port/service
sqlServer com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://host:port;databaseName=databaseName
4) 添加JDBC 请求

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

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 配置

2)主要配置说明

implementation 选择 InfluxDB所对应的:

  • 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)]

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

你可能感兴趣的:(性能优化)