ES性能压测工具esrally —— 筑梦之路

之前简单地写了下,elasticsearch性能压测工具esrally —— 筑梦之路_esrally下载-CSDN博客

为什么要压测?

  1. 了解ES各版本性能差异:ES版本更新很快,每次版本更新都会带来性能提升,但只有当我们进过性能测试后,才能清楚的知道性能提升幅度,再决定是否需要升级。

  2. 针对ES参数做验证测试:我们都知道调整索引分片、副本数、刷新时间等参数可以提高读写性能,但具体需要设置为多少,可以通过压测有更直观的对比。

  3. 了解集群性能瓶颈:只有针对ES集群做压测,才能清楚的知道集群读写性能峰值多少,性能瓶颈在磁盘还是网络带宽,通过找出并解决性能瓶颈,可以提高集群的性能和可靠性,提升用户体验。

  4. 集群容量规划:压测可以帮助我们规划系统的容量和资源需求,包括服务器配置、网络带宽、存储容量等。通过了解系统在不同负载下的资源消耗情况,可以合理规划资源投入,避免资源不足或浪费

怎么进行压测?

  1. 使用官方工具esrally:elastic官方提供了压测工具,内置多种数据集可模拟各个应用场景下的需求。模拟真实的生产环境中的负载,包括索引、搜索、聚合等操作,以便评估 Elasticsearch 在不同负载下的性能表现。支持测试不同版本的 Elasticsearch,用户可以轻松地比较不同版本之间的性能差异。生成详细的测试报告,包括测试结果、性能指标、图表等,帮助用户全面了解测试的结果。

  2. 使用http压测工具:可以通过http协议的压测工具比如JMeter、httpload等,通过请求es的 Restful API接口进行性能测试。

  3. 开发程序使用客户端请求测试:es支持多个语言的sdk包,可以针对特定使用场景开发程序进行性能测试。

什么是压测?

压测,即压力测试,是指对计算机系统、软件应用或网络服务等进行负载测试,以模拟实际使用场景中的高负载情况,检验系统在压力下的性能、稳定性和可靠性。压测旨在确定系统在正常或极端负载下的性能极限,以便在生产环境中提供最佳的性能和可靠性。 

esrally优点 

  1. 模拟真实场景:Rally 可以模拟真实的生产环境中的负载,包括索引、搜索、聚合等操作,以便评估 Elasticsearch 在不同负载下的性能表现。

  2. 多种负载类型:Rally 提供了多种预置的负载类型,如Index、Search、Bulk、Update等,用户可以根据需求选择合适的负载类型进行测试。

  3. 灵活的配置:Rally 允许用户对测试进行灵活的配置,包括索引设置、数据量、并发度等参数。用户可以根据自己的需求定制测试方案。

  4. 自动化测试:Rally 支持自动化测试流程,可以通过简单的命令行操作启动测试,并自动收集性能数据、生成报告等。

  5. 多版本支持:Rally 支持测试不同版本的 Elasticsearch,用户可以轻松地比较不同版本之间的性能差异。

  6. 丰富的报告:Rally 生成详细的测试报告,包括测试结果、性能指标、图表等,帮助用户全面了解测试的结果。

  7. 可扩展性:Rally 具有良好的可扩展性,用户可以编写自定义的测试插件,以满足特定的测试需求。

  8. 社区支持:Rally 是一个开源项目,拥有活跃的社区支持,用户可以在 GitHub 上提交问题、提出建议,并参与到项目的开发和改进中来。

参考资料:

仓库地址:https://github.com/elastic/rally

官方文档:https://esrally.readthedocs.io/en/latest/quickstart.html

前提条件

Python3.8+

git 1.9+

jdk 1.8+

这里使用操作系统rockylinux 9.4

安装搭建

# 安装软件

dnf -y install python3.11 python3.11-devel python3.11-pip git java-17-openjdk pbzip2

# 查看验证

java -version

python3.11 -V

# 配置java的环境变量

cat >> /etc/profile <<EOF
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.10.0.7-2.el9.x86_64
export JRE_HOME=$JAVA_HOME/jre
PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF

source /etc/profile

# 安装esrally

pip3.11 install esrally -i https://pypi.tuna.tsinghua.edu.cn/simple

esrally --version

# 查看esrally测试数据集

esrally list tracks

esrally为我们内置了多种使用场景下的测试数据集,我们只需要按实际使用场景选择其中一种数据集进行测试即可。 

使用esrally

在线快速测试

esrally可以在没有ES实列的情况下,去基于某一个指定版本的ES进行性能测试。

它的工作流程是:esrally会先去elastic官网下载对应的版本存在esrally目录里。下载完ES版本后,再去下载针对ES产品的性能测试数据。数据下载到本地后,再进行性能分析,最后将结果打印到控制台。

我们以目前最新的8.12.2版本为例,指定数据集为geopoint,测试类型为高速追加与并发索引操作场景下性能测试。

useradd esrally

su - esrally

esrally race --distribution-version=8.12.2 --track=geopoint --challenge=append-fast-with-conflicts

测试结果略

重点关注的指标如下:

Median cumulative indexing time across primary shards主分片中索引文档所花费的最小、最大和中位数时间。
Cumulative merge time of primary shards主分片合并时间总和:主分片在测试期间进行合并操作所花费的总时间。
Median Throughput中位数吞吐量:在测试期间,每秒处理的中位数请求量。
Max Throughput最大值吞吐量:在测试期间,每秒处理的最大值请求量。
99th percentile latency99th百分位数延迟:在所有的请求中,有99%的请求的响应时间都小于或等于该值,只有1%的请求的响应时间超过该值
99th percentile service time99th百分位数服务时间:有99%的请求的服务时间(即服务器实际处理请求的时间)都小于或等于该值,只有1%的请求的服务时间超过该值。这个指标更专注于服务器处理请求的实际时间,包括请求在服务器端的处理、查询执行、文档检索等

离线外部集群性能测试

 在线测试便于我们快速了解指定版本的ES性能参数,但实际使用过程中,我们通常都是离线下载测试数据集,然后指定已有的ES集群进行性能测试。

# 下载脚本

curl -O https://raw.githubusercontent.com/elastic/rally-tracks/master/download.sh

# 授权脚本

chmod u+x download.sh

# 下载指定的数据集

./download.sh geonames

tar -xf rally-track-data-geonames.tar

# 拉取镜像

docker pull elastic/rally:2.10.0

需要注意的是rally默认设置了默认number_of_shards和number_of_replicas参数,我们可以删除相关配置,然后通过索引模板灵活设置索引参数。

cd /root/.rally/benchmarks/tracks/default/geonames

vim index.json

# 删除如下两行设置
"index.number_of_shards": {{number_of_shards | default(5)}},
"index.number_of_replicas": {{number_of_replicas | default(0)}},

 接下来设置索引模板,针对写入性能进行参数优化

写入的目标在于增大写入的吞吐量

客户端

  • 通过压测确定每次写入的文档数量。一般情况:单个bulk请求数据两不要太大,官方建议5-15mb写入请求超时时间建议60s以上写入尽量不要一直写入同一节点,轮询达到不同节点。
  • 进行多线程写入,最好的情况时动态调整,如果http429,此时可以少写入点,不是可以多写点
  • 写入数据不指定_id,让ES自动产生当用户显示指定id写入数据时,ES会先发起查询来确定index中是否已经有相同id的doc存在,若有则先删除原有doc再写入新doc。这样每次写入时,ES都会耗费一定的资源做查询。如果用户写入数据时不指定doc,ES则通过内部算法产生一个随机的id,并且保证id的唯一性,这样就可以跳过前面查询id的步骤,提高写入效率。

server

总体目标尽可能压榨服务器资源,提高吞吐量

  • 使用好的硬件,观察cpu、ioblock、内存是否有瓶颈。
  • 观察jvm堆栈,垃圾回收情况是否存在耗时较长的gc。
  • 观察写入的分配和节点是否负载均衡。
  • 调整bulk线程池和队列的大小,一般不用调整,它是根据现有核数和内存自动算出来的,酌情调整。一般线程数配置为CPU核心数+1,队列也不要太大,否则gc比较频繁。
  • 可靠性要求不高,可以副本设置为0。
  • 磁盘io肯定没有内存快,可以在允许的情况refresh调整间隔大一点。
  • flush阈值适当调大、落盘异步化、flush频率调高。这些都能减少写入资源的占用,提升写入吞吐能力。但是对容灾能力有损害。
  • 索引设置优化。
  • 减少不必要的分词,从而降低cpu和磁盘的开销。
  • 只需要聚合不需要搜索,index设置成false不需要算分,可以将norms设置成false
  • 不要对字符串使用默认的dynmic mapping。会自动分词产生不必要的开销。
  • index_options控制在创建倒排索引时,哪些内容会被条件到倒排索引中,只添加有用的,这样能很大减少cpu的开销。
  • 关闭_source,减少io操作。但是source字段用来存储文档的原始信息,如果我们以后可能reindex,那就必须要有这个字段。
  • 设置30s refresh,降低lucene生成频次,资源占用降低提升写入性能,但是损耗实时性。
  • total_shards_per_node控制分片集中到某一节点,避免热点问题。
  • translong落盘异步化,提升性能,损耗灾备能力。
  • dynamic设置false,避免生成多余的分词字段,需要自行确定映射。
  • merge并发控制。

merge

  • ES的一个index由多个shard组成,而一个shard其实就是一个Lucene的index,它又由多个segment组成,且Lucene会不断地把一些小的segment合并成一个大的segment,这个过程被称为merge。我们可以通过调整并发度来减少这一步占用的资源操作。
  • index.merge.scheduler.max_thread_count

    优化示例:

  • PUT myindex 
    {
        "settings": {
            "index" :{
                "refresh_interval" : "30s",
                "number_of_shards" :"2"
            },
            "routing": {
                "allocation": {
                    "total_shards_per_node" :"3"
                }
            },
            "translog" :{
                "sync_interval" : "30s",
                "durability" : "async"
            },
            number_of_replicas" : 0
        }
        "mappings": {
            "dynamic" : false,
            "properties" :{}
        }
    }
PUT _template/geonames
{
  "index_patterns": [
    "geonames*"
  ],
  "order": 100,
  "settings": {
    "refresh_interval": "30s",
    "number_of_shards": "3",
    "translog": {
      "sync_interval": "30s",
      "durability": "async"
    },
    "number_of_replicas": "1"
  }
}

启动容器,指定es集群的ip地址,并传入账号密码和跳过证书验证参数,将结果以csv格式输出并导出到文件中。

useradd -u 1000 rally

chown -R rally:rally /root/.rally

docker run -v /root/.rally:/rally/.rally elastic/rally:2.10.0 race \
--offline --track-path=/rally/.rally/benchmarks/tracks/default/geonames \
--pipeline=benchmark-only \
--target-hosts="https://192.168.100.150:9200" \
--client-options="use_ssl:true,verify_certs:false,basic_auth_user:'elastic',basic_auth_password:'NAtPtHVns1LcO4NUTg41'" \
--report-format=csv \
--report-file=/rally/result.csv

参考资料

离线数据下载

https://esrally.readthedocs.io/en/latest/offline.html

命令行参数https://esrally.readthedocs.io/en/latest/command_line_reference.html?highlight=--client-options#command-line-flags

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值