Link Search Menu Expand Document Documentation Menu

搜索背压

搜索背压是一种用于识别资源密集型搜索请求并在节点压力过大时取消这些请求的机制。如果节点或分片上的搜索请求超出了资源限制并且在特定阈值内未恢复,则该请求将被拒绝。这些阈值是动态的,可以通过 集群设置 使用 /_cluster/settings API 端点进行配置。

测量资源消耗

为了决定是否应用搜索背压,OpenSearch 会定期测量每个搜索请求的以下资源消耗统计信息:

  • CPU 使用率
  • 堆使用率
  • 已用时间

观察者线程会定期测量节点的资源使用情况。如果 OpenSearch 判断节点压力过大,OpenSearch 会检查每个搜索任务和搜索分片任务的资源使用情况,并将其与可配置的阈值进行比较。OpenSearch 会考虑 CPU 使用率、堆使用率和已用时间,并为每个任务分配一个取消分数,然后该分数用于取消资源最密集型的任务。

OpenSearch 将取消数量限制为成功任务完成数量的一小部分。此外,它还限制每单位时间的取消数量。OpenSearch 会持续监控和取消任务,直到节点不再处于压力之下。

已取消的查询

如果查询被取消,如果某些分片失败,OpenSearch 可能会返回部分结果。如果所有分片都失败,OpenSearch 会返回一个类似于以下错误的服务器错误:

{
  "error": {
    "root_cause": [
      {
          "type": "task_cancelled_exception",
          "reason": "cancelled task with reason: cpu usage exceeded [17.9ms >= 15ms], elapsed time exceeded [1.1s >= 300ms]"
      },
      {
          "type": "task_cancelled_exception",
          "reason": "cancelled task with reason: elapsed time exceeded [1.1s >= 300ms]"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "foobar",
        "node": "7yIqOeMfRyWW1rHs2S4byw",
        "reason": {
            "type": "task_cancelled_exception",
            "reason": "cancelled task with reason: cpu usage exceeded [17.9ms >= 15ms], elapsed time exceeded [1.1s >= 300ms]"
        }
      },
      {
        "shard": 1,
        "index": "foobar",
        "node": "7yIqOeMfRyWW1rHs2S4byw",
        "reason": {
            "type": "task_cancelled_exception",
            "reason": "cancelled task with reason: elapsed time exceeded [1.1s >= 300ms]"
        }
      }
    ]
  },
  "status": 500
}

搜索背压模式

搜索背压以 monitor_only(默认)、enforceddisabled 模式运行。在 enforced 模式下,服务器会拒绝搜索请求。在 monitor_only 模式下,服务器不会实际取消搜索请求,但会跟踪有关它们的统计信息。您可以在 search_backpressure.mode 参数中指定模式。

搜索背压设置

搜索背压为标准 OpenSearch 集群设置添加了一些设置。这些设置是动态的,因此您无需重启集群即可更改此功能的默认行为。

要配置这些设置,请向 /_cluster/settings 发送 PUT 请求:

PUT /_cluster/settings
{
  "persistent": {
    "search_backpressure": {
      "mode": "monitor_only"
    }
  }
}

设置 默认值 描述
search_backpressure.mode monitor_only 搜索背压模式。有效值为 monitor_onlyenforceddisabled
search_backpressure.cancellation_ratio
在 2.6 版本中已弃用。替换为 search_backpressure.search_shard_task.cancellation_ratio
10% 要取消的最大任务数量,以成功任务完成的百分比表示。
search_backpressure.cancellation_rate
在 2.6 版本中已弃用。替换为 search_backpressure.search_shard_task.cancellation_rate
0.003 每毫秒已用时间可取消的最大任务数量。
search_backpressure.cancellation_burst
在 2.6 版本中已弃用。替换为 search_backpressure.search_shard_task.cancellation_burst
10 观察者线程单次迭代中可取消的最大搜索分片任务数量。
search_backpressure.node_duress.num_successive_breaches 3 节点被视为压力过大之前连续突破限制的次数。
search_backpressure.node_duress.cpu_threshold 90% 节点被视为压力过大所需的 CPU 使用率阈值(百分比)。
search_backpressure.node_duress.heap_threshold 70% 节点被视为压力过大所需的堆使用率阈值(百分比)。
search_backpressure.search_task.elapsed_time_millis_threshold 45,000 单个父任务被考虑取消之前所需的已用时间阈值(毫秒)。
search_backpressure.search_task.cancellation_ratio 0.1 要取消的最大搜索任务数量,以成功搜索任务完成的百分比表示。值范围为 (0, 1]。
search_backpressure.search_task.cancellation_rate 0.003 每毫秒已用时间可取消的最大搜索任务数量。该值必须大于 0。
search_backpressure.search_task.cancellation_burst 5 观察者线程单次迭代中可取消的最大搜索任务数量。该值必须大于或等于 1。
search_backpressure.search_task.heap_percent_threshold 2% 单个父任务被考虑取消之前所需的堆使用率阈值(百分比)。值范围为 [0%, 100%]。
search_backpressure.search_task.total_heap_percent_threshold 5% 在应用取消之前,所有搜索任务的堆使用总量所需的堆使用率阈值(百分比)。值范围为 [0%, 100%]。
search_backpressure.search_task.heap_variance 2.0 单个父任务被考虑取消之前所需的堆使用率方差。当 taskHeapUsage 大于或等于 heapUsageMovingAverage * variance 时,该任务被考虑取消。该值必须大于或等于 0。
search_backpressure.search_task.heap_moving_average_window_size 10 用于计算已完成父任务堆使用率滚动平均值的窗口大小。该值必须大于或等于 0。
search_backpressure.search_task.cpu_time_millis_threshold 30,000 单个父任务被考虑取消之前所需的 CPU 使用率阈值(毫秒)。该值必须大于或等于 0。
search_backpressure.search_shard_task.elapsed_time_millis_threshold 30,000 单个搜索分片任务被考虑取消之前所需的已用时间阈值(毫秒)。该值必须大于或等于 0。
search_backpressure.search_shard_task.cancellation_ratio 0.1 要取消的最大搜索分片任务数量,以成功搜索分片任务完成的百分比表示。值范围为 (0, 1]。
search_backpressure.search_shard_task.cancellation_rate 0.003 每毫秒已用时间可取消的最大搜索分片任务数量。该值必须大于 0。
search_backpressure.search_shard_task.cancellation_burst 10 观察者线程单次迭代中可取消的最大搜索分片任务数量。该值必须大于或等于 1。
search_backpressure.search_shard_task.heap_percent_threshold 0.5% 单个搜索分片任务被考虑取消之前所需的堆使用率阈值(百分比)。值范围为 [0%, 100%]。
search_backpressure.search_shard_task.total_heap_percent_threshold 5% 在应用取消之前,所有搜索分片任务的堆使用总量所需的堆使用率阈值(百分比)。值范围为 [0%, 100%]。
search_backpressure.search_shard_task.heap_variance 2.0 单个搜索分片任务的堆使用率与先前已完成任务的滚动平均值相比所需的最小方差,然后才考虑取消。该值必须大于或等于 0。
search_backpressure.search_shard_task.heap_moving_average_window_size 100 计算堆使用率滚动平均值时要考虑的先前已完成搜索分片任务的数量。该值必须大于或等于 0。
search_backpressure.search_shard_task.cpu_time_millis_threshold 15,000 单个搜索分片任务被考虑取消之前所需的 CPU 使用率阈值(毫秒)。该值必须大于或等于 0。

搜索背压统计 API

2.4 版引入

您可以使用 节点统计 API 操作 来监控服务器端请求取消。

请求示例

要检索统计信息,请使用以下请求:

GET _nodes/stats/search_backpressure

示例响应

响应包含服务器端请求取消统计信息:

{
  "_nodes": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "cluster_name": "runTask",
  "nodes": {
    "T7aqO6zaQX-lt8XBWBYLsA": {
      "timestamp": 1667409521070,
      "name": "runTask-0",
      "transport_address": "127.0.0.1:9300",
      "host": "127.0.0.1",
      "ip": "127.0.0.1:9300",
      "roles": [
         
      ],
      "attributes": {
        "testattr": "test",
        "shard_indexing_pressure_enabled": "true"
      },
      "search_backpressure": {
        "search_task": {
          "resource_tracker_stats": {
            "heap_usage_tracker": {
              "cancellation_count": 57,
              "current_max_bytes": 5739204,
              "current_avg_bytes": 962465,
              "rolling_avg_bytes": 4009239
            },
            "elapsed_time_tracker": {
              "cancellation_count": 97,
              "current_max_millis": 15902,
              "current_avg_millis": 9705
            },
            "cpu_usage_tracker": {
              "cancellation_count": 64,
              "current_max_millis": 8483,
              "current_avg_millis": 7843
            }
          },
          "cancellation_stats": {
            "cancellation_count": 102,
            "cancellation_limit_reached_count": 25
          }
        },
        "search_shard_task": {
          "resource_tracker_stats": {
            "heap_usage_tracker": {
              "cancellation_count": 34,
              "current_max_bytes": 1203272,
              "current_avg_bytes": 700267,
              "rolling_avg_bytes": 1156270
            },
            "cpu_usage_tracker": {
              "cancellation_count": 318,
              "current_max_millis": 731,
              "current_avg_millis": 303
            },
            "elapsed_time_tracker": {
              "cancellation_count": 310,
              "current_max_millis": 1305,
              "current_avg_millis": 649
            }
          },
          "cancellation_stats": {
            "cancellation_count": 318,
            "cancellation_limit_reached_count": 97
          }
        },
        "mode": "enforced"
      }
    }
  }
}

响应正文字段

响应包含以下字段。

字段名称 数据类型 描述
search_backpressure 对象 有关搜索背压的统计信息。
search_backpressure.search_task 对象 特定于搜索任务的统计信息。
search_backpressure.search_task.resource_tracker_stats 对象 有关当前搜索任务的统计信息。
search_backpressure.search_task.cancellation_stats 对象 自节点上次重启以来已取消的搜索任务统计信息。
search_backpressure.search_shard_task 对象 特定于搜索分片任务的统计信息。
search_backpressure.search_shard_task.resource_tracker_stats 对象 有关当前搜索分片任务的统计信息。
search_backpressure.search_shard_task.cancellation_stats 对象 自节点上次重启以来已取消的搜索分片任务统计信息。
search_backpressure.mode 字符串 搜索背压的模式

resource_tracker_stats

resource_tracker_stats 对象包含每个资源跟踪器的统计信息:elapsed_time_trackerheap_usage_trackercpu_usage_tracker

elapsed_time_tracker

elapsed_time_tracker 对象包含与已用时间相关的以下统计信息。

字段名称 数据类型 描述
cancellation_count 整数 自节点上次重启以来,因已用时间过长而被标记为取消的任务数量。
current_max_millis 整数 节点上当前所有正在运行任务的最大已用时间(毫秒)。
current_avg_millis 整数 节点上当前所有正在运行任务的平均已用时间(毫秒)。

heap_usage_tracker

heap_usage_tracker 对象包含与堆使用率相关的以下统计信息。

字段名称 数据类型 描述
cancellation_count 整数 自节点上次重启以来,因堆使用过高而被标记为取消的任务数量。
current_max_bytes 整数 节点上当前所有正在运行任务的最大堆使用量(字节)。
current_avg_bytes 整数 节点上当前所有正在运行任务的平均堆使用量(字节)。
rolling_avg_bytes 整数 最近 n 个任务的滚动平均堆使用量(字节)。n 可配置,由 search_backpressure.search_shard_task.heap_moving_average_window_size 设置定义。此设置的默认值为 100。

cpu_usage_tracker

cpu_usage_tracker 对象包含与 CPU 使用率相关的以下统计信息。

字段名称 数据类型 描述
cancellation_count 整数 自节点上次重启以来,因 CPU 使用过高而被标记为取消的任务数量。
current_max_millis 整数 节点上当前所有正在运行任务的最大 CPU 时间(毫秒)。
current_avg_millis 整数 节点上当前所有正在运行任务的平均 CPU 时间(毫秒)。

cancellation_stats

cancellation_stats 对象包含已标记为取消的任务的以下统计信息。

字段名称 数据类型 描述
cancellation_count 整数 自节点上次重启以来,已标记为取消的任务总数。
cancellation_limit_reached_count 整数 符合取消条件的任务数量超过设定取消阈值的次数。
剩余 350 字符

有问题?

想贡献?