在 esrally 中使用少量数据进行循环压测

在 esrally 中使用少量数据进行循环压测

在对集群进行压测的时候我们经常需要进行长时间的,不间断的测试,以观察其性能的波动情况。例如在测试写入速度时,由于 lucene 的 segment merge 对系统影响较大,而观察 merge 操作的触发需要较长的时间周期。但是为了长时间压入库,准备一个巨大的 json 源文件并不方便,在使用 ab 或 curl 等工具进行压测时我们可以使用一个较小的数据反复提交,esrally 也支持这种形式,下面我们就来看看这种“多次提交”在 esrally 中是个什么样的玩法。

原理

esrally 中有两种方式实现类似的需求。

方法1:
第一种最简单,就是把 challenge 中定义的operation全都重跑,一般情况下一个challenge会有多个 operation,如:

要实现循环重跑,只需要在命令行添加参数 --laps,例如:--laps=2,会把整个 challenge重复跑2遍,最终的测试报告也会输出2遍。

这种方法的缺点也显而易见,我们不希望入库过程产生一丁点的中断,影响测试效果,因此对于入库压测来说并不合适

方法2:
在 track的documents中定义多个 json 源文件和多个目标索引,每个 json 源文件写入到对应的索引中。此处支持循环语法,因此很方便地实现了将一个文件重复bulk 多次效果,最终输出一份唯一的测试报告。这种方式用起来复杂些,不小心就会报错,并且在不同的 es 版本中可能有些区别,下面我们以7.x 为例说明这种方式的用法。

定义 track

我们以官方的 geonames 这个tracks为例,演示一下在此基础上如何定义这种循环提交,先cd 到数据目录:

我们在 track.json的基础上进行修改,让他支持循环入库,将track.json拷贝一份,命名为 loop.json,先通过下图直观地看一下新增内容,标红的为新增或修改项:

在第一行,通过 index_count 设置循环次数,这里设置为2次,其他位置都是关于 indices 和 documents 循环的定义,以后要调整次数只需修改首行的index_count即可,下面是 loop.json 的完整内容。

执行压测

loop.json 编写好后,放到 track.json 同级目录,然后执行压测命令:

这次测试中 index_count 设置为2,因此测试运行完毕后产生以下两个索引,每个索引都是 documents-2.json.bz2的完整内容:

esrally 会从0开始顺序写入索引(先写完geonames-0,然后写geonames-1),现在可以把 index_count 改成1000,让他慢慢跑吧!

小插曲

定义 track的过程中遇到一些小问题,都是json配置错误导致,但 esrally 的报错并不精准,基本只能通过排除法去猜。例如下面的报错,是因为配置项 “index.translog.durability”: async 中的async没有添加引号

而下面的这种报错,是因为缺少 “target-index”: “geonames-{{item}}”, 这条配置,

类似的这种错误通过报错信息和日志都看不出来,只能使用的时候仔细一点。

参考

https://discuss.elastic.co/t/is-it-possible-to-create-a-loop-around-a-challenge/117892

https://discuss.elastic.co/t/increase-data-size-in-rally-existing-tracks/116514

(转载请注明作者和出处 easyice.cn ,请勿用于任何商业用途)

1 Star2 Stars3 Stars4 Stars5 Stars (欢迎评分)
Loading...

One thought on “在 esrally 中使用少量数据进行循环压测

发表评论

邮箱地址不会被公开。 必填项已用*标注