在 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 到数据目录:
1 2 3 |
benchmarks/tracks/default/geonames |
我们在 track.json的基础上进行修改,让他支持循环入库,将track.json拷贝一份,命名为 loop.json,先通过下图直观地看一下新增内容,标红的为新增或修改项:
在第一行,通过 index_count 设置循环次数,这里设置为2次,其他位置都是关于 indices 和 documents 循环的定义,以后要调整次数只需修改首行的index_count即可,下面是 loop.json 的完整内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
{% set index_count = 2 %} {% import "rally.helpers" as rally with context %} { "version": 2, "description": "POIs from Geonames loop", "indices": [ {% set comma = joiner() %} {% for item in range(index_count) %} {{ comma() }} { "name": "geonames-{{item}}", "body": "index.json", "auto-managed": false } {% endfor %} ], "corpora": [ { "name": "geonames", "base-url": "http://benchmarks.elasticsearch.org.s3.amazonaws.com/corpora/geonames", "documents": [ {% set comma = joiner() %} {% for item in range(index_count) %} {{ comma() }} { "target-index": "geonames-{{item}}", "source-file": "documents-2.json.bz2", "document-count": 11396505, "compressed-bytes": 264698741, "uncompressed-bytes": 3547614383 } {% endfor %} ] } ], "operations": [ {{ rally.collect(parts="operations/*.json") }} ], "challenges": [ {{ rally.collect(parts="challenges/*.json") }} ] } |
执行压测
loop.json 编写好后,放到 track.json 同级目录,然后执行压测命令:
1 2 3 |
esrally --pipeline=benchmark-only --target-hosts=x.x.x.x:9200 --user-tag="demo:mycluster" --track-path=/esrally/benchmarks/tracks/default/geonames/loop.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 ,请勿用于任何商业用途)
One thought on “在 esrally 中使用少量数据进行循环压测”
求问这个for语句类似jsp是什么语言?