压测工具esrally实践和思考(未完待续)
esrally elasticsearch专用压测工具
什么是压力测试
首先引用一段网络上关于压力测试的说明
压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患.
我不是专业的测试人员,以下只是简单的分享下自己对压力测试的理解:
首先,通常上线的应用中会面临着来自各种用户(包括恶意与非恶意)的请求,服务接口时刻可能经受非常密集频繁的访问请求,压力测试就是用来模拟在这种情况下应用的响应速度以及程序存活情况等等;其次,也为了做扩容(申请服务器)做充足的数据依据。
什么是esrally
在搜索组中面对最多的就是索引集群,即elasticsearch集群。在对接口部分程序做压力测试的同时,同时也需要关心集群的情况,比如在做参数调优过后的索引速度,吞吐量,服务器的IO和内存消耗情况,总结下来就是保证稳定并高速的提供索引数据和查询数据的功能。
esrally 是 elastic 官方开源的一款基于 python3 实现的针对 es 的压测工具,源码地址为点我跳转.esrally的功能如下
- 自动创建、压测和销毁 es 集群
- 可分 es 版本管理压测数据和方案
- 完善的压测数据展示,支持不同压测之间的数据对比分析,也可以将数据存储到指定的es中进行二次分析
- 支持收集 JVM 详细信息,比如内存、GC等数据来定位性能问题
通俗的看,esrally是一套专门针对于elasticsearch各个版本进行非常完整详细的一键式测试套件,它可以提供从源码打包下载,自动提供测试数据,灵活定义测试环节等各种一键式服务。完全省去了这部分测试开发的工作。
安装环境部署
esrally 对于软件环境的要求如下:
- Python 3.4+ 和 pip3
- JDK 8
- git 1.9+
准备好上述环境后可以很简单的通过pip3来安装esrally。执行pip3 install esrally
静等几分钟就可以完成安装,输入esrally -h
或者esrally --version
来判断是否已经安装完成。如果在命令中没有显示请修改path变量等。esrally并不需要本地或者网络中已经存在elasticsearch集群,它甚至可以自己去github上下载源代码后本地编译安装然后测试。
术语概念
rally 是汽车拉力赛的意思,也就是说 esrally 是将压测比作了汽车拉力赛,因此其中的很多术语都是从汽车拉力赛中借鉴来的
track
track 是赛道的意思,在这里是指压测用的数据和测试策略。track就好像过去在玩极品飞车游戏时,你可以选择的车的种类以及地图赛道一般,track提供了多种多样的测试数据比如http_logs的测试数据供你秀选择。比如选择geonames这个track(路径.rally/benchmarks/tracks/default/geonames)在目录下我们可以看到一个track.json文件,这个文件定义了整个测试过程要使用的数据类型和测试策略。track.json文件中有几个关键的参数。
- indices: 指定该track可以操作的索引,包括创建、更新、删除等操作。
- name:要操作的索引名称,可以起一个新的名称就会重新创建索引
- body:要做为测试数据的json文件,比如geonames目录下的index.json文件
- types:顾名思义是指定的type名称
- operations: 指定具体的操作,比如 index 索引数据的操作、force-merge 强制合并segment的操作、search 搜索的操作等等。
- challenges: 通过组合 operations 定义一系列 task ,再组合成一个压测的流程,请参照下方的 例子。就是从operation中选择操作做为组合。
car
car 是赛车的意思,这里是指不同配置的 es 实例。通过下面的命令可以查看 esrally 当前可用的 car。其实这里的car意思是脚本中为我们配置的不同配置的es实例,当你选择哪个car后他会为你下载下来再配置。大部分情况下我们是测试本地集群,所以这个参数其实不太有用。
race
race 是一次比赛的意思,这里是指某一次压测。要比赛,就要有赛道和赛车,如果不指定赛车,就用 default 配置,如果不指定赛道,则默认使用 geonames track。
tournament
tournament 是锦标赛的意思,是由多个 race 组成的。通过下面的命令可以查看所有的 race。
pipeline
Pipeline 在这里是指压测的一个流程。
- from-sources-complete 是从源代码编译 es 后再运行,可以通过 --revision 参数指明要编译的commit hash ,这样就可以针对某一个提交版本就行测试了。
- from-sources-skip-build 如果已经编译好了,使用该 pipeline,可以跳过编译的流程,节省测试时间
- from-distribution 通过 --distribution-version 指定 es 版本,esrally 会从官网直接下载该版本的可执行文件,然后进行测试。
- benchmark-only 此 pipeline 将 es 集群的管理交由用户来处理, esrally 只做压测。如果你想针对已有集群进行测试,那么要将pipeline设定为该模式。
一般我们会选择最后一项
实际操作命令
以下是一次实际操作压测的例子
- esrally configure 配置测试程序的基本信息,包括JAVA_HOME等,大部分情况下它会自动获取
- esrally race --pipeline=benchmark-only --target-hosts=127.0.0.1:9200 --track=nyc_taxis --challenge=append-no-conflicts 这个命令用来完整的做完一次压力测试,pipeline指定压测的模式是测试自己搭建的集群 target-host指定集群端口,track指定本次要用nyc_taxis数据集做测试,challenge指定使用append-no-conflicts策略
- esrally list tracks | races | cas | pipelines…… 显示可用的tracks | races | cars等等
以下是一些常用参数的释义,更多信息请参考文档点我跳转
- --advanced-config 使用自定义的配置文件,更灵活的修改参数,配置文件位置~/.rally/rally.ini
- --runtime-java-home 指定运行时jdk
- --track 指定本次要运行的数据集,数据集可以自己做也可以使用已经提供好的
- --offline 指定本次压力测试离线运行
- --pipeline 指定本次压力测试过程是从源码到打包还是使用已经运行的集群等
- --track 指定使用哪一批的数据集
- --car 指定测试哪一个版本的集群,但其实大部分时间都不用指定,因为都是测自己的集群
- --challenge 指定本次压力测试的策略和流程
- --cluster_health 默认elasticsearch集群处于绿色状态才能进行压力测试,指定它的等级可以在其他状态也可以压力测试
- --test-mode 加上这个参数可以只取1000条数据进行测试,正常情况下跑完整个测试流程时间以小时计
解读测试报告的结果
一般要关注的数据有:
- throughput 每个操作的吞吐量,比如 index、search等
- latency 每个操作的响应时长数据
- Heap used for x 记录堆栈的使用情况
可以观察到的是整个测试结果包括一些索引创建以及合并的基本信息比如Indexing time Merge time,以及整个过程中JVM的GC情况比如Total Young Gen gc,Total Old Gen GC来判断整个过程中JVM的gc情况。
另外的在operation列中有值的行对应的是具体challenge中指定的操作中对应的结果,每个操作所给出的结果都是同一套指标。空白的数字指标是比较苍白无力,一般情况下很难直接看出问题所在,这时可以通过compare参数来和其他测试结果比较,发现自己集群中的问题。
自定义自己的测试数据集和操作
未完待续