任务队列积压
编辑任务队列积压
编辑积压的任务队列可能会阻止任务完成,并使集群进入不健康的状态。资源限制、一次触发大量任务以及长时间运行的任务都可能导致任务队列积压。
诊断任务队列积压
编辑检查线程池状态
线程池耗尽可能仅限于特定的数据层。如果发生热点,则一个节点可能比其他节点更快地耗尽资源,从而导致性能问题和不断增长的任务积压。
您可以使用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 可能有助于减少强制合并请求的积压。
取消卡住的任务
如果您发现活动任务的热线程没有进展且存在积压,请考虑取消该任务。