0


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

01-Linux版本JDK安装

#1. 查看当前Linux系统是否已经安装javarpm-qa|grep-ijava#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 进入插入模式
     exportJAVA_HOME=/usr/local/hero/jdk1.8.0_261
     exportPATH=$PATH:$JAVA_HOME/bin
     esc 进入命令行模式
     :wq! 保存
  
#5. 更新环境变量source /etc/profile
  
#6. 测试java-version

02-Linux版本JMeter安装

# 1、下载、安装JMeterwget-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 ,在最下面添加如下内容:
        exportJMETER_HOME=/usr/local/hero/apache-jmeter-5.4.1
        exportPATH=$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端口,根本连接不上,因此自己创建一个部署脚本文件对此进行部署,且把端口修改为7879nohupjava-jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 7879 --tcp-port 7879> log.log 2>&1&## 赋予可执行权限chmod755 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语句,如:修改数据库时,自动 commitTransaction 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数据库连接 URLJDBC Driver class数据库驱动Username数据库登录用户名Password数据库登录密码Connection Properties建立连接时要设置的连接属性

4.常见数据库的连接 URL和驱动:

数据库驱动URLMySQLcom.mysql.jdbc.Driverjdbc:mysql://host:port/{dbname}PostgreSQLorg.postgresql.Driverjdbc:postgresql:{dbname}Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:user/pass@//host:port/servicesqlServercom.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 -yinstall pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc curl# 下载openresty,根据最新版本下载即可,版本换为最新版本即可# https://openresty.org/download/openresty-1.17.8.1.tar.gzwget 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&&makeinstallcd /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 -p3306:3306 -eMYSQL_ROOT_PASSWORD=admin mysql:5.6

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

dockercp 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 -p8086:8086 -p8083:8083 influxdb:1.8

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

进入 jmeter-influx 容器

dockerexec-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 -p3000: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
版权归原作者 程序媛9688 所有, 如有侵权,请联系我们删除。

“01-项目性能优化环境搭建”的评论:

还没有评论