首页 > 解决方案 > 始终在最大搜索特定节点的 thread_pool

问题描述

我有一个有 6 个节点的弹性搜索集群。堆大小设置为 50GB。(我知道建议小于 32,但由于某种我不知道的原因,这已经设置为 50Gb)。现在我看到很多来自搜索线程池的拒绝。

这是我当前的搜索线程池:

node_name               name   active rejected  completed
1105-IDC.node          search      0 19295154 1741362188
1108-IDC.node          search      0  3362344 1660241184
1103-IDC.node          search     49 28763055 1695435484
1102-IDC.node          search      0  7715608 1734602881
1106-IDC.node          search      0 14484381 1840694326
1107-IDC.node          search     49 22470219 1641504395

我注意到的是两个节点总是有最大活动线程(1103-IDC.node & 1107-IDC.node)。即使其他节点也有拒绝,这些节点的拒绝率最高。硬件类似于其他节点。这可能是什么原因?可能是因为他们有任何特定的碎片,命中率更高吗?如果是,如何找到它们。?

此外,年轻堆在活动线程总是最大的节点上花费了超过 70 毫秒(有时大约 200 毫秒)。从 GC 日志中找到以下几行:

[2020-10-27T04:32:14.380+0000][53678][gc             ] GC(6768757) Pause Young (Allocation Failure) 27884M->26366M(51008M) 196.226ms
[2020-10-27T04:32:26.206+0000][53678][gc,start       ] GC(6768758) Pause Young (Allocation Failure)
[2020-10-27T04:32:26.313+0000][53678][gc             ] GC(6768758) Pause Young (Allocation Failure) 27897M->26444M(51008M) 107.850ms
[2020-10-27T04:32:35.466+0000][53678][gc,start       ] GC(6768759) Pause Young (Allocation Failure)
[2020-10-27T04:32:35.574+0000][53678][gc             ] GC(6768759) Pause Young (Allocation Failure) 27975M->26444M(51008M) 108.923ms
[2020-10-27T04:32:40.993+0000][53678][gc,start       ] GC(6768760) Pause Young (Allocation Failure)
[2020-10-27T04:32:41.077+0000][53678][gc             ] GC(6768760) Pause Young (Allocation Failure) 27975M->26427M(51008M) 84.411ms
[2020-10-27T04:32:45.132+0000][53678][gc,start       ] GC(6768761) Pause Young (Allocation Failure)
[2020-10-27T04:32:45.200+0000][53678][gc             ] GC(6768761) Pause Young (Allocation Failure) 27958M->26471M(51008M) 68.105ms
[2020-10-27T04:32:46.984+0000][53678][gc,start       ] GC(6768762) Pause Young (Allocation Failure)
[2020-10-27T04:32:47.046+0000][53678][gc             ] GC(6768762) Pause Young (Allocation Failure) 28001M->26497M(51008M) 62.678ms
[2020-10-27T04:32:56.641+0000][53678][gc,start       ] GC(6768763) Pause Young (Allocation Failure)
[2020-10-27T04:32:56.719+0000][53678][gc             ] GC(6768763) Pause Young (Allocation Failure) 28027M->26484M(51008M) 77.596ms
[2020-10-27T04:33:29.488+0000][53678][gc,start       ] GC(6768764) Pause Young (Allocation Failure)
[2020-10-27T04:33:29.740+0000][53678][gc             ] GC(6768764) Pause Young (Allocation Failure) 28015M->26516M(51008M) 251.447ms

标签: javaelasticsearchmemory-leaksgarbage-collection

解决方案


需要注意的重要一点是,如果您从elasticsearch 线程池 cat API获得这些统计信息,那么它仅显示时间点数据,而不显示过去 1 小时、6 小时、1 天、1 的历史数据像这样的一周。

并且拒绝和完成是节点上次重新启动的统计信息,因此当我们试图确定某些 ES 节点是否由于错误/不平衡的分片配置而成为热点时,这也不是很有帮助。

所以在这里我们有两个非常重要的事情要弄清楚

  1. 确保我们通过按时间范围查看数据节点上的平均活动、拒绝请求来了解集群中的实际热点节点(您可以只检查高峰时间)。
  2. 一旦知道热点节点,查看分配给它们的分片,并将其与其他节点分片进行比较,检查的几个指标是,分片数量,分片接收更多流量,分片接收最慢查询等,其中大部分你有通过查看 ES 的各种指标和 API 来弄清楚这可能非常耗时并且需要大量的内部 ES 知识。

推荐阅读