谢邀,你要是问我,我是没去培训过。需不需要我不知道,但你可以看看我写的入门指引:https://zhuanlan.zhihu.com/p/31080929
小哥, 说实话, 很少有专门培训性能测试的机构....
一般机构会分全栈测试, 也就是从手动点点点-自动化测试-接口测试-性能测试一系列, 都会涉及.
另一种是做为提升的课程, 主打自动化测试-接口测试-性能测试.
如果题主只是想单纯地学习性能测试的内容, 我可以把这部分资料摘出来, 分享给你.
我应该很有资格回答这个问题,因为我就是培训出来的,但是我是不太建议去我培训的那家机构,因为我有工作完完全全是个人的努力,一个班里四十多号人,就十几个找到工作的,我还是我们班第一个找到工作的,不过我最近在看柠檬班的自动化视频,感觉教程挺不错的,线上你可以考虑柠檬班,费用比我们培训的便宜1w5左右,我们当时培训是贷款培训加利息差不多21000,但是柠檬班那边好像是五千多
这个软件测试学习的资料或者如何学习、自学或者培训等等,这些问题知乎上有很多。你可以去看看参考一下。
大专的学历对比本科来说,机会很少,因为有的企业会在学历这块卡的很严,但是不代表找不到。
培训机构怎么选择,对于一个小白来说是不懂的,我们要看培训的师资水平、课程内容、课程视频等等。这怎么说,都是常识后才知道里面的道道。
然后就是通过参加软件测试培训能解决什么问题?
首先就是效率问题,把你可能需要花费半年学完的东西给你压缩到2-3个月集中学习,定时定量按计划进行突破;
其次是思路的问题,让你少走弯路,学习的内容和方向给你规划好,不需要再去来回调整内容,方向对了,剩下的就是朝前走;
再者是自控力的问题,强制你学习,付出了金钱的成本,结合督学的体系,去对抗你的惰性
最后就是针对性解决问题,尤其在自学的过程中,最大的门槛就是没有实战项目和遇到问题不能及时解答,这样会极大程度耽误学习进度和学习效果。
所以,准确的去衡量一下自己的实力以及身边可以用的资源,你就会知道自己需不需要去培训一下。

不是很清楚题主的意思,性能测试貌似没有专门的测试方法一说。
一般来说业内常说的是软件测试的方法,比如等价划分类、边界值测试法,场景法这些。
如果你是想知道性能测试怎么做,我有一些经验可以分享(读书笔记+实际压测案例),希望能帮到你!
1)性能测试一般分为:负载测试、压力测试、基准测试、稳定性测试、扩展性测试。
2)常见的性能测试指标:
- 响应时间
- TPS/QPS
- 并发用户
- PV/UV
- 点击率
- 吞吐量
- 资源开销

1、熟悉业务流程,明确此次性能测试的目标,找到业务需求的性能点。
2、熟悉系统的应用架构、技术架构、数据架构、部署架构等,找到与其他系统的交互流程,明确系统部署的硬件配置信息、软件配置信息。
3、把对性能测试有重要影响的关键点列举出来。
- 比如用户发起请求的顺序、请求之间的相互调用关系;业务的数据流走向;被压测系统可能存在的重点资源消耗;应用的部署架构等。
4、明确系统上线后可能会达到的最大并发用户数、用户期望的平均响应时间以及峰值时的业务吞吐量,并将这些信息转化为性能需求指标。
测试计划一般本次测试的目的,各个阶段的时间点+对应负责人,以及本次性能测试风险的分析和控制。
测试方案一般包括:
1、设计测试场景。
2、定义具体事务操作。
3、针对每个场景,明确监控对象和可能的性能瓶颈点:
- 监控对象:比如TPS、平均响应时间、击率、并发连接数、CPU、内存、IO等。
- 可能的性能瓶颈点:比如数据库查询、Web务器服务转发、应用服务器等。
4、定义测试策略:明确性能测试的类型、执行顺序、加压方式(压测需要)。
5、选取性能测试工具。
6、明确硬件配置和软件配置:
- 硬件配置:服务器的CPU配置、内存配置、硬盘存储配置、集群环境下还要包括集群节点的数量配置等。
- 软件配置:操作系统、应用版本、参数配置和网络配置。
1、描述预置条件:满足啥条件性能测试案例才可以执行。
2、详细描述案例执行的步骤,包括:
- 测试脚本的录制和编写脚本的调试、
- 脚本的执行过程(比如如何加压、每个加压的过程持续多久等)、
- 要观察和记录的性能指标、
- 需要明确性能曲线的走势、
- 需要监控哪些性能指标等。
3、描述性能测试预期需要达到的结果,比如:
- TPS需要达到多少;
- 平比响应时间需要控制到多少以内;
- 服务器资源的消耗需要控制在多少以内等。
ps:在实际工作中,你分析完性能需求之后,可以把测试计划、测试方案和测试案例合成一个文档,这块并没有严格的定义,可以按你们公司的流程来做。
以上读书笔记来源于下边这本书,很适合性能测试的小白看:
下边是我之前做的一个压测实际案例(已脱敏),感兴趣的也可以看看。
怎样正确做 Web 应用的压力测试?

我是专注分享测试干货的臻叔,喜欢的可以关注哦~
其他精华文章——
UI自动化:
贝壳找房:移动端的UI自动化测试实战分享(真实案例)
接口测试:
程序员臻叔:全网最详细的接口测试实战案例!小白必看!
抖音测试面试题答案:
面试官:你来设计一下抖音直播功能测试用例吧!
百度测试开发面试题答案:
8000字-百度测试开发面试题答案(臻叔)
❤既然都看到这里啦,请你帮个忙:
1、点赞,让更多小伙伴看到;
2、关注我,持续更新测试干货。
关注我,免费咨询测试问题→→
最后,感谢您的阅读。
你的盛赞就是对创作者最大的支持!
用三台虚拟机来模拟搭建性能监控平台。
三台虚拟机:centos7
vm1test | 192.168.192.101 | Tomcat1 java应用,zookeeper,kafka,redis |
vm2test | 192.168.192.102 | Tomcat2 java应用,zookeeper,kafka,redis |
vm3test | 192.168.192.103 | Grafana,prometheus,ngnix,redis,mysql,java应用,skywalking,zookeeper,kafka |
[wyuser@vm3test ~]$ sudo yum install -y java
[wyuser@vm3test ~]$ sudo java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
设置 stable 镜像仓库
[wyuser@vm3test ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
报错:yum-config-manager: command not found
解决:这个命令在yum-utils 包里
[wyuser@vm3test ~]$ sudo yum -y install yum-utils
更新 yum 软件包索引
[wyuser@vm3test ~]$ sudo yum makecache fast
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.bupt.edu.cn
* extras: mirrors.bupt.edu.cn
* updates: mirrors.bupt.edu.cn
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/2): docker-ce-stable/7/x86_64/updateinfo | 55 B 00:00:00
(2/2): docker-ce-stable/7/x86_64/primary_db | 67 kB 00:00:01
元数据缓存已建立
[wyuser@vm3test ~]$ sudo yum list docker-ce.x86_64 --showduplicates | sort -r
安装
[wyuser@vm3test ~]$ sudo yum install -y docker-ce
启动
[wyuser@vm3test ~]$ sudo systemctl start docker
验证
[wyuser@vm3test ~]$ ps -ef | grep docker
root 10535 1 1 09:38 ? 00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
wyuser 10669 10218 0 09:38 pts/0 00:00:00 grep --color=auto docker
拉取官方镜像(我们这里选择5.7,如果不写后面的版本号则会自动拉取最新版)
[wyuser@vm3test ~]$ sudo docker pull mysql:5.7
[wyuser@vm3test ~]$ sudo docker images | grep mysql
mysql 5.7 938b57d64674 3 weeks ago 448MB
一般来说数据库容器不需要建立目录映射
[wyuser@vm3test ~]$ sudo docker run -d -p 3306:3306 --name mysql57 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
99c9e14d36a8e08eb91b6fe3dd2c0d7ebfac9a1f61d3cdcb48b7442bd5c75675
- -d:后台运行容器,保证在退出终端后容器继续运行
- -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
- –name:容器名,此处命名为
mysql57
- -e:配置信息,此处配置mysql的root用户的登陆密码
如果要建立目录映射
[wyuser@vm3test ~]$ sudo docker run -p 3306:3306 --name mysql57 \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
- -v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
检查容器是否正确运行
可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字
[wyuser@vm3test ~]$ sudo docker container ls | grep mysql
99c9e14d36a8 mysql:5.7 "docker-entrypoint.s…" 25 minutes ago Up 25 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql57
[wyuser@vm3test ~]$ sudo docker ps | grep mysql
99c9e14d36a8 mysql:5.7 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql57
进入docker本地连接mysql客户端
[wyuser@vm3test ~]$ sudo docker exec -it 99c9e14d36a8 /bin/bash
root@99c9e14d36a8:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \q
Bye
如果你的容器运行正常,但是使用navicat工具无法访问到MySQL,一般有以下几个可能的原因:
- 防火墙阻拦
[wyuser@vm3test ~]$ sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
[wyuser@vm3test ~]$ sudo firewall-cmd --reload
- 需要进入docker本地客户端设置远程访问账号
[wyuser@vm3test ~]$ sudo docker exec -it 99c9e14d36a8 /bin/bash
root@99c9e14d36a8:/# mysql -uroot -p123456
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select host ,user from user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | root |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+---------------+
4 rows in set (0.00 sec)
[wyuser@vm3test ~]$ sudo docker search redis
[wyuser@vm3test ~]$ sudo docker pull redis
[wyuser@vm3test ~]$ sudo docker images | grep redis
redis latest 7faaec683238 3 weeks ago 113MB
[wyuser@vm3test ~]$ sudo docker run -d -p 6379:6379 redis
[wyuser@vm3test ~]$ sudo docker container ls | grep redis
ae3379799f64 redis "docker-entrypoint.s…" 6 days ago Up 5 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp vigilant_lumiere
[wyuser@vm3test ~]$ sudo docker search influx
[wyuser@vm3test ~]$ sudo docker pull influxdb:1.7.9
[wyuser@vm3test ~]$ sudo docker images
[wyuser@vm3test ~]$ sudo docker ps -a
[wyuser@vm3test ~]$ sudo docker run -d -p 8083:8083 -p 8086:8086 --name vcus_influx influxdb:1.7.9
[wyuser@vm3test ~]$ sudo docker ps | grep influx
f76f3752c17f influxdb:1.7.9 "/entrypoint.sh infl…" 6 days ago Up 5 hours 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp, 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp vcus_influx
[wyuser@vm3test ~]$ sudo docker search nginx
[wyuser@vm3test ~]$ sudo docker pull nginx
[wyuser@vm3test ~]$ sudo docker images | grep nginx
nginx latest 87a94228f133 4 weeks ago 133MB
启动基础容器用于资源拷贝
[wyuser@vm3test ~]$ sudo docker run -d -p 80:80 --name=mynginx nginx
查看容器nginx目录
[wyuser@vm3test ~]$ sudo docker ps | grep nginx
[sudo] wyuser 的密码:
40ef70d978fe nginx "/docker-entrypoint.…" 56 minutes ago Up 56 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx
[wyuser@vm3test ~]$ sudo docker exec -it 40ef70d978fe /bin/bash
root@40ef70d978fe:/# ls /var/log/nginx
access.log error.log
root@40ef70d978fe:/# ls /etc/nginx
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@40ef70d978fe:/# ls /usr/share/nginx/html
50x.html index.html
Docker容器nginx目录说明(日志目录为软连接,所以不创建logs目录)
日志文件位置:/var/log/nginx
配置文件位置: /etc/nginx
资源存放的位置: /usr/share/nginx/html
复制配置文件并创建文件夹
[wyuser@vm3test nginx]$ pwd
/opt/nginx
[wyuser@vm3test nginx]$ sudo docker cp 40ef70d978fe:/etc/nginx https://www.zhihu.com/topic/20173347/conf
[wyuser@vm3test nginx]$ ls
conf
[wyuser@vm3test nginx]$ cd conf/
[wyuser@vm3test conf]$ ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
复制资源文件并创建目录
[wyuser@vm3test nginx]$ sudo docker cp 40ef70d978fe:/usr/share/nginx/html https://www.zhihu.com/topic/20173347/html
[wyuser@vm3test nginx]$ ls
conf html
[wyuser@vm3test nginx]$ cd html/
[wyuser@vm3test html]$ ls
50x.html index.html
停止容器并删除
[wyuser@vm3test nginx]$ sudo docker stop 40ef70d978fe
[wyuser@vm3test nginx]$ sudo docker rm 40ef70d978fe
创建正式容器
[wyuser@vm3test nginx]$ sudo docker run -d -p 80:80 -p 443:443 --name mynginx -v /opt/nginx/conf:/etc/nginx -v /opt/nginx/html:/usr/share/nginx/html nginx
58ac1429bb75330d7e52f93c2068c4b8cde9462724883a7b60155f10302c03c9
以后如需修改nginx配置和资源,修改本地/opt/nginx/
配置文件和资源文件,按上述命令重新构建容器即可。
演示:将`/opt/nginx/html/index.html
文件内容 <h1>Welcome to nginx!</h1>修改为
<h1>Welcome to nginx!vm3test</h1>`,重新构建容器。
[wyuser@vm3test nginx]$ sudo docker restart 58ac1429bb75
[wyuser@vm3test html]$ cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!vm3test</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href=https://www.zhihu.com/topic/20173347/"http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href=https://www.zhihu.com/topic/20173347/"http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[wyuser@vm3test html]$ curl http://localhost | grep vm3test
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 622 100 622 0 0 73004 0 --:--:-- --:--:-- --:--:-- 77750
<h1>Welcome to nginx!vm3test</h1>
下载
[wyuser@vm3test vm3software]$ wget -c https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ tar -zxvf prometheus-2.30.3.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ cd prometheus-2.30.3.linux-amd64
[wyuser@vm3test prometheus-2.30.3.linux-amd64]$ vi prometheus.yml
在prometheus.yml中加入如下配置:
- job_name: 'vms'
static_configs:
- targets: ['192.168.192.101:9100','192.168.192.102:9100']
注意上面的格式。['192.168.192.101:9100','192.168.192.102:9100']
为目标服务器IP,目前处于Down状态。
[wyuser@vm3test prometheus-2.30.3.linux-amd64]$ https://www.zhihu.com/topic/20173347/prometheus --config.file=prometheus.yml &
[wyuser@vm3test ~]$ sudo firewall-cmd --zone=public --add-port=9090/tcp --permanent
[wyuser@vm3test ~]$ sudo firewall-cmd --reload
重启
[wyuser@vm3test prometheus-2.30.3.linux-amd64]$ vi restart.sh
ps -ef | grep prometheus | grep -v grep | awk '{print $2}' | xargs kill -9
https://www.zhihu.com/topic/20173347/prometheus --config.file=prometheus.yml &
[wyuser@vm3test prometheus-2.30.3.linux-amd64]$ sh restart.sh
访问:http://192.168.192.103:9090

[wyuser@vm3test vm3software]$ docker run -d --name=grafana -p 3000:3000 grafana/grafana
访问:http://192.168.192.103:3000(admin/admin)

[wyuser@vm3test ~]$ sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent
[wyuser@vm3test ~]$ sudo firewall-cmd --reload
grafana Dashboard官网 https://grafana.com/grafana/dashboards/ 可以选择不同的dashboard展示数据。
TODO
官网:https://prometheus.io/download/#node_exporter
下载 node_exporter
[wyuser@vm3test vm3software]$ wget -c https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
启动 node_exporter
[wyuser@vm3test vm3software]$ tar -zxvf node_exporter-1.2.2.linux-amd64
[wyuser@vm3test vm3software]$ cd node_exporter-1.2.2.linux-amd64
[wyuser@vm3test node_exporter-1.2.2.linux-amd64]$https://www.zhihu.com/topic/20173347/node_exporter &
放开端口
[wyuser@vm3test node_exporter-1.2.2.linux-amd64]$ sudo systemctl status firewalld
[wyuser@vm3test node_exporter-1.2.2.linux-amd64]$ sudo firewall-cmd --zone=public --add-port=9100/tcp --permanent
[wyuser@vm3test node_exporter-1.2.2.linux-amd64]$ sudo firewall-cmd --reload
访问:http://192.168.192.103:9100/metrics

同理 另外两台虚拟机vm1test和vm2test分别安装node_exporter,启动并放开9100端口。

配置prometheus.yml,添加以下内容,并重新启动prometheus
- job_name: "vms"
static_configs:
- targets: ["192.168.192.101:9100","192.168.192.102:9100","192.168.192.103:9100"]
配置grafana中的数据源


导入dashboard
dashboard id 11074 英文版 8919 中文版




下载mysqld_exporter
[wyuser@vm3test vm3software]$ wget -c https://github.com/prometheus/mysqld_exporter/releases/download/v0.13.0/mysqld_exporter-0.13.0.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ tar -zxvf mysqld_exporter-0.13.0.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ cd mysqld_exporter-0.13.0.linux-amd64
添加mysqld_exporter配置
[wyuser@vm3test mysqld_exporter-0.13.0.linux-amd64]$ vi .my.cnf
[client]
user=root
password=123456
启动mysqld_exporter
[wyuser@vm3test mysqld_exporter-0.13.0.linux-amd64]$ https://www.zhihu.com/topic/20173347/mysqld_exporter --config.my-cnf=.my.cnf &
有时会报错:msg="Error pinging mysqld" err="Error 1045: Access denied for user 'root'@'localhost' (using password: YES)"
原因密码中存在特殊字符# 。
[wyuser@vm3test mysqld_exporter-0.13.0.linux-amd64]$ cat .my.cnf
[client]
user=root
password=Ps@@##word516pd
解决如下:
[wyuser@vm3test mysqld_exporter-0.13.0.linux-amd64]$ cat .my.cnf
[client]
user=root
password=`Ps@@##word516pd`
配置prometheus.yml,添加以下内容,并重新启动prometheus
- job_name: "mysql_local"
static_configs:
- targets: ["192.168.192.103:9104"]
grafana 使用之前的prometheus数据源,导入dashboard ID = 7362
https://grafana.com/grafana/dashboards/7362

下载 redis_exporter
https://github.com/oliver006/redis_exporter
https://github.com/oliver006/redis_exporter/releases
[wyuser@vm3test vm3software]$ wget -c https://github.com/oliver006/redis_exporter/releases/download/v1.31.1/redis_exporter-v1.31.1.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ tar -zxvf redis_exporter-v1.31.1.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ cd redis_exporter-v1.31.1.linux-amd64
启动 redis_exporter
[wyuser@vm3test redis_exporter-v1.31.1.linux-amd64]$ nohup https://www.zhihu.com/topic/20173347/redis_exporter -redis.addr localhost:6379 &
开放端口
[wyuser@vm3test redis_exporter-v1.31.1.linux-amd64]$ sudo firewall-cmd --zone=public --add-port=9121/tcp --permanent
[wyuser@vm3test redis_exporter-v1.31.1.linux-amd64]$ sudo firewall-cmd --reload
配置prometheus.yml,添加以下内容,并重新启动prometheus
单机配置
prometheus.yml
- job_name: "vm_redis"
static_configs:
- targets: ["192.168.192.103:9121"]
集群配置
在另外两台虚拟机vm1test和vm2test安装redis。并不需要安装redis_exporter。
虚拟机 | redis |
---|
vm1test | Redis 6379 ; Redis 6380 |
vm2test | Redis 6379 |
prometheus.yml
## config for the multiple Redis targets that the exporter will scrape
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://192.168.192.103:6379
- redis://192.168.192.102:6379
- redis://192.168.192.101:6379
- redis://192.168.192.101:6380
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.192.103:9121
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets:
- 192.168.192.103:9121
通过192.168.192.103:9121
来抓取更多Redis实例的数据,每一个实例都会通过9121/scrape
来抓取,通过请求参数target来确定是查询哪一个Redis实例。最终抓取URL就像这样 http://192.168.192.103:9121/scrape?target=redis://192.168.192.101:6379
通过上面的配置就知道,只需要一个redis-exporter即可查询到所有集群的metrics数据。
重启Prometheus查看抓取的redis server信息

grafana 使用之前的prometheus数据源,导入dashboard ID = 2751

或者 dashboard ID = 763

下载
[wyuser@vm3test vm3software]$ wget -c https://github.com/ncabatoff/process-exporter/releases/download/v0.7.9/process-exporter-0.7.9.linux-amd64.tar.gz
https://github.com/ncabatoff/process-exporter
https://github.com/ncabatoff/process-exporter/releases
安装
[wyuser@vm3test vm3software]$ tar -zxvf process-exporter-0.7.9.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ cd process-exporter-0.7.9.linux-amd64
[wyuser@vm3test process-exporter-0.7.9.linux-amd64]$ vi config.yml
process_names:
- name: "{{.Matches}}"
cmdline:
- 'redis-server'
[wyuser@vm3test process-exporter-0.7.9.linux-amd64]$ nohup https://www.zhihu.com/topic/20173347/process-exporter -config.path config.yml > process-exporter.stdout 2>&1 &
grafana 使用之前的prometheus数据源,导入官⽅dashboard ID= 249

使用influxdb存储jmeter压测结果
[wyuser@vm3test vm3software]$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f76f3752c17f influxdb:1.7.9 "/entrypoint.sh infl…" 4 hours ago Up 2 hours 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp, 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp vcus_influx
a561ba58d456 grafana/grafana "/run.sh" 23 hours ago Up 2 hours 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp grafana
influxdb创建数据库jmeter,和用户名密码(admin , admin)
[wyuser@vm3test vm3software]$ sudo docker exec -it f76f3752c17f /bin/bash
root@f76f3752c17f:/# influx
Connected to http://localhost:8086 version 1.7.9
InfluxDB shell version: 1.7.9
> create database jmeter
> show databases;
name: databases
name
----
_internal
jmeter
> create user "admin" with password 'admin' with all privileges;
> show users
user admin
---- -----
admin true
创建压测脚本(线程组设置10*100,共1000个请求)

配置Backend Listener

配置Grafana数据源influxdb

8086为influxdb数据库端口

导入jmeter Dashboard , ID=5496

github:https://github.com/thelastpickle/jmx_exporter
下载地址:
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
[wyuser@vm3test vm3software]$ cd jvm
[wyuser@vm3test jvm]$ ls
[wyuser@vm3test jvm]$ wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
--2021-12-21 02:26:10-- https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
正在解析主机 repo1.maven.org (repo1.maven.org)... 151.101.196.209
正在连接 repo1.maven.org (repo1.maven.org)|151.101.196.209|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:469645 (459K) [application/java-archive]
正在保存至: “jmx_prometheus_javaagent-0.16.1.jar”
100%[========================================================================================>] 469,645 114KB/s 用时 4.0s
2021-12-21 02:26:15 (114 KB/s) - 已保存 “jmx_prometheus_javaagent-0.16.1.jar” [469645/469645])
[wyuser@vm3test jvm]$ chmod +x jmx_prometheus_javaagent-0.16.1.jar
[wyuser@vm3test jvm]$ ls
jmx_prometheus_javaagent-0.16.1.jar
[wyuser@vm3test jvm]$ vi jmx_exporter_config.yml
[wyuser@vm3test jvm]$ cat jmx_exporter_config.yml
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
type: GAUGE
attrNameSnakeCase: true
[wyuser@vm3test jvm]$ pwd
/home/wyuser/vm3software/jvm
启动java应用
[wyuser@vm3test halo]$ wget https://dl.halo.run/release/halo-1.4.2.jar
[wyuser@vm3test halo]$ java -javaagent:/home/wyuser/vm3software/jvm/jmx_prometheus_javaagent-0.16.1.jar=8585:/home/wyuser/vm3software/jvm/jmx_exporter_config.yml -jar halo-1.4.2.jar &
配置prometheus
- job_name: "vm3_halo_jvm"
static_configs:
- targets: ["192.168.192.103:8585"]
重启prometheus
[root@vm3test prometheus-2.30.3.linux-amd64]# https://www.zhihu.com/topic/20173347/restart.sh
开放8585端口
[root@vm3test wyuser]# firewall-cmd --zone=public --add-port=8585/tcp --permanent
success
[root@vm3test wyuser]# firewall-cmd --reload
success
访问prometheus
http://192.168.192.103:9090/targets

访问grafana http://192.168.192.103:3000 配置dashboard
dashboard ID: 3066或3457 8563

查看JVM监控

nginx下载:
https://openresty.org/en/download.html
wget -c https://openresty.org/download/openresty-1.19.9.1.tar.gz
nginx_vts_exporter 使用说明:
github: https://github.com/hnlq715/nginx-vts-exporter
下载地址:
https://github.com/hnlq715/nginx-vts-exporter/archive/refs/tags/v0.10.7.tar.gz
https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
[wyuser@vm3test vm3software]$ tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
nginx-vts-exporter-0.10.3.linux-amd64/
nginx-vts-exporter-0.10.3.linux-amd64/LICENSE
nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter
[wyuser@vm3test vm3software]$ cd nginx-vts-exporter-0.10.3.linux-amd64/
[wyuser@vm3test nginx-vts-exporter-0.10.3.linux-amd64]$ ls
LICENSE nginx-vts-exporter
Dashboard ID: 2949
参考github: https://github.com/danielqsj/kafka_exporter/releases
dashboard ID: 7589
官网: https://skywalking.apache.org/downloads/

[wyuser@vm3test vm3software]$ wget https://archive.apache.org/dist/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz
[wyuser@vm3test vm3software]$ tar -zxvf apache-skywalking-apm-es7-8.7.0.tar.gz
启动influxdb:
[wyuser@vm3test config]$ sudo docker start f76f3752c17f
f76f3752c17f
[wyuser@vm3test vm3software]$ sudo docker ps
[sudo] wyuser 的密码:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ac1429bb75 nginx "/docker-entrypoint.…" 6 weeks ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp mynginx
99c9e14d36a8 mysql:5.7 "docker-entrypoint.s…" 6 weeks ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql57
f76f3752c17f influxdb:1.7.9 "/entrypoint.sh infl…" 6 weeks ago Up 2 hours 0.0.0.0:8083->8083/tcp, :::8083->8083/tcp, 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp vcus_influx
ae3379799f64 redis "docker-entrypoint.s…" 6 weeks ago Up 2 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp vigilant_lumiere
a561ba58d456 grafana/grafana "/run.sh" 7 weeks ago Up 2 hours 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp grafana
修改 application.yml 使用influxdb存储
[wyuser@vm3test config]$ pwd
/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/config
[wyuser@vm3test config]$ vi application.yml


启动skywalking
[wyuser@vm3test bin]$ pwd
/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/bin
[wyuser@vm3test bin]$ sh startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
查看influxdb数据库
[wyuser@vm3test vm3software]$ sudo docker exec -it f76f3752c17f bash
root@f76f3752c17f:/# influx
Connected to http://localhost:8086 version 1.7.9
InfluxDB shell version: 1.7.9
> show databases;
name: databases
name
----
_internal
jmeter
skywalking
>
浏览器访问skywalking
http://192.168.192.103:8080/

如果8080端口冲突,修改webapp目录下的webapp.yml文件即可
server:
port:8082
[wyuser@vm3test agent]$ pwd
/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/agent
[wyuser@vm3test agent]$ ls
activations bootstrap-plugins config logs optional-plugins optional-reporter-plugins plugins skywalking-agent.jar
[wyuser@vm3test agent]$
agent目录说明:
1、目录说明:config存放配置文件,plugins存放执行的jar包,optional-plugins存放备用jar包(需要放入plugins才能执行)
2、修改探测的应用名称 vi config/agent.conf
agent.service_name=${SW_AGENT_NAME:vm3_halo}
修改skywalking后端服务器所在的IP地址
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.192.103:11800}
[wyuser@vm3test bin]$ pwd
/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/bin
[wyuser@vm3test bin]$ sh startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!
下载
[wyuser@vm3test vm3software]$ wget https://dl.halo.run/release/halo-1.4.2.jar
启动应用
[wyuser@vm3test halo]$ cat start_with_skywalkingaget.sh
java -javaagent:/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -jar halo-1.4.2.jar &
[wyuser@vm3test halo]$ sh start_with_skywalkingaget.sh
[wyuser@vm3test halo]$ DEBUG 2021-12-21 04:34:28:219 main AgentPackagePath : The beacon class location is jar:file:/home/wyuser/vm3software/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar!/org/apache/skywalking/apm/agent/core/boot/AgentPackagePath.class.
INFO 2021-12-21 04:34:28:220 main SnifferConfigInitializer : Config file found in /home/wyuser/vm3software/apache-skywalking-apm-bin-es7/agent/config/agent.config.
__ __ __
/ / / /___ _/ /___
/ /_/ / __ `/ / __ \
/ __ / /_/ / / /_/ /
/_/ /_/\__,_/_/\____/
Version: 1.4.2
2021-12-21 04:34:41.461 INFO 5394 --- [ main] run.halo.app.Application : Starting Application v1.4.2 on vm3test.vcus.net with PID 5394 (/home/wyuser/vm3software/halo/halo-1.4.2.jar started by wyuser in /home/wyuser/vm3software/halo)
浏览器访问应用,可以在skywalking ui界面看到相关链路接口的信息

相关参考github:
https://github.com/apache/skywalking/blob/5.x/docs/cn/Deploy-skywalking-agent-CN.md
部署 skywalking javaagent
- 拷贝agent目录到所需位置. 日志,插件和配置都包含在包中,请不要改变目录结构.
- 增加JVM启动参数, -javaagent:/path/to/skywalking-agent/skywalking-agent.jar. 参数值为skywalking-agent.jar的绝对路径。
新的 agent package 目录结构如下:
+-- skywalking-agent
+-- activations
apm-toolkit-log4j-1.x-activation.jar
apm-toolkit-log4j-2.x-activation.jar
apm-toolkit-logback-1.x-activation.jar
...
+-- config
agent.config
+-- plugins
apm-dubbo-plugin.jar
apm-feign-default-http-9.x.jar
apm-httpClient-4.x-plugin.jar
.....
skywalking-agent.jar
- 启动被监控应用.
- 插件全部放置在
/plugins
目录中.新的插件,也只需要在启动阶段,放在目录中,就自动生效,删除则失效. - Log默认使用文件输出到
/logs
目录中.
部署 java agent FAQs
- Linux Tomcat 7, Tomcat 8 修改
tomcat/bin/catalina.sh
,在首行加入如下信息.
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/path/to/skywalking-agent/skywalking-agent.jar"; export CATALINA_OPTS
- Windows Tomcat 7, Tomcat 8 修改
tomcat/bin/catalina.bat
,在首行加入如下信息.
set "CATALINA_OPTS=-javaagent:/path/to/skywalking-agent/skywalking-agent.jar"
- JAR file 在启动你的应用程序的命令行中添加
-javaagent
参数. 并确保在-jar
参数之前添加它. 例如:
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar
你是如何搭建 Web 前端性能监控系统的?
zaneperfor环境如何部署?
坂田贝尔路有一个智谷一川的各种骗人,和各种不教
有性能问题,上HeapDump性能社区!
在本文中,分享了一些在大型程序项目上工作的经验,以及当我开始制作旨在解决业务关键问题的软件时,监控是如何进入我的架构生涯的。
解决客户的关键问题可以产生巨大的商机,但同时,我们也需要为真正的高客户期望做好准备。
为了服务这些客户并抓住这些商机,我们很快意识到了自动化的重要性,也意识到了它的负面性。
我们每个月都有新客户;申请越来越复杂,官僚作风也越来越多,以前一个月一次的突发事件,现在每天都让我们加班到很晚。
我不知道我的应用程序已损坏,因为客户直接向我报告了错误。
至于那些不报告错误的客户,他们自然是选了另外一家服务。
在担任了十多年的软件工程师之后,我花了很多时间来选择最好的工具来提高我的工作效率。
监控领域出现了很多混乱,可能是因为可以以多种不同方式使用大量数据。起初,这种方法对开发人员来说是一个挑战,他们很难理解什么是解决紧急情况的最佳组合。在这篇文章中,我写了我试图区分的一些经验:
- 何时或在何种情况下监控可以有效?
- 为什么你应该监控系统的某些部分而其他部分不?
- 每个特定监控问题的最佳工具是什么?
应用监控工具一般由两部分组成:
- 信息收集,The Agent
- 分析平台,The Analytics Platform
Agent是开发人员安装在其服务器或应用程序中的软件包(基于代理的设计方式)。其目标是收集有关应用程序行为和性能的相关信息。
此信息被发送到远程平台,该平台分析该数据并生成可视图表,以帮助开发人员轻松了解其应用程序中发生的情况。如果出现问题,它能够向开发人员发送警报。
这显然是一个简单的描述,可以涵盖大量的工具。
事实上,很多工具看起来像应用程序监控工具,但它们与应用程序监控无关。这些相似之处让我很难找到合适的工具来解决我的生产力问题。
这是我在工作中逐步慢慢学到的。
日志管理工具通常是我们倾向于使用的第一种工具,因为自从变成一个程序员开始,查看应用程序日志是每天最重要的活动之一,以了解我们应用程序中最重要的流程中发生的事情.
但是当应用程序开始扩展时(它在多台服务器上运行,需要复杂的架构等),我意识到很难从日志中提取有关应用程序性能的相关信息并随着时间的推移监控新版本的影响。
就像汽车发明时一样,人们最初是在寻找更快的马,因为他们习惯了使用马。然后他们意识到需要一种不同的工具才能将其提升到一个新的水平。
正常运行时间监控工具可以描述为更复杂的“ping”。
主要目的很简单:他们从多个区域 ping 你的程序端点,以了解位于不同地理位置的用户可以访问它的好坏程度。
此信息有助于了解云基础架构如何将你的程序带给最终用户(负载均衡器、CDN、网络等);它不提供有关程序内部发生的事情的任何信息。
就我而言,我的程序为世界各地的用户提供服务,因此外部 ping 统计信息通过决定我们应该将服务器放置在哪些区域来帮助我们了解哪些区域的延迟最高。
他们监控外部环境;你永远不会知道你的数据库是否变慢了。
这是最难理解的区别,我没有找到任何有趣的文章来帮助我澄清职责分离,而不是试图向我推销各种工具的广告。
应用程序在服务器上运行,因此它们显然是两个严格相关的系统组件。这就是为什么一开始它可能会令人困惑。
但是服务器和应用程序监控完成了两个完全不同的需求。
服务器监控侧重于基础设施,而且基本上任何像样的云提供商都免费提供。
Google GCP、AWS和DigitalOcean默认为您提供最重要的指标,如 CPU 使用率、存储、带宽等,完全免费,除了运行 VM 本身之外没有额外费用。

了解你的虚拟机必须扩大(或缩小)的时间是一项重要的必要条件,但说 CPU 处于 100% 可能意味着一切,也可能什么也不是:
- 如果你的程序消耗太多资源,那需要重构程序的哪一部分?
- 你如何确定为什么程序的某个部分速度变慢,从而给你的用户带来了负面体验?
- 你又如何知道程序是否正在触发异常,为什么?
如文章开头所述,服务器监控通过在服务器级别安装代理来工作,因此它在程序“外部”。但是几乎不可能从外部查看你的程序并知道代码内部发生了什么。
程序监控最终只能将注意力集中在“应用程序”上。
这类工具为你提供了一个软件库,而不是安装在操作系统中的软件包。开发人员在他们的应用程序中安装集成库,就像任何其他依赖项一样,而无需触及服务器的配置。它会自动收集有关您的代码性能、错误和趋势的相关信息,以便在出现问题时提醒你,就像一个哨兵一样。
应用程序监控工具提供指标和警报来识别应用程序中的错误和瓶颈,而无需等待客户报告问题。
精心设计的应用程序监控解决方案为开发人员提供了将程序性能与业务成果联系起来所需的信息,并在性能问题影响最终用户之前识别并修复它们,从而实现更好的技术支持和最佳的服务连续性。
它就像一个哨兵,让你可以直观地探索代码的运行方式,完全自主地完成 90% 的分析工作。
这就是 Inspector 的设计目的以及它在监控市场中的定位。
这很重要,因为满意的客户是付费客户。
相对而言,拥有应用程序是容易的部分;任何人都可以做到。
真正的工作始于与客户建立融洽的关系并使他们成为第一。
如果你将客户放在首位,他们将仍然是你应用程序的忠实粉丝。另一方面,对企业来说最糟糕的事情之一是容易出错、有缺陷的软件。
没有什么比等待网站加载或完全关闭网站更快地驱走潜在的付费客户了。所以尽一切可能让他们开心,收入就会随之而来。
您应该能够轻松了解应用程序完成 HTTP 请求或完成后台进程(如作业、cron 任务等)需要多长时间,以了解系统中消耗最多的进程是什么。
每个执行周期通常称为“事务”。因此,在事务期间,应用程序可以执行许多不同的任务,例如 SQL 查询、读/写文件、调用外部系统、算法等。
我们将此任务列表称为“时间线”,您可以如下图所示直观地探索它:

所有这些信息都由监控工具自动收集,无需开发人员进行任何棘手的配置。
我真的相信清晰和简单的信息是做出更好决策的最重要的事情。
了解为什么、何时以及如何使用监控工具是我开发者旅程中最令人困惑的部分之一,我希望这段经历可以帮助你更清楚地了解您的需求以及你需要解决的正确工具是什么,从而提升你的生产力。
原文作者:Valerio Barbera
更多程序性能相关:
从零开始搞监控系统(1)——SDK
从零开始搞监控系统(2)——存储和分析
从零开始搞监控系统(3)——性能监控
字节的前端监控SDK是怎样设计的
字节前端监控SDK体积与性能优化实践
图解 | 监控系统 Prometheus 的原理
D炸天的Redis,该如何监控?
使用 Lighthouse CI 进行性能监控
线程池如何监控,才能帮助开发者快速定位线上错误?
腾讯云医小程序性能优化与监控的实战
文中结合一次重保活动的性能压测需求,详解了整体的性能测试策略及性能分析思路,并在实施过程中有效利用了NPT性能测试平台完成了压测场景设计、执行、业务指标监控、性能指标分析,结合监控找出了性能瓶颈并给出了相应的性能优化解决方案
A业务有大促活动,对B业务有依赖,要求B业务对于X场景能够持续稳定支撑1.4w TPS 5min, 如此要对B业务进行性能压测,完成对应的性能需求。
如下所示,接下来按照这个思路去分析下整个性能测试实践的流程。

容量指标:X场景支撑1.4W TPS 持续5min
【业务模型】
涉及的场景包含A-》B-》C-》D共4个接口,按照真实业务分析流量比例为3:1:1:1
【监控模型】
监控对象
– 测试活动中的所有服务器,测试机、应用服务器、数据库服务器、缓存服务器、依赖服务等资源监控
– 所有被测的应用服务监控,Nginx、tomcat、MySQL等。

监控内容
业务指标:吞吐量、响应时间、失败率
资源监控:CPU、内存、磁盘、网络、IO
日志信息:错误、异常、关键业务日志
进程监控:CPU、内存、进程状态、线程状态
一个典型的linux 性能监控工具图:

测试环境:线上真实业务集群
测试数据:场景是从客户端APP发起调用接口,考虑到线上数据样本不涉及隐私及敏感数据且可以复用,不会对用户造成数据污染。故从线上捞取了100万用户数据样本。
压力策略:
1)先摸高,按照一定的线程递增策略,根据预期目标是否有性能瓶颈
2)峰值容量持续压测,观察系统的承受及处理能力
利用NPT性能压测平台完成整个性能压测活动
易测NPT_性能压测_一站式测试解决方案-网易数帆

经过压测在NPT平台中压测后的TPS-RT曲线如下

接下来按照性能分析的典型思路给大家逐一介绍下:

【瓶颈的精准判断】
很多情况下,在分析系统性能瓶颈的时候,我们总是想找到性能瓶颈的那个“拐点”,但是实际上大部分系统其实是没有明确的拐点的。在实际操作中需要按照固定递增幅度增加并发线程数,进而对于TPS 的增加控制得更为精准,实际业务中TPS的增加是有一个有清晰的弧度,而不是有一个非常清晰的拐点。
从上图业务真实TPS-RT曲线中可以做出以下判断:在线程逐步递增的过程中,TPS按照固定比例上升与线程数呈现线性增长,达到一定的压力的情况下,TPS的增长幅度在衰减,最后逐步趋于平稳。以此可以判断出业务在一定的压力情形下出现了性能瓶颈。为了更加清晰判断性能瓶颈,接下来分析下性能衰减的过程。
【性能衰减的过程】
所谓的性能衰减可以通过每线程每秒请求数在逐渐变少来反应,即使TPS仍在增加,如下针对压测业务采用3个点,计算每线程每秒请求数

采样点1:每线程每秒请求数=9547/270=35.3

采样点2:每线程每秒请求数=13461/450=29.9

采样点3:每线程每秒请求数=13773/495=27.8
由此可以得到如下结论
只要每线程每秒的请求数开始变少,就意味着性能瓶颈已经出现了。但是瓶颈出现之后,并不是说服务器的处理能力(这里我们用 TPS 来描述)会下降,应该说 TPS 仍然会上升,在性能不断衰减的过程中,TPS 就会达到上限。
在这个场景的测试过程中,在性能瓶颈出现后,继续保持递增的压力,让瓶颈更为明显,可以看如下TPS-RT的曲线,我们会更加清晰的看到压力还在逐步增加,但TPS已经趋于平稳,而平均RT却在不断上升

【响应时间的拆分】
基于性能瓶颈的出现,接下来就需要分析在性能瓶颈出现时,哪个链路耗时增加明显导致请求RT变长。那么首先需要做的是画出请求的整个业务链路。这里的策略是:先粗后细,先从较粗的粒度划分,确认耗时较长的链路节点,然后再细分粒度可能到某个方法。我们先来看一个典型的响应时间RT的分布链路

响应时间 = (N1+N2+N3+N4)+(A1+A2+A3),一般我们优先关注的是A1、A2、A3,对于网络传输处理,在这里优先默认它表现良好
基于业务场景的链路:

第三方依赖服务采用了hystrix降级熔断组件实现了独立线程池隔离调用。
1)首先要排除发压端是否有瓶颈,查看发压端服务器监控,CPU利用率和负载都还不到10%

2)分析下调用第三方依赖服务的平均RT,对比如下
单应用实例 20并发 平均rt 19.25
单应用实例 50并发 平均rt 38.25
由此看来在并发用户数一直往上增时,调用第三方依赖服务RT上涨明显,进而初步需要排查的是第三方依赖服务在大并发用户数下的处理能力,并发用户数增加,处理能力下降,导致RT边长
这里优先说下在第一轮性能压测时发现的问题并调整,同样是TPS摸高,从下图可以看出TPS还未达到性能瓶颈时,已经出现失败请求

经过分析调用第三方的线程池被打满抛异常,采用的hystrix实现的业务降级熔断,配置了独立的线程池,线程池配置为核心和最大线程数为20,队列为0
异常日志:
Task java.util.concurrent.FutureTask@66339c68 rejected from java.util.concurrent.ThreadPoolExecutor@303bf923[Running, pool size = 20, active threads = 20, queued tasks = 0, completed tasks = 2071934]
代码实现配置如下,进而优化调整线程池,核心线程数和最大线程数都调整为50

【构建决策分析树】

从压力工具中,只需要知道 TPS、响应时间和错误率三条曲线,就可以明确判断瓶颈是否存在。再通过分段分层策略,结合监控平台、日志平台,或者其他的实时分析平台,知道架构中的哪个环节有问题,然后再根据更细化的架构图一个一个拆解下去。因为这里业务很明显找到了影响RT变长的原因,在此没有进一步分析下去。

【性能分析】
针对precheck压测恒定压力1.4W 持续3min后,中间突然TPS陡增,初步分析是因为服务器端口耗尽了,看了下TCP连接状态,大量Time_wait,调用第三方依赖服务接口监控中可以看到对应时间点开始抛异常




看了下服务器的相关配置,对于端口的回收、复用、超时都未进行优化配置

性能优化解决方案:
1)调整应用服务器对于端口的回收、复用、超时进行优化配置
2)将B业务作为客户端调用第三方依赖服务的连接改为长连接,避免短连接每次请求都会占用一个端口
扩展延伸
几种典型的异常波动:
• tps持续下降
• tps频繁波动
• tps陡升陡降
• tps剧烈下降
在此感谢下一位性能测试专家-高楼的一些关于性能测试方向的总结思考,实践过程中有借鉴
【关键总结】
性能测试是针对系统的性能指标,建立性能测试模型,制定性能测试方案,制定监控策略,在场景条件之下执行性能场景,分析判断性能瓶颈并调优,最终得出性能结果来评估系统的性能指标是否满足既定值。
java运行前提条件:安装JRE和JDK(1.8)
1、安装jdk(1.8)
2、下载免费的jmeter
3、启动jmeter
注意:不需要配置jmeter环境变量,需要配置jdk环境变量
同一台电脑可通过以下多个打开方式运行多个jmeter
1、windows下打开jmeter的英文版本
双击bin目录下的jmeter.bat启动英文版本

2、windows下打开jmeter的中文版本
双击bin目录下的ApacheJMeter.jar启动中文版本

3、mac下打开jmeter

4、终端下通过命令打开jmeter
windows:通过终端命令 java -jar Apache JMeter.jar启动jmeter
mac:通过终端命令 sh jmeter.sh启动jmeter
1、可通过修改jmeter.properties文件字段将jmeter英文改为中文
①打开文档jmeter.properties
②搜索#language=en
③将#language=en修改为language=zh_CN

2、jmeter运行时提示未安装证书,可通过双击bin目录下文件生成证书
windows下生成证书:

mac下生成证书:

在小破站看到一个很久以前关于华为智慧屏V75的测试视频,给大家分享一下。
视频有点长,就给大家把实际使用测试的地方时间轴给标出来了。
整个使用的过程中,包括了打开文件速度、音质、画质以及switch等等的测试。
作者的使用也是一个很普通的消费者最直观的感受,不是专业的测评,但是真实效果很贴切。
大家自行观看。
00:48 开机
02:49 加州旅馆
06:47 渡口
09:01 光年之外
12:31 纯黑漏光测试
14:07 4K影片播放
16:17 HDR影片播放
19:13 滚动地图 帧率测试
20:32 动态补偿测试
23:06 画面变形测试
23:17 分区背光测试
27:20 生态微观影片展示
36:28 电视剧画质细节
48:42 语音打开应用
第一个阶段:(功能测试)
功能测试的话呢,是我的功能测试阶段。在功能测试阶段就是我们俗称的:点点点(点工)由于历史原因,点点点,软件测试工程师基本都做过。
首先我们来看一下点点点功能测试做一些什么内容,主要就是看这个研制开发的软件是不是符合需求说明书指明的一些要求,这个是什么意思呢?也就是说:这个软件它有没有实现需要的功能,实现的功能到底正不正确。
打一个简单的比方,我们的美团外卖,大家都用过对吧?这个软件开发出来就是方便大众人群去外卖的下单-配送之类的需求功能。那我们在平时用这个APP的时候,会不会关心我下的这个单有没有成功?下的单有没有给我扣费更多?或者更少?(这个就是bug)这些都是我们的功能测试。
包括我们经常用的知乎,能不能正常登录,登录了之后我能不能去关注好友,我能不能去发私信?发图片发视频?(知乎好像私信是不能发视频)这些都是功能测试。所以相对来说我们每个人都接触过功能测试,这个也是我们对于软件测试入门的一个阶段。
这一个阶段,技术要求不是很高,同样的薪资待遇也没有那么的高,想要在这一个阶段的基础上去提升自己的薪资的话,就得往后面的阶段去努力!

第二阶段:(接口测试阶段)
在接口测试阶段的话,我们可以脱离可视化界面,对软件进行一个全面的测试。相对功能测试来说,我们去验证登录是不是成功,搜索是不是成功,或者说能不能发送信息等等之类的这些操作,是不是都要把这个软件运行起来然后去执行,才能去发现它的这一个结果。是否和我们功能的预期是不是一致的。
但是接口的话,我们在没有这个界面的情况下,我们也能去进行相关的测试。(能不能发送信息等等之类的这些操作)这个就是我们的接口测试的阶段。
接口测试阶段,可以在功能测试的基础上,去提升我们的薪资待遇,提升我们的个人竞争力。如果你想在这个阶段再往上面走的话呢?我们接着往下看。
第三阶段:(工具测试阶段)
工具对与软件测试人员来说,就相当于我们古时候江湖里的武功秘籍或者宝物,谁得到了宝物得到了武功秘籍,谁就能站在巅峰,一统江湖!
它的话呢,能够帮助我们去提高我们的测试效率,可以解放我们的双手。同样的话你在这一个阶段,你的薪资可以在接口测试阶段提升3-5K左右。
第四阶段:(脚本测试阶段)
工具它毕竟只是一个外设的辅助工具。帮助你去提升一定的软件测试效率,如果说你只会使用工具,杀伤力还不够!我们在学会使用工具的前提下,我们还要学会一门编程语言,(Python当下是一个主流,对新手入门很友好,也是人工智能一大利器)去进行一个相关的编程脚本。让脚本来代替人工的一个操作,根据你对公司业务的理解、你的想法,编写一个脚本进行一个相关的测试。
到了这里,就可以真正的在一定程度上去解放你的双手,提升你的薪资,提升你的竞争力、不可替代性!
第五阶段:(测试开发阶段)
这个阶段也是我们听得最多的一个词,也就是我们的测开!达到这样一个层次的话。我们必须要干嘛?
能够自己去写出一些测试工具,或者测试框架。去协助我们整个的软件测试团队开展测试工作。在测试工具阶段我们是能够去使用测试工具,到了这一个阶段我们针对公司业务不同,自主独立开发最适合公司业务的测试工具、测试框架!
第六阶段:(全栈测试阶段)
软件测试人员的小目标!可以对软件进行随心所欲的任何方面的测试。(性能测试、压力测试、安全测试等)因为到了这一个层次,基本上前面的所有阶段你都非常的熟悉,而且轻而易举。
- CPU
1.1 load average含义:过去1分钟,5分钟,15分钟的平均负载;平均负载的含义:指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。
1.2 CPU使用率:按照时钟来计算的,所以cpu使用率是1-空闲时间/总的时钟时间
1.3 Load Average和CPU使用率关系:
对于CPU密集型任务:Load Average和CPU使用率都会高
对于IO密集型任务:Load Average会高,但是CPU使用率不一定高
1.4 top显示的CPU指标含义:
a. us: 用户态的CPU时间
b. ni: 低优先级用户态CPU时间
c. sy: 内核态CPU时间
d. id: 空闲时间
e. wa: 等待IO的CPU时间
f. hi: 处理应中断的CPU时间
g. si: 处理软中断的CPU时间
1.5 CPU使用率过高处理方法:
a. 使用top或者pidstat命令找到使用CPU最多的进程
b.使用perf top查看占用CPU最多的函数或者指令,加上-g参数可以看到函数的调用栈
c.对于一些退出较快的进程,top命令不容易找到占用CPU较多的进程,使用:perf record -g 和 perf report可以分析出历史事件
d.如果是IOWait较高,可以通过pidstat -d 1 20查看每个进程的IO情况:
# 间隔 1 秒输出多组数据 (这里是 20 组)
$ pidstat -d 1 20
...
06:48:46 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:47 0 4615 0.00 0.00 0.00 1 kworker/u4:1
06:48:47 0 6080 32768.00 0.00 0.00 170 app
06:48:47 0 6081 32768.00 0.00 0.00 184 app
06:48:47 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:48 0 6080 0.00 0.00 0.00 110 app
06:48:48 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:49 0 6081 0.00 0.00 0.00 191 app
06:48:49 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:50 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
06:48:51 0 6082 32768.00 0.00 0.00 0 app
06:48:51 0 6083 32768.00 0.00 0.00 0 app
06:48:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
e. 如果确定了某个进程造成了CPU使用率过高,可以使用strace -p查看这个线程的调用栈,从而知道哪个函数占用CPU最高 ?进程?线程?
1.6 大量僵尸进程处理方法:
a. 僵尸进程是有父进程没有回收子进程导致的
b.使用pstree -aps pid找到进程的父子关系,从而找到父进程,进行分析
1.7 对于Java程序,可以使用perf工具,查看火焰图,从而判断出哪个函数最消耗CPU
2. 内存
2.1 free指令各项指标含义:
$ free
total used free shared buff/cache available
Mem: 8169348 263524 6875352 668 1030472 7611064
Swap: 0 0 0
a. total: 总内存
b. used: 已经使用的内存,包括了共享内存
c. buff/cache: 缓存和缓冲区的大小 buffer? cache分别指的是啥?
d. available:新进程可使用内存大小
2.2 top命令各项指标含义:
$ top
...
KiB Mem : 8169348 total, 6871440 free, 267096 used, 1030812 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7607492 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
430 root 19 -1 122360 35588 23748 S 0.0 0.4 0:32.17 systemd-journal
1075 root 20 0 771860 22744 11368 S 0.0 0.3 0:38.89 snapd
1048 root 20 0 170904 17292 9488 S 0.0 0.2 0:00.24 networkd-dispat
1 root 20 0 78020 9156 6644 S 0.0 0.1 0:22.92 systemd
12376 azure 20 0 76632 7456 6420 S 0.0 0.1 0:00.01 systemd
12374 root 20 0 107984 7312 6304 S 0.0 0.1 0:00.00 sshd
a. VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。
b. RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。
c. SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及程序的代码段等。
d.%MEM 是进程使用物理内存占系统总内存的百分比。
2.3 内存泄露定位和处理
a. 通过pidstat- d可以找出哪个进程造成内存的上升
b. 通过memleak -p可以找出进程分配内存的调用栈
3. IO
3.1 iostat指令各项指标,显示每块磁盘的性能数据
$ iostat -d -x 1
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm Թ
loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

3.2 pidstat各项指标含义
$ pidstat -d 1
13:39:51 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
13:39:52 102 916 0.00 4.00 0.00 0 rsyslogd
uid:用户id
pid: 线程id
kB_rd/s: 每秒读数据大小
kB_wr/s:每秒写数据大小
kB_ccwr/s:每秒取消的写请求数据大小
iodelay:块IO大小
3.3 找出造成磁盘IO瓶颈的原因
a. 通过top命令观察iowait的情况
b. 通过iostat命令找到出现瓶颈的磁盘
c. 通过pidstat命令找到读写请求,ioutil很高的进程
d. strace -p打印进程的调用栈
e. lsof -p找到进程打开了那些文件
4. C 程序定位问题方法
4.1 top命令查看当前负载
4.2 top -Hp pid 查看当前进程的所有线程 cpu/memory占用情况,可以大致知道哪个线程有问题
4.3 sudo pstack pid >> be.pstack 进一步查看线程的栈,可以知道程序卡在哪里
4.4 sudo perf top 查看消耗cpu较高的函数
4.5 addr2line工具使用:通过addr2line可以把stdout日志中的地址解析成代码栈,方便定位问题
addr2line -e lib/palo_be 0x2af6f63 0x2c4095b 0x134d278 0x134bdcb 0x133d105 0x133d1d0 0x19930ed
4.6 pprof 生成cpu调用栈关系图
pprof --svg --seconds=60 http://be_host:be_webport/pprof/profile > be.svg
5. Java 程序定位问题方法
5.1 截栈,可以看出来最多的线程是哪个,线程等待什么锁
jstack -l pid >> fe.jstack
如何排查死锁:https://juejin.cn/post/6844904152850497543
5.2 截堆,可以分析出来哪一块占用较多内存
jmap -dump:live,format=b,file=m.hprof PID
heap文件较大,解析时占用内存很高,不能在线上机器解析文件,拷贝到build04分析
调用命令对heap文件进行解析:
https://www.zhihu.com/topic/20173347/ParseHeapDump.sh m.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
https://www.cnblogs.com/liangzs/p/8489321.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/43536.html