性能测试工具 性能测试平台 - 集分布式压测、服务器资源监控、Linux 连接于一体的平台

leeyoshinari · 2022年11月25日 · 最后由 leeyoshinari 回复于 2022年11月26日 · 6632 次阅读

写在最前面:
  这次带来一个主要用于性能测试的平台(当然也可以不用于性能测试),下面就介绍一下这个平台:

具有的功能

1、服务器管理,可以统一查看服务器的基本信息
2、Shell 远程连接,支持本地和服务器之间的文件上传和下载
3、服务器资源监控
4、Nginx 访问日志流量收集
5、性能测试工具,提供自动化压测和分布式压测的能力,当然也支持全链路压测

第三方组件

  • 关系型数据库:SQLite3 或 MySQL - 用于存储平台数据
  • 时序数据库:InfluxDB - 用于存储监控数据
  • 键值数据库:Redis - 用于集群/分布式数据同步
  • 文件服务器:MinIO - 用于存储文件
  • 性能测试工具:JMeter - 用于执行 JMeter 脚本

架构图

在这里插入图片描述
  如需满足较多用户使用,请部署集群;如需高可用,请自行部署 keepalive。

说明

collector-agent
  数据收集工具。所有 agent 的数据都会发给 collector-agent,然后由 collector-agent 统一写 InfluxDB/写 redis。
  这样可以避免:如果每个 agent 单独连接数据库,可能会导致数据库连接不够用或者超过服务器允许的连接数。但也会有一个问题:如果 agent 太多,导致 collector-agent 不能及时写库,那就增大 collector-agent 的线程池大小,如果还不行,那就集群部署,增加集群节点。

monitor-agent
  服务器资源监控工具。通过执行 Linux 命令实时采集服务器的 CPU、内存、磁盘、网络、TCP 等数据。

nginx-agent
  nginx 流量采集工具。通过实时处理 nginx 的访问日志 (access.log),将接口的访问信息 (访问时间、客户端 IP、接口名称、请求方法、协议、状态码、响应体大小、响应时间) 等存储到数据库。

jmeter-agent
  性能测试执行工具。通过调用 JMeter 执行性能测试,支持分布式压测和全链路压测。

部署

  详见 Github https://github.com/leeyoshinari/MyPlatform

在这里插入图片描述
如需查看教程,可在部署成功后点击教程查看。

Shell 工具

  该工具可以查看管理服务器,并可以直接在浏览器上远程连接 Linux。
  支持权限控制,将用户添加进项目组中,用户就只能看到项目组下的服务器,可以避免未授权的访问。
在这里插入图片描述

具体使用

设置项目组

  点击 Create Group 创建项目组,需要设置项目组和项目组应用的唯一标识符。唯一标识符一般在整个公司是唯一的,对于在服务器上,通过ps -ef | grep 唯一标识符 | grep -v grep 命令可以查找到唯一一个进程。
  该按钮仅管理员可见。

设置服务器所在机房

  点击 Create Server Room 创建机房,设置机房时主要有 3 个选项,分别是用于应用、用于中间件、用于压测。为什么有这 3 个呢?
  例如一个机房有 100 台服务器,项目组 A 用了 40 台部署自己的服务,项目组 B 也用了 40 台部署自己的服务,还有 10 台服务器部署了中间件,剩余 10 台可以用于压测,这 3 个选项就用于区分这些类型。因为这个项目把服务器管理、服务器监控和压测整合在一起了,为了能够区分,所以才加了 3 个选项;不像大公司的平台都是不同的人开发的不同的应用,只是把前端页面挂在一起。

  一般性能测试需要施压机和被测服务所在服务器在同一个机房,如果你就想跨机房压测,可以把不是同一个机房的服务器设置成同一个机房,假装它们在一起。
  该按钮仅管理员可见

添加服务器

  点击 Add Server 创建服务器,这里需要设置服务器所属项目组、所在的机房、以及服务器 IP、用户名和登录密码。

用户管理

  点击 Add User 将用户添加到某个项目组中 或 从某个项目组中移除。添加用户后,该用户就可以看到并访问这个项目组中的所有服务器。管理员默认可以查看所有服务器。
  该按钮仅管理员可见

服务器列表

  每个添加的服务器都会展示在列表中,可以概览服务器的基本信息(系统、CPU、内存、磁盘)。Action 列可以操作服务器,在这里可以打开 Shell 远程连接 Linux;其中的编辑和删除的功能仅创建人和管理员可见。

远程连接服务器

  点击 OpenShell 即可打开 Shell 远程连接 Linux,可以同时打开很多个页面,如下:
在这里插入图片描述
  为了提供更好的使用体验,该工具支持 Ctrl+C(复制)和 Ctrl+V(粘贴)快捷键,不仅如此,还仍然保留了 Ctrl+C 快捷键在 shell 中的终止前台进程的功能,而绝大部分主流 shell 工具是不支持这种功能的,老板再也不担心你敲命令慢了。

  在打开的 Shell 中,可以上传文件到服务器,或者下载文件到本地。为了安全,上传和下载的入口也是可以关闭的。
   在上传文件时,首先会弹出输入框,需要填入文件上传到哪个目录(绝对路径,不填默认 /home 目录),然后选择文件上传。
  在下载文件时,也会弹出输入框,需要填入文件的完整路径(绝对路径),必须填文件路径,不能填目录路径,然后可通过浏览器下载到本地。

自动部署 Agent

  点击 Deploy 会打开新的页面,这个页面可以上传部署包、自动部署和卸载。
在这里插入图片描述
  由于一些部署包区分 Linux 发行版本和 CPU 架构,故需要先准备好对应的部署包,然后上传到平台,通过该平台进行部署。如果部署包不区分 Linux 发行版本和 CPU 架构,上传部署包时可随意选择一种。
  该平台下面的所有 agent 都可以且只能通过该平台自动部署(当前只支持部署 java、jmeter、collector-agentmonitor-agentjmeter-agentnginx-agent )。为了方便部署,所有的 agent 的配置文件已经简化到不能再简化了,一般情况下不需要修改任何配置,所有的配置都从平台自动获取。建议部署顺序:先部署 Java(仅施压机部署且没有部署过),再部署 JMeter(仅施压机部署),再部署 collector-agent,剩下就部署其他需要部署的 agent 了。

  在点击部署/卸载前,请仔细核对当前服务器的 Linux 系统发行版本和 CPU 架构是否和部署包的 Linux 系统发行版本和 CPU 架构一致。

  注:极少数情况下需要修改 agent 配置文件,例如:你的 nginx 部署方式和 99% 的人都不一样,无法自动获取 nginx 的日志路径,这时就需要修改配置文件。

服务器资源监控

  该工具主要用于监控服务器资源使用情况,主要有一下功能:
  1、监控整个服务器的 CPU 使用率、io wait、内存使用、磁盘 IO、网络带宽和 TCP 连接数
  2、监控端口的 TCP 状态
  3、针对 java 应用,可以监控 jvm 大小和垃圾回收情况;当 Full GC 频率过高时,可发送邮件提醒
  4、系统 CPU 使用率过高,或者剩余内存过低时,可发送邮件提醒;可设置自动清理缓存

  相较于之前的服务器资源监控工具(快点我查看),此次进行了大刀阔斧地改进,首先不再是单独的工具,而是集成进平台中,和平台中的其他工具可以无缝对接;其次是使用了全新的交互和监控方案,并引入了项目组和机房,更加适用于大规模集群部署的应用。

首页

首页展示了所有已经部署监控的服务器,这里可以概览服务器资源的当前使用情况。这个入口仅管理员可以看到,可分项目组查询。
在这里插入图片描述

可视化

  监控结果可视化,分项目组和机房查看,可选择任意时间段(监控数据保留时长在配置中设置)。
在这里插入图片描述
  主要监控下面数据:
  1、CPU:CPU 总使用率、iowait 使用率
  2、内存:剩余内存、可用内存、JVM 内存(仅 Java)
  3、磁盘:磁盘读写速度、磁盘 IO
  4、网络:网络上行和下行速度、网络使用率
  5、TCP:系统的 TCP 连接总数、TCP 重传数,端口的 TCP 数量、time-wait 数量、close-wait 数量

  查看监控结果时,默认展示指定项目组和机房下的所有服务器资源的平均值,左侧展示的是服务器列表,排列顺序按照 CPU、IO、网络使用率权重(5:3:2)排序,颜色也按照这个权重计算展示。点击某个服务器,即可查看该服务器的资源监控数据。页面所有数据每隔 10s 刷新一次。

Nginx 流量采集工具

  该工具主要用于解析 Nginx 的 access.log,从日志中提取出接口访问数据。
  首页页面展示的信息是根据接口聚合后的结果(过滤掉静态文件的请求),默认按照 QPS 排序,可选按响应时间、响应体大小、响应错误数量排序;可分别查看压测流量和正常流量。
在这里插入图片描述
  点击每个接口,可查看该接口的每秒数据变化图
在这里插入图片描述
  注意:为了采集到上述数据,需要修改 nginx 日志格式,详见nginx-agent 部署。

性能测试工具

  现在开源的、最好用的性能测试工具是 JMeter,很多公司的性能测试平台的底层都用的是 JMeter,所以本工具底层也是用 JMeter 实现的,而且原滋原味的保留了 JMeter 的所有功能,让您像在本地使用 JMeter 一样的丝般顺滑,使用体验远超某电商的全链路压测平台。

  该工具具有以下功能:
  1、在页面可以编辑 JMeter 脚本,也可以导入已有 JMeter 脚本;
  2、支持根据压测情况随时调整 TPS,可调整总的 TPS,也可以调整每个施压机的 TPS;
  3、支持分布式压测,可以动态增加/减少施压机,实现施压机热挂载;
  4、支持自动执行压测;
  5、强大的赋能能力,该工具具有的功能几乎可以用于所有的 JMeter 脚本;
  6、原滋原味的保留了 JMeter 的所有功能,只要本地能运行的脚本,用该工具都可以运行,因此也支持 JMeter 所有的扩展插件;

  先说一下使用 JMeter 做 HTTP 接口性能测试的基本流程:
  1、创建 jmx 文件,编写压测脚本。压测脚本的结构是:测试计划(Test Plan)—>线程组(Thread Group)—>控制器(Controller)—>取样器(HTTP Sample)。另外还有一些辅助的组件例如:CSV 数据文件设置、吞吐量控制器、Http Cookie 管理器等。
  2、确定并发数,设置压测执行时间;
  3、执行压测;
  4、查看压测结果;

  以上,所以该工具的作用就是把上述步骤流程化、便捷化、自动化。

具体使用

在页面新增 JMeter 脚本

添加 Test Plan

  在左侧点击 Test Plan,可以查看测试计划,测试计划列表如下:
在这里插入图片描述
  Server Room 列可以查看该机房里空闲的施压机数量;
  Action 列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应 JMeter 右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个测试计划;
  3、Variables:设置全局变量,对应 JMeter 中的测试计划中的 “用户自定义的变量”;
  4、ThreadGroup:查看测试计划中的所有线程组;
  5、StartTest:开始执行性能测试。如果是手动执行,则会立即开始压测;如果是自动执行,也会生成一个压测任务,等待压测时间开始执行;

  点击 Variables,可以设置全局变量,如下:
在这里插入图片描述
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
在这里插入图片描述

  • tearDown:对应 JMeter 中的 Test Plan 中的设置 “主线程结束后运行 tearDown 线程组”;
  • Serialize:对应 JMeter 中的 Test Plan 中的设置 “独立运行每个线程组(例如在一个组运行结束后启动下一个)”;
  • runType:指定压测脚本运行类型,可选指定线程数运行和指定 TPS 运行;
  • Target TPS/Thread Num:当运行类型为指定 TPS 运行时,这里就是目标 TPS;当运行类型为指定线程数运行时,这里就是线程数;
  • Duration:压测执行时间,单位:秒;对应 JMeter 中的 Thread Group 中的设置 “持续时间(秒)”;
  • Schedule:压测执行方式,可选手动执行或自动执行。当选择自动执行时,需要设置自动执行的时间;
  • Time Setting:用于设置自动执行时间,仅当 Schedule 设置为自动执行时生效。设置时间后,可以点击 Preview 预览压力变化曲线;
  • Server Room:机房,指的是施压机所在的机房,压测脚本会在设置的机房的施压机上运行 (一般性能测试尽可能避免跨机房,减少网络对性能测试的影响)。压测时,该机房必须有可用的 (空闲的) 施压机;
  • Server Number:施压机数,执行压测时,设置的机房里必须有足够数量的空闲的施压机;
  • isDebug:如果设置 Debug 模式,则脚本在执行时候会生成 jtl 文件,该文件包含每一个请求的结果,正式测试时,建议设置非 Debug 模式,以免影响施压机性能;
添加 Thread Group

  在左侧点击 Thread Group,可以查看所有的线程组;如果在 Test Plan 中点击 ThreadGroup,可以查看该测试计划下的所有线程组。线程组列表如下:
在这里插入图片描述
  Action 列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应 JMeter 右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个线程组;
  3、Cookies:如果压测需要 cookies,可以在这里设置;对应的是 JMeter 中的 Http Cookie 管理器;
  4、Controller:查看线程组中的所有控制器;

  Cookies 设置页面如下:
在这里插入图片描述
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
在这里插入图片描述

  • Plan ID:将该线程组绑定到指定的测试计划;
  • Ramp Time:在这个时间内启动所有的线程,对应 JMeter 线程组中的 “Ramp-Up 时间(秒)”;
  • CSVDataSet:上传压测需要的文件,需要设置变量名称(英文逗号分割)、分隔符、遇到文件结束符是否继续、线程共享模式,这里的设置和 JMeter 中的 CSV 数据文件设置一样;
添加控制器

  在左侧点击 Controller,可以查看所有的控制器;如果在 Thread Group 中点击 Controller,可以查看该线程组下的所有控制器。控制器列表如下:
在这里插入图片描述
  Action 列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应 JMeter 右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个控制器;
  3、HTTPSample:查看控制器中的所有取样器;

添加取样器

  在左侧点击 HTTP Sample,可以查看所有的取样器;如果在 Controller 中点击 HttpSample,可以查看该控制器下的所有取样器。取样器列表如下:
在这里插入图片描述
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
在这里插入图片描述

  • Controller ID:把该取样器绑定到指定的控制器;
  • Protocol:协议,可选 HTTP 或 HTTPs;
  • Domain Name:域名或 ip;
  • Port:端口号;
  • Path:url 路径;
  • Method:http 请求方法;
  • Arguments:http 请求参数,可选请求参数格式为 json 或 form 表单,对应 JMeter 中的取样器的参数设置;
  • HTTP Header:下拉选择对应的请求头,请求头配置在 HTTP Header 中;如果没有请求头,需要提前设置好;
  • Assertion:断言,可选类型为 Contain(包含)、Equal(相等) 或 Match(匹配),对应 JMeter 中的响应断言;
  • Post Extractor:后置处理器,用于提取响应值中的数据,仅支持 JSON 提取器和正则表达式提取器;
  • contentEncoding:内容编码格式,可选 None 或 UTF-8,对应 JMeter 中的取样器中的 “内容编码”;

  以上设置和在 JMeter 中的取样器中设置一样,也可以引用变量,后置处理器也可以设置变量。

添加请求头

  在左侧点击 HTTP Header,可以查看所有的请求头;
在这里插入图片描述
  在设置请求头时,只需要把字段和值填入即可,这里也可以引用变量,引用格式和 JMeter 一样。
在这里插入图片描述
  以上,就完成了在这个工具上手动编写压测脚本。如果已有本地的已经调试好的 JMeter 脚本,且是按照上面说的结构,可以在 Test Plan 页面直接点击 Import Plan 按钮导入进系统中。导入后会对文件进行解析,可能会有少许修改,可以在页面手动核对和修改。

Upload JMeter

  考虑到有些性能测试场景的压测脚本很复杂,例如有 BeanShell 脚本、for/if 等控制语句,但仍想使用压测工具赋予的压测能力,可以把本地调试通过的 JMeter 脚本,连同需要使用的外部文件,打包成 zip 压缩包,然后在 Upload JMeter 页面上传该压缩包,上传成功后就可以使用工具赋予的压测能力了。

  这里说一下这个工具对上传的压缩包是怎么处理的:
  1、压缩包上传后,首先使用 zip 命令解压,故只支持 zip 格式压缩;
  2、解压后,直接在解压的文件夹中寻找 jmx 格式的 JMeter 脚本,压缩包里必须有且仅有一个 jmx 格式的文件;由于是直接在解压的文件中寻找 jmx 文件,故压缩文件时,选择需要压缩的文件,然后压缩,而不是选择文件夹进行压缩;
  3、经过一系列校验后,压缩包会被上传到文件系统;
  4、生成一条记录,然后可以在页面修改压测参数,和 Test Plan 一样,如下:
在这里插入图片描述
  当需要压测的时候,会对 JMeter 文件进行修改,如下:
  1、从文件系统中下载文件,并解压;
  2、如果运行类型设置为指定 TPS 运行,则会往 JMeter 脚本中添加一个吞吐量控制器;如果运行类型设置为指定线程数运行,则会修改 JMeter 脚本中的 Thread Group 的参数;
  3、把修改后的 jmx 文件和其他依赖的文件一起打包,然后开始压测;

Test Task

  在左侧点击 Test Task 可以查看所有的测试任务,所有待执行、执行中、已停止的测试记录都会显示在这里,只有测试完成后,才会显示 Sample、TPS、RT、Error 等数据。
在这里插入图片描述
  在 Actions 列,可以下载每个任务执行的 JMeter 文件,如果压测出现问题,可以下载文件看看是哪里出现问题了。

查看压测详情

  在压测执行时或压测结束后,可以查看压测详情。
  当开始执行压测后,首先会生成压测所需要的文件,然后传给施压机,施压机会执行压测文件。此时页面会自动跳转到查看压测详情页面,由于压测初始化和产生压测结果需要时间,故需要等待一会儿才会在页面看到数据。
在这里插入图片描述
在压测详情页面可以的操作(页面右上角):

  • Stop:会立即停止压测;
  • Change TPS:统一调整所有施压机的 TPS;
  • Download File:下载该任务执行的 JMeter 文件;

每个施压机可以的操作:

  • View:查看单个施压机的压测数据;
  • Start:启动该施压机开始压测,施压机启动需要一点时间,当启动后,就可以调整该施压机的 TPS;
  • Stop:停止该施压机的压测,其他施压机不停;
  • Download logs:下载该施压机的 JMeter 执行的日志;
  • Change TPS:调整单个施压机的 TPS;
分布式压测

  借用 Redis 实现分布式压测时各施压机之间的数据同步,各施压机的数据和所有施压机汇总数据的时间全部以 InfluxDB 的时间为准;这就突破了使用 JMeter 进行分布式压测时需要各施压机的系统时间、Java 版本、JMeter 版本必须一样的限制,可以更加方便进行分布式压测。



欢迎大家使用,如有问题,请在 GitHub 提出 ~


写在最后:
  由于本人只有一台服务器,未进行大规模集群验证和大规模分布式、全链路压测验证,仅验证集群功能和分布式压测功能。如使用时出现问题,欢迎在 GitHub 提出,欢迎指教 ~

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

部署步骤一点多,容器化一下吧,不然部署环节很容劝退

有点意思,我也做性能测试工具,借鉴借鉴

花菜 回复

主要是想面对有一点点基础的人,他们可以定制化修改,如果有小问题,自己也可以改。其实整个部署很简单,基本上就是无脑复制粘贴命令就可以了。

回复

欢迎,可以相互学习学习

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册