java - 始终在最大搜索特定节点的 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
解决方案
需要注意的重要一点是,如果您从elasticsearch 线程池 cat API获得这些统计信息,那么它仅显示时间点数据,而不显示过去 1 小时、6 小时、1 天、1 的历史数据像这样的一周。
并且拒绝和完成是节点上次重新启动的统计信息,因此当我们试图确定某些 ES 节点是否由于错误/不平衡的分片配置而成为热点时,这也不是很有帮助。
所以在这里我们有两个非常重要的事情要弄清楚
- 确保我们通过按时间范围查看数据节点上的平均活动、拒绝请求来了解集群中的实际热点节点(您可以只检查高峰时间)。
- 一旦知道热点节点,查看分配给它们的分片,并将其与其他节点分片进行比较,检查的几个指标是,分片数量,分片接收更多流量,分片接收最慢查询等,其中大部分你有通过查看 ES 的各种指标和 API 来弄清楚这可能非常耗时并且需要大量的内部 ES 知识。
推荐阅读
- mysql - SQL 结果只显示一次相同的值
- javascript - 有没有办法在当前打开的页面 url 上应用 javascript 函数
- java - JPA Criteria API - where 条件与子类上的字段
- javascript - 如果 NPM 中不存在此库,如何在我的 Node.JS 项目中使用外部 JS 库方法
- c - 从C中的二进制文件中排序结构
- docker - AWK 重复行并替换占位符
- java - 如何使用循环创建新对象
- javascript - 拆分输入数组值 - Angular
- javascript - 如何使用 JavaScript 在后台轮播 GIF?
- jquery - Safari 浏览器中未显示 Smart-Web-App-Banner 横幅