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


前情提要:
  网上搜了一下开源性能测试平台或全链路压测平台,只找到了一个stressTestSystem,其他的都是一些垃圾公司的广告。至于使用体验,stressTestSystem没用过,不好评价。本文开源的性能测试平台,在实现功能的前提下,极大地考虑到了使用体验,功能“强大”且部署及其简单。

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

具有的功能

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

第三方组件

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

部署架构图

性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第1张图片
  如需满足较多用户使用,请部署集群;如需高可用,请自行部署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

性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第2张图片
如需查看教程,可在部署成功后点击教程查看。

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,可以同时打开很多个页面,如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第3张图片
  为了提供更好的使用体验,该工具支持 Ctrl+C(复制)和 Ctrl+V(粘贴)快捷键,不仅如此,还仍然保留了 Ctrl+C 快捷键在 shell 中的终止前台进程的功能,而绝大部分主流 shell 工具是不支持这种功能的,老板再也不担心你敲命令慢了。

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

自动部署Agent

  点击 Deploy 会打开新的页面,这个页面可以上传部署包、自动部署和卸载。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第4张图片
  由于一些部署包区分Linux发行版本和CPU架构,故需要先准备好对应的部署包,然后上传到平台,通过该平台进行部署。如果部署包不区分Linux发行版本和CPU架构,上传部署包时可随意选择一种。
  该平台下面的所有agent都可以且只能通过该平台自动部署(当前只支持部署java、jmeter、 monitor-agent 、jmeter-agent 、nginx-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使用率过高,或者剩余内存过低时,可发送邮件提醒;可设置自动清理缓存

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

首页

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

可视化

  监控结果可视化,分项目组和机房查看,可选择任意时间段(监控数据保留时长在配置中设置)。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第5张图片
  主要监控下面数据:
  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排序,可选按响应时间、响应体大小、响应错误数量排序;可分别查看压测流量和正常流量。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第6张图片
  点击每个接口,可查看该接口的每秒数据变化图
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第7张图片
  注意:为了采集到上述数据,需要修改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,可以查看测试计划,测试计划列表如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第8张图片
  Server Room 列可以查看该机房里空闲的施压机数量;
  Action列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应JMeter右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个测试计划;
  3、Variables:设置全局变量,对应JMeter中的测试计划中的“用户自定义的变量”;
  4、ThreadGroup:查看测试计划中的所有线程组;
  5、StartTest:开始执行性能测试。如果是手动执行,则会立即开始压测;如果是自动执行,也会生成一个压测任务,等待压测时间开始执行;

  点击 Variables,可以设置全局变量,如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第9张图片
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第10张图片

  • 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,可以查看该测试计划下的所有线程组。线程组列表如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第11张图片
  Action列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应JMeter右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个线程组;
  3、Cookies:如果压测需要cookies,可以在这里设置;对应的是JMeter中的Http Cookie管理器;
  4、Controller:查看线程组中的所有控制器;

  Cookies 设置页面如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第12张图片
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第13张图片

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

  在左侧点击 Controller,可以查看所有的控制器;如果在 Thread Group 中点击 Controller,可以查看该线程组下的所有控制器。控制器列表如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第14张图片
  Action列具有的一些操作:
  1、Enabled/Disabled:禁用/启用,对应JMeter右键菜单里的禁用/启用;
  2、Copy:复制,快速复制一个控制器;
  3、HTTPSample:查看控制器中的所有取样器;

添加取样器

  在左侧点击 HTTP Sample,可以查看所有的取样器;如果在 Controller 中点击 HttpSample,可以查看该控制器下的所有取样器。取样器列表如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第15张图片
  点击添加或编辑,出现下面的页面:(如果不清楚每个字段的意思,可点击问号查看提示)
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第16张图片

  • 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,可以查看所有的请求头;
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第17张图片
  在设置请求头时,只需要把字段和值填入即可,这里也可以引用变量,引用格式和JMeter一样。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第18张图片
  以上,就完成了在这个工具上手动编写压测脚本。如果已有本地的已经调试好的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 一样,如下:
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第19张图片
  当需要压测的时候,会对JMeter文件进行修改,如下:
  1、从文件系统中下载文件,并解压;
  2、如果运行类型设置为指定TPS运行,则会往JMeter脚本中添加一个吞吐量控制器;如果运行类型设置为指定线程数运行,则会修改JMeter脚本中的 Thread Group 的参数;
  3、把修改后的jmx文件和其他依赖的文件一起打包,然后开始压测;

Test Task

  在左侧点击 Test Task 可以查看所有的测试任务,所有待执行、执行中、已停止的测试记录都会显示在这里,只有测试完成后,才会显示Sample、TPS、RT、Error等数据。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第20张图片
  在Actions列,可以下载每个任务执行的JMeter文件,如果压测出现问题,可以下载文件看看是哪里出现问题了。

查看压测详情

  在压测执行时或压测结束后,可以查看压测详情。
  当开始执行压测后,首先会生成压测所需要的文件,然后传给施压机,施压机会执行压测文件。此时页面会自动跳转到查看压测详情页面,由于压测初始化和产生压测结果需要时间,故需要等待一会儿才会在页面看到数据。
性能测试平台 - 集分布式压测、服务器资源监控、远程连接Linux于一体的平台_第21张图片
在压测详情页面可以的操作(页面右上角):

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

每个施压机可以的操作:

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

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

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

你可能感兴趣的:(python,压力测试,ssh,监控类,jmeter)