加载中

拒绝的请求

当 Elasticsearch 拒绝请求时,它会停止操作并针对 TOO_MANY_REQUESTS 错误返回 HTTP 429 响应代码。返回的 HTTP 响应正文包含有关操作被拒绝原因的信息。您可以重试 HTTP 429 错误,但通常最好实现 指数退避,以避免加剧性能问题。

被拒绝的请求通常是由资源耗尽引起的。这里描述了其中最常见的情况。

要检查每个线程池的被拒绝任务数量,请使用 cat 线程池 API

				GET /_cat/thread_pool?v=true&h=id,name,queue,active,rejected,completed
		

rejected(被拒绝)任务与 completed(已完成)任务的高比率(特别是在 searchwrite 线程池中)表明 Elasticsearch 定期拒绝请求。

以下示例演示了典型的 queue capacity(队列容量)错误。

  • API 响应正文返回 es_rejected_execution_exception 错误

    {
        "shard" : 0,
        "node" : "XXXX",
        "reason" : {
           "reason" : "rejected execution of org.elasticsearch.common.util.concurrent.TimedRunnable@26c03d4a on QueueResizingEsThreadPoolExecutor[name = XXXXX/search, queue capacity = 1000, min queue capacity = 1000, max queue capacity = 1000, frame size = 2000, targeted response rate = 1s, task execution EWMA = 968.1ms, adjustment amount = 50, org.elasticsearch.common.util.concurrent.QueueResizingEsThreadPoolExecutor@70be0765[Running, pool size = 25, active threads = 25, queued tasks = 1000, completed tasks = 616499351]]",
           "type" : "es_rejected_execution_exception"
        },
        "index" : "my-index-000001"
    }
    		
  • 错误日志返回 EsRejectedExecutionException 错误

    Caused by: org.elasticsearch.common.util.concurrent.EsRejectedExecutionException: rejected execution of org.elasticsearch.common.util.concurrent.TimedRunnable@1a25fe82 on QueueResizingEsThreadPoolExecutor[name = XXXXX/search, queue capacity = 1000, min queue capacity = 1000, max queue capacity = 1000, frame size = 2000, targeted response rate = 1s, task execution EWMA = 10.7ms, adjustment amount = 50, org.elasticsearch.common.util.concurrent.QueueResizingEsThreadPoolExecutor@6312a0bb[Running, pool size = 25, active threads = 25, queued tasks = 1000, completed tasks = 616499351]]
    		

要排查持续发生的线程池拒绝错误,请检查由于线程池导致的“任务队列积压”。请参阅“线程池拒绝”视频以获取故障排查指南。

要检查触发的断路器数量,请使用节点统计 API

				GET /_nodes/stats/breaker
		

这些统计信息是从节点启动时开始累积的。有关更多信息,请参阅断路器错误

请参阅“断路器错误”视频以获取故障排查指南。

Elasticsearch 保留了部分 JVM 内存用于索引。如果堆使用量超过 indexing_pressure.memory.limit 设置,可能会发生错误。要检查索引压力导致的拒绝数量,请使用节点统计 API

				GET _nodes/stats?human&filter_path=nodes.*.indexing_pressure
		

这些统计信息是从节点启动时开始累积的。

以下示例演示了索引压力导致的拒绝。

  • API 响应正文返回 es_rejected_execution_exception 错误

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "es_rejected_execution_exception",
            "reason" : "rejected execution of primary operation [coordinating_and_primary_bytes=XXXXX, replica_bytes=XXXXX, all_bytes=XXXXX, coordinating_operation_bytes=XXXXX, max_coordinating_and_primary_bytes=XXXXX]"
          }
        ],
        "type" : "es_rejected_execution_exception",
        "reason" : "rejected execution of coordinating operation [coordinating_and_primary_bytes=XXXXX, replica_bytes=XXXXX, all_bytes=XXXXX, coordinating_operation_bytes=XXXXX, max_coordinating_and_primary_bytes=XXXXX]"
      },
      "status" : 429
    }
    		
  • 错误日志返回 EsRejectedExecutionException 错误

    Caused by: org.elasticsearch.common.util.concurrent.EsRejectedExecutionException: rejected execution of primary operation [coordinating_and_primary_bytes=XXXXX, replica_bytes=XXXXX, all_bytes=XXXXX, coordinating_operation_bytes=XXXXX, max_coordinating_and_primary_bytes=XXXXX]
    		

作为“读取和写入文档”大纲模型的一部分,错误信息 rejected execution of <category> operation 中的部分会报告以下类别之一:combined_coordinating_and_primarycoordinatingprimaryreplica

这些错误通常与以下因素有关:

  • 积压任务的数量。
  • 批量索引 (Bulk index) 的值设置得过大。
  • 大型的搜索响应大小。
  • 使用 semantic_text 字段类型,如果批次可能导致内存溢出 (OOM) 错误,则在索引大批量文档时可能会导致拒绝。

请参阅“索引压力拒绝”视频以获取故障排查指南。

使用 AutoOps 简化监控

AutoOps 是一款监控工具,它通过性能建议、资源利用率可见性以及带有解决方案路径的实时问题检测来简化集群管理。了解更多关于 AutoOps 的信息。

如果 Elasticsearch 定期拒绝请求和其他任务,则您的集群可能存在高 CPU 使用率或高 JVM 内存压力。有关提示,请参阅“高 CPU 使用率”“高 JVM 内存压力”

当使用 semantic_text 字段类型批量索引文档时,您可能会因为推理处理过程中的高内存使用率而遇到拒绝。这些拒绝会在您的集群日志中显示为 InferenceException

要解决此问题

  1. 减少索引请求中的文档批次大小。
  2. 如果减少批次大小无法解决问题,请考虑扩展您的机器资源。
  3. 最后的手段是调整 indexing_pressure.memory.coordinating.limit 集群设置。默认值为堆内存的 10%。提高此限制允许在发生拒绝之前将更多内存用于协调操作。
警告

只有在尝试了其他所有选项后才应考虑此调整,因为将此值设置得过高可能会导致集群出现内存溢出 (OOM) 错误。此更改需要重启集群才能生效。

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.