--- title: "大量索引场景下 Easysearch 和 Elasticsearch 的吞吐量差异" date: 2023-11-20 lastmod: 2023-11-20 description: "通过测试对比发现,Easysearch 1.0 在相同条件下写入性能比 Elasticsearch 7.3.2 高出约 17%。测试中,Elasticsearch 存在大量权限验证相关线程占用问题,影响性能,而 Easysearch 启用安全验证不影响写入性能。建议升级 Elasticsearch 至 7.16+ 优化授权性能。" tags: ["Easysearch"] summary: "最近有客户在使用 Elasticsearch 搜索服务时发现集群有掉节点,并且有 master 收集节点信息超时的日志,节点的负载也很高,不只是 data 节点,master 和协调节点的 cpu 使用率都很高,看现象集群似乎遇到了性能瓶颈。 查看了 Hot_threads, 发现大量线程被权限验证相关的类和方法占用,主要在 RBACEngine 和 AuthorizationService 两个类。并且不止协调节点和数据节点,master 节点居然也有那么多权限验证的操作? 于是怀疑是不是对权限验证的使用方式不对,在 github 上搜了下,果然发现有人遇到和我们非常类似的场景。 Improve Authorization performance in clusters with a large number of indices #67987 提到有些个用户在达到数千或上万个索引的场景下,在启用安全验证进行写入数据时,服务端几乎会耗费掉所有 CPU 时间在 transport_worker 线程上进行权限验证,从而阻塞其他传入请求, 导致集群的吞吐量下降,下降的程度似乎是 2 倍到 3 倍。 有人建议升级到 7.16 或更高版本来解决这个问题。 为了确认下我们的产品是否有类似现象,我对两个服务进行了测试对比,由于硬件资源有限,只对单个节点进行了写入吞吐的压测。 测试条件: -Xms3g -Xmx3g 16 逻辑核 CPU 启用 security 验证 预先创建了 1000 个索引 每个索引 1 个 shard,3 个别名 采用相同的 loadgen 脚本进行压测, 压测命令:./loadgen-linux-amd64 -config loadgen-index_0." --- 最近有客户在使用 Elasticsearch 搜索服务时发现集群有掉节点,并且有 master 收集节点信息超时的日志,节点的负载也很高,不只是 data 节点,master 和协调节点的 cpu 使用率都很高,看现象集群似乎遇到了性能瓶颈。 查看了 Hot_threads, 发现大量线程被权限验证相关的类和方法占用,主要在 RBACEngine 和 AuthorizationService 两个类。并且不止协调节点和数据节点,master 节点居然也有那么多权限验证的操作? 于是怀疑是不是对权限验证的使用方式不对,在 github 上搜了下,果然发现有人遇到和我们非常类似的场景。 [Improve Authorization performance in clusters with a large number of indices #67987](https://github.com/elastic/elasticsearch/issues/67987) 提到有些个用户在达到数千或上万个索引的场景下,在启用安全验证进行写入数据时,服务端几乎会耗费掉所有 CPU 时间在 transport_worker 线程上进行权限验证,从而阻塞其他传入请求, 导致集群的吞吐量下降,下降的程度似乎是 2 倍到 3 倍。 有人建议升级到 7.16 或更高版本来解决这个问题。 为了确认下我们的产品是否有类似现象,我对两个服务进行了测试对比,由于硬件资源有限,只对单个节点进行了写入吞吐的压测。 测试条件: - -Xms3g -Xmx3g - 16 逻辑核 CPU - 启用 security 验证 - 预先创建了 1000 个索引 - 每个索引 1 个 shard,3 个别名 采用相同的 loadgen 脚本进行压测, 压测命令:./loadgen-linux-amd64 -config loadgen-index_0.yml -d 120 -c 10 即每秒 10 个并发请求,持续压测 120 秒,每个 bulk 请求包含写入 5000 个 doc,对单个索引进行压测。 Easysearch 1.0 写入了 6900000 条。 {{% load-img "/img/blog/2023/throughput-difference-between-easysearch-and-es/indexing_easysearch.png" "" %}} 对比搜索服务 7.3.2 写入了 5865000 条。 {{% load-img "/img/blog/2023/throughput-difference-between-easysearch-and-es/indexing_es732.png" "" %}} 压测完毕,显示 Easysearch 的吞吐大约高出了 17%。 测试时观察 Hot_threads,Easysearch 除了 lucene 的写入和 merge 线程,未发现权限验证相关热点线程,表明了启用安全验证不会对 Easysearch 的写入造成性能影响。