拒绝的请求
当 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(已完成)任务的高比率(特别是在 search 和 write 线程池中)表明 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]]
要排查持续发生的线程池拒绝错误,请检查由于线程池导致的“任务队列积压”。请参阅“线程池拒绝”视频以获取故障排查指南。
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_primary、coordinating、primary 或 replica。
这些错误通常与以下因素有关:
- 积压任务的数量。
- 批量索引 (Bulk index) 的值设置得过大。
- 大型的搜索响应大小。
- 使用
semantic_text字段类型,如果批次可能导致内存溢出 (OOM) 错误,则在索引大批量文档时可能会导致拒绝。
请参阅“索引压力拒绝”视频以获取故障排查指南。
如果 Elasticsearch 定期拒绝请求和其他任务,则您的集群可能存在高 CPU 使用率或高 JVM 内存压力。有关提示,请参阅“高 CPU 使用率”和“高 JVM 内存压力”。
当使用 semantic_text 字段类型批量索引文档时,您可能会因为推理处理过程中的高内存使用率而遇到拒绝。这些拒绝会在您的集群日志中显示为 InferenceException。
要解决此问题
- 减少索引请求中的文档批次大小。
- 如果减少批次大小无法解决问题,请考虑扩展您的机器资源。
-
最后的手段是调整 indexing_pressure.memory.coordinating.limit集群设置。默认值为堆内存的 10%。提高此限制允许在发生拒绝之前将更多内存用于协调操作。
只有在尝试了其他所有选项后才应考虑此调整,因为将此值设置得过高可能会导致集群出现内存溢出 (OOM) 错误。此更改需要重启集群才能生效。