在我的java web应用程序从elasticsearch获取静态数据的35k耐久性负载测试期间,我开始遇到以下elasticsearch异常:
Caused by: org.elasticsearch.common.util.concurrent.EsRejectedExecutionException: rejected execution of org.elasticsearch.common.util.concurrent.TimedRunnable@1a25fe82 on QueueResizingEsThreadPoolExecutor[name = search4/search, queue capacity = 1000, min queue capacity = 1000, max queue capacity = 1000, frame size = 2000, targeted response rate = 1s, task execution EWMA = 10.7ms, adjustment amount = 50, org.elasticsearch.common.util.concurrent.QueueResizingEsThreadPoolExecutor@6312a0bb[Running, pool size = 25, active threads = 25, queued tasks = 1000, completed tasks = 34575035]]
elasticsearch详细信息:
elasticsearch 6.2.4版。
集群由5个节点组成。每个节点的jvm堆大小设置为 Xms16g
以及 Xmx16g
. 每个节点机有16个处理器。
注意:最初,当我第一次得到这个异常时,我决定增加 thread_pool.search.queue_size
中的参数 elasticsearch.yml
,设置为 10000
. 是的,我明白,我只是把问题推迟了。
elasticsearch索引详细信息:目前,大约有20个索引,其中只有6个正在使用。未使用的标记是在创建新标记后未删除的旧标记。索引本身非常小:
红色矩形中的索引是我的web应用程序使用的索引。它的shard和replicas设置分别是“number\u of \u shard”:“5”和“number\u of \u replicas”:“2”。是碎片细节:
在这篇文章中我发现
小碎片导致小片段,这增加了开销。目标是将平均碎片大小保持在至少几gb到几十gb之间。对于使用基于时间的数据的用例,通常可以看到大小在20gb到40gb之间的碎片。
从上面的截图可以看出,我的碎片大小比上面提到的要小得多。因此,问:在我的情况下,碎片的正确数量是多少?是1还是2?随着时间的推移,指数不会有太大的增长。
测试期间发出的es查询。负载测试模拟用户导航到页面以搜索某些产品的场景。用户可以使用相应的过滤器(例如名称、城市等)过滤产品。使用复合查询从es索引获取唯一的过滤器值。这是第一种查询类型。另一个查询用于从es获取产品。它包含must、must\u not、filter、has\u子查询,size属性等于100。
我设置了慢速搜索日志,但没有记录任何内容:
"index": {
"search": {
"slowlog": {
"level": "info",
"threshold": {
"fetch": {
"debug": "500ms",
"info": "500ms"
},
"query": {
"debug": "2s",
"info": "1s"
}
}
}
}
我觉得我错过了一些简单的东西,使它最终能够处理我的负荷。如果有人能帮我解决这个问题,我将不胜感激。
1条答案
按热度按时间p4rjhz4m1#
对于这样一个小的尺寸,你使用5个主要的碎片,我觉得,由于你的es版本6.x(默认值是5),你从来没有改变它,但简而言之,有大量的主要碎片为小索引,有严重的性能损失,请参阅非常类似的用例(我也有5个ps?),我在我的博客中谈到。
正如您已经提到的,您的索引大小在将来不会显著增长,我建议使用1个主碎片和4个副本碎片
1主碎片意味着对于单个搜索,elasticsearch中只会创建一个线程和一个请求,这将提供更好的资源利用率。
因为您有5个数据节点,所以有4个副本意味着碎片正确地分布在每个数据节点上,所以您的吞吐量和性能将是最佳的。
在这个更改之后,请测量性能,我确信在此之后,您可以再次将搜索队列大小减少到1k,因为您知道,拥有高队列大小只是延迟问题,而不是解决手头的问题。
来到你的搜索慢日志,我觉得你有很高的门槛,为查询阶段
1 seconds
对于面向用户的应用程序来说,一个查询的速度确实很高,请尝试将其降低到100ms左右,而不是降低这些查询的速度并进一步优化它们。