搜索背压
搜索背压是一种用于识别资源密集型搜索请求并在节点压力过大时取消这些请求的机制。如果节点或分片上的搜索请求超出了资源限制并且在特定阈值内未恢复,则该请求将被拒绝。这些阈值是动态的,可以通过 集群设置 使用 /_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
(默认)、enforced
或 disabled
模式运行。在 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_only 、enforced 或 disabled 。 |
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_tracker
、heap_usage_tracker
和 cpu_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 | 整数 | 符合取消条件的任务数量超过设定取消阈值的次数。 |