任务队列积压

编辑

积压的任务队列可能会阻止任务完成,并使集群进入不健康的状态。资源限制、一次触发大量任务以及长时间运行的任务都可能导致任务队列积压。

诊断任务队列积压

编辑

检查线程池状态

耗尽的线程池可能会导致被拒绝的请求

线程池耗尽可能仅限于特定的数据层。如果发生热点,则一个节点可能比其他节点更快地耗尽资源,从而导致性能问题和不断增长的任务积压。

您可以使用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

activequeue 统计信息是瞬时的,而 rejectedcompleted 统计信息是从节点启动开始累积的。

检查每个节点上的热线程

如果特定的线程池队列出现积压,您可以定期轮询节点热线程 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 响应可能包含其他任务列,包括 descriptionheader,其中提供了任务参数、目标和请求者。您可以使用此信息进行进一步的诊断。

查找长时间运行的集群任务

任务积压也可能表现为集群状态同步的延迟。您可以使用集群待处理任务 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 可能有助于减少强制合并请求的积压。

取消卡住的任务

如果您发现活动任务的热线程没有进展且存在积压,请考虑取消该任务。