任务队列积压

编辑

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

诊断任务队列积压

编辑

检查线程池状态

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

线程池耗尽可能仅限于特定的 数据层。如果发生 热点问题,一个节点可能会比其他节点更快地出现耗尽,从而导致性能问题和任务积压加剧。

您可以使用 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 可能会帮助减少 force merge 请求的积压。

取消卡住的任务

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