当前位置: 首页 > article >正文

Elasticsearch 性能测试工具 Loadgen 之 001——部署及应用详解

在现代软件开发中,性能测试是确保应用程序稳定性和响应速度的关键环节。

今天,我们就来深入了解一款国产化功能强大的 Elasticsearch 负载测试工具——INFINI Loadgen。

40a84b36b203cf27bcab9f53527d95d7.jpeg

一、INFINI Loadgen 简介

Github地址:https://github.com/infinilabs/loadgen

Release 版本下载地址:https://release.infinilabs.com/loadgen/stable/

INFINI Loadgen 是一款专为 Elasticsearch 、EasySearch 设计的轻量级性能测试工具,旨在对 Easysearch 、Elasticsearch 进行压力测试。其主要功能包括支持多种请求类型、动态变量注册、以及对请求返回结果的断言等。——官方描述

二、安装 INFINI Loadgen

INFINI Loadgen的安装方式非常简单,为用户提供了多种选择,方便不同需求的用户进行安装。

2.1 通过脚本安装

使用以下命令,即可一键完成安装:

curl -sSL http://get.infini.cloud | bash -s -- -p loadgen

这条命令的作用是,通过curl工具从指定的URL下载安装脚本,并使用bash执行该脚本,同时传递参数-p loadgen,指定安装的软件包为loadgen

2.2 手动下载安装

如果不想使用脚本安装,也可以从官方提供的下载地址获取安装包:http://release.infinilabs.com/loadgen/。下载完成后,通过以下命令进行安装:

➜  /tmp mkdir loadgen
➜  /tmp curl -sSL http://get.infini.cloud | bash -s -- -p loadgen -d /tmp/loadgen

或者直接本地下载,拷贝到云服务器也可以。上述命令首先在/tmp目录下创建了一个名为loadgen的文件夹,然后通过curlbash命令,将安装包下载并解压到该文件夹中。在安装过程中,我们可以看到有趣的字符画和安装进度提示,最后会提示安装完成,表明loadgen已经准备就绪,可以使用了。

安装完成后,进入安装目录,执行可执行文件,即可启动INFINI Loadgen:

cd /tmp/loadgen &&./loadgen-mac-arm64

这里的loadgen-mac-arm64是根据不同系统和架构生成的可执行文件名,在实际使用中,需要根据自己的环境进行调整。

f8713511f8169fff4f5d916b264b847a.png

温馨提示:下文中的 loadgen 本质上就是现在的 loadgen-mac-arm64 重命名后的结果。

7a8d0c7d57a10b7611564eb37f76ce41.png

三、Loadgen 核心配置参数解读

站在咱们开发者角度理解,如果对 Elasticsearch 或 EasySearch 做性能测试,必须先得配置上 ES 的地址、用户名和密码,否则一切无从谈起。因此,如下的配置 loadgen.yml 非常重要。

1f11041b7176b447551104374c9513a8.png

3.1 宏观看配置文件

我第一眼看有点懵逼,感觉配置都好复杂。实际拆分成树形结构“定睛一看”,实际并不复杂。

loadgen.yml

├── env
│   ├── ES_USERNAME
│   ├── ES_PASSWORD
│   └── ES_ENDPOINT
├── runner
│   ├── no_warm
│   ├── valid_status_codes_during_warmup
│   ├── log_requests
│   ├── log_status_codes
│   ├── assert_invalid
│   ├── assert_error
│   ├── reset_context
│   ├── default_endpoint
│   └── default_basic_auth
├── variables
│   ├── id
│   ├── id64
│   ├── uuid
│   ├── now_local
│   ├── now_utc
│   ├── now_utc_lite
│   ├── now_unix
│   ├── now_with_format
│   ├── suffix
│   ├── bool
│   ├── list
│   ├── id_list
│   └── str_list
└── requests
├── request 1 (POST /_bulk)
│   ├── method
│   ├── runtime_variables
│   ├── runtime_body_line_variables
│   ├── url
│   └── body
└── request 2 (POST /medcl/_search)
├── method
├── runtime_variables
├── runtime_body_line_variables
├── basic_auth
├── url
└── body

3.2 配置文件参数详解(微观看)

在使用Loadgen进行测试之前,我们需要了解其配置文件的结构和用法。Loadgen的配置文件主要由envrunnervariablesrequests等部分组成。

2ca9e3256004fdc72f3c76163903dc2c.png

示例原因,没有涵盖全部变量。

  1. env:用于定义环境变量, 例如:

env:
  ES_USERNAME: elastic
  ES_PASSWORD: elastic

这里定义了ES_USERNAMEES_PASSWORD两个环境变量,分别赋值为elastic。咱们在使用的时候要换成自己 Elasticsearch 集群的账号和密码。这些环境变量可以在后续的请求中通过$[[env.ENV_KEY]]的方式进行引用,例如在请求的认证信息中使用。

  1. runner:用于配置测试运行的相关参数,如:

runner:
  # total_rounds: 1
  no_warm: false
  log_requests: false
  assert_invalid: false
  assert_error: false

其中,

  • total_rounds用于指定测试的总轮数,默认情况下注释掉,表示不使用该设置,Loadgen将在指定的持续时间内循环执行测试。

  • no_warm表示是否跳过预热阶段,默认为false,即不跳过。预热阶段可以让系统在正式测试前达到稳定状态,使测试结果更准确。

  • log_requests用于控制是否记录每个请求的详细信息。

  • assert_invalidassert_error分别用于设置当断言无效或请求出错时的处理方式。

  1. variables:用于定义各种类型的变量,这些变量可以在请求中使用,为请求提供动态参数。Loadgen支持多种变量类型,每种类型都有其特定的用途和配置方式。

  • file:从文件加载变量,例如:

- name: ip
  type: file
  path: test/ip.txt

这个配置表示定义了一个名为ip的变量,类型为file,其值从test/ip.txt文件中读取。在测试过程中,每次使用该变量时,会随机从文件中读取一行作为变量值。- sequence:自动递增的数值变量,例如:

- name: id
  type: sequence

定义了一个名为id的变量,类型为sequence,它会在测试过程中自动递增,从默认的最小值开始,每次增加1。- uuid:生成UUID类型的变量,例如:

- name: uuid
  type: uuid

定义了一个名为uuid的变量,每次使用时会生成一个唯一的UUID值。- now_localnow_utcnow_unix:分别表示获取当前本地时间、UTC时间和Unix时间戳,例如:

- name: now_local
  type: now_local
- name: now_utc
  type: now_utc
- name: now_unix
  type: now_unix

这些变量在需要记录时间信息的测试场景中非常有用。4. requests:用于定义要发送的请求,这是配置文件的核心部分。Loadgen支持固定参数请求和基于模板的变量参数请求。- 固定参数请求示例

- request:
    method: GET
    basic_auth:
      username: elastic
      password: pass
    url: http://localhost:9200/medcl/_search

注意:medcl 是个索引名,实际使用环节,咱们需要自己创建一下。比如:put medcl 方式就可以创建。这个请求配置表示使用GET方法,通过基本认证(用户名elastic,密码pass),向http://localhost:9200/medcl/_search发送请求。- 基于变量参数的请求示例

- request:
    method: GET
    basic_auth:
      username: $[[env.ES_USERNAME]]
      password: $[[env.ES_PASSWORD]]
    url: http://localhost:9200/medcl/_search?q=name:$[[user]]

在这个请求中,使用了之前定义的环境变量ES_USERNAMEES_PASSWORD进行认证,并且在请求URL中使用了变量user,使得每次请求的查询参数name的值都可以动态变化。最后,咱们通过截图说明一下,我改动的配置有哪些,以便大家进行参考:

15cb8c83430ccc98d04ce90e9cd1af96.png

3728ac31b633d450e6f1485265a6430a.png

除了上面标红之外,其他配置都没有动。这样我们可以达到 Loadgen 从0到1效果,先用起来再说。

四、Loadgen 基准测试,先用起来再说!

4.1 基准测试

基准测试:运行Loadgen进行基准测试非常简单,只需在命令行中执行以下命令:

➜  loadgen git:(master) ✗./bin/loadgen -d 30 -c 100 -compress

这条命令中,-d 30表示测试持续时间为30秒,-c 100表示并发线程数为100,-compress表示对请求进行gzip压缩。测试过程中,Loadgen会先执行一次所有请求进行预热,预热结果会输出到终端。

预热完成后,开始正式的基准测试,测试结束后会输出详细的测试结果,包括请求的吞吐量、响应时间分布、流量统计等信息。

86006e314277e49fa4c760bf3a75964e.png

如下图所示,代表配置文件的写入 bulk 写入成功了。因为,最初,我们只是创建了索引名。

606ea000b50a856d5f7712f779bf2e9b.png

4.2 核心指标含义解读

最终指标是我们关注的重点,核心指标解读如下:

1.Requests/sec: 29.43:

  • 含义:表示服务器每秒处理的请求数量,即服务器在测试期间平均每秒能够成功接收并处理的请求数为  29.43 个 。

  • 作用:该指标反映了服务器的处理能力和吞吐量。数值越高,说明服务器在单位时间内能够处理更多的请求,在高并发场景下表现可能更好。

  • 实际业务场景类比举例:对于一个基于 Elasticsearch 的电商网站搜索服务,较高的请求处理速率意味着在促销活动等流量高峰时,能够更快地响应用户的商品搜索和查询请求,从而提升用户体验。

2.Avg Req Time: 339.804597 ms:

  • 含义:指平均每个请求的处理时间,即从服务器接收到请求到返回响应所花费的平均时间为 339.804597ms 毫秒 。

  • 作用:它体现了服务器处理单个请求的效率。这个时间越短,表明服务器处理请求的速度越快,用户等待响应的时间也就越短,体验更好。

  • 实际业务场景类比举例:在一个使用 Elasticsearch 的实时日志分析系统中,较短的平均请求处理时间意味着用户能够更快地获取日志查询结果,从而及时发现和解决问题,提升系统监控的有效性。

3.Transfer/sec: 12.81 KB:

  • 含义:代表服务器每秒的数据传输量,即在测试过程中,服务器每秒传输的数据量平均为 12.81KB 。

  • 作用:该指标反映了服务器与客户端之间的数据交互量,对于评估服务器的网络带宽使用情况和数据传输能力很重要。

  • 实际业务场景类比举例:对于一个基于 Elasticsearch 的数据可视化平台,高的数据传输速率是保证用户能够流畅加载和查看大数据集的关键。如果这个值过低,可能导致数据加载缓慢,从而影响用户体验。

五、小结

通过使用 INFINI Loadgen 进行性能测试,开发者可以有效地评估 Elasticsearch 和 EasySearch 的处理能力和稳定性。该工具不仅支持高并发的请求处理,还能通过灵活的配置选项满足不同的测试需求。安装过程简单,配置文件结构清晰,使得用户能够快速上手并进行基准测试。


【实践好文】提升 Elasticsearch 性能的关键优化技巧,50ms提升到1ms!!

提升 Elasticsearch 索引性能 TOP 10 小技巧,你用到几个?

esrally 如何进行简单的自定义性能测试?

JMeter 如何实现 Elasticsearch 8.X 性能测试?

探索 INFINI Console:提升 Elasticsearch 管理效率的新利器

读者留言:有 Elasticsearch 国产化替代品吗?现在国产化不让用 ES 了......

Elasticsearch 国产化替代方案之一 Easysearch 的介绍与部署指南

f69799f97e859f3871c87b5838178a42.png

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

9ea62954bb0f01b6b1b720b9abe44c10.gif

抢先一步学习进阶干货!


http://www.kler.cn/a/517904.html

相关文章:

  • tmp记录
  • 基于微信小程序的网上订餐管理系统
  • iOS 集成ffmpeg
  • 第20篇:Python 开发进阶:使用Django进行Web开发详解
  • WPS数据分析000006
  • 一文详解Filter类源码和应用
  • React进阶之高阶组件HOC、react hooks、自定义hooks
  • thingsBoard去除地图logo以及在ThingsBoard中实现 高德地图实时路线绘制,可实现车辆行驶状态监控
  • CPU 缓存基础知识
  • rust 自定义错误(十二)
  • 「全网最细 + 实战源码案例」设计模式——生成器模式
  • Pytest插件介绍:pytest-django
  • iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
  • 新型人工智能“黑帽”工具:GhostGPT带来的威胁与挑战
  • 深度学习中Batch Normalization(BN)原理、作用浅析
  • 食堂校园预约就餐小程序ssm+论文源码调试讲解
  • SpringAI 搭建智能体(二):搭建客服系统智能体
  • html新增Canvans
  • deep face cam 部署报错解决
  • 【游戏设计原理】81 - 功能可见性暗示
  • 量子编程语言:Qiskit 与 Cirq
  • OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?
  • Three城市引擎地图插件Geo-3d
  • tkinter防抖数字输入框
  • 深入解析Java集合框架:春招面试要点
  • wlan和vlan