任务队列积压
编辑任务队列积压
编辑任务队列积压会阻止任务完成,并使集群处于不健康状态。资源限制、大量任务同时触发以及长时间运行的任务都会导致任务队列积压。
诊断任务队列积压
编辑检查线程池状态
线程池耗尽可能仅限于特定的 数据层。如果发生 热点问题,一个节点可能会比其他节点更快地出现耗尽,从而导致性能问题和任务积压加剧。
您可以使用 cat 线程池 API 查看每个线程池中活动线程的数量,以及已排队的任务数量、被拒绝的任务数量和已完成的任务数量。
resp = client.cat.thread_pool( v=True, s="t,n", h="type,name,node_name,active,queue,rejected,completed", ) print(resp)
response = client.cat.thread_pool( v: true, s: 't,n', h: 'type,name,node_name,active,queue,rejected,completed' ) puts response
const response = await client.cat.threadPool({ v: "true", s: "t,n", h: "type,name,node_name,active,queue,rejected,completed", }); console.log(response);
GET /_cat/thread_pool?v&s=t,n&h=type,name,node_name,active,queue,rejected,completed
active
和 queue
统计数据是瞬时的,而 rejected
和 completed
统计数据是从节点启动以来累积的。
检查每个节点上的热点线程
如果某个线程池队列积压,您可以定期轮询 节点热点线程 API 以确定线程是否有足够的资源来继续执行,并评估其执行速度。
resp = client.nodes.hot_threads() print(resp)
response = client.nodes.hot_threads puts response
const response = await client.nodes.hotThreads(); console.log(response);
GET /_nodes/hot_threads
查找长时间运行的节点任务
长时间运行的任务也会导致积压。您可以使用 任务管理 API 获取有关正在运行的节点任务的信息。检查 running_time_in_nanos
以识别完成时间过长的任务。
resp = client.tasks.list( pretty=True, human=True, detailed=True, ) print(resp)
const response = await client.tasks.list({ pretty: "true", human: "true", detailed: "true", }); console.log(response);
GET /_tasks?pretty=true&human=true&detailed=true
如果怀疑某个特定的 action
,您可以进一步过滤任务。最常见的是长时间运行的任务是与 批量索引 或搜索相关的任务。
-
筛选 批量索引 操作
resp = client.tasks.list( human=True, detailed=True, actions="indices:data/write/bulk", ) print(resp)
const response = await client.tasks.list({ human: "true", detailed: "true", actions: "indices:data/write/bulk", }); console.log(response);
GET /_tasks?human&detailed&actions=indices:data/write/bulk
-
筛选搜索操作
resp = client.tasks.list( human=True, detailed=True, actions="indices:data/write/search", ) print(resp)
const response = await client.tasks.list({ human: "true", detailed: "true", actions: "indices:data/write/search", }); console.log(response);
GET /_tasks?human&detailed&actions=indices:data/write/search
API 响应可能包含其他任务列,包括 description
和 header
,它们提供任务参数、目标和请求者。您可以使用此信息进行进一步诊断。
查找长时间运行的集群任务
任务积压也可能表现为集群状态同步延迟。您可以使用 待处理集群任务 API 获取有关正在运行的待处理集群状态同步任务的信息。
resp = client.cluster.pending_tasks() print(resp)
const response = await client.cluster.pendingTasks(); console.log(response);
GET /_cluster/pending_tasks
检查 timeInQueue
以识别完成时间过长的任务。
解决任务队列积压
编辑增加可用资源
如果任务进展缓慢且队列积压,您可能需要采取措施 降低 CPU 使用率。
在某些情况下,增加线程池大小可能会有所帮助。例如,force_merge
线程池默认为单个线程。将其大小增加到 2 可能会帮助减少 force merge 请求的积压。
取消卡住的任务
如果您发现活动任务的热点线程没有进展并且存在积压,请考虑取消该任务。