--- title: "节点并发异步搜索数量限制" date: 2026-01-15 lastmod: 2026-01-15 description: "控制每个节点同时运行的异步搜索数量的配置项说明" tags: ["异步搜索", "并发控制", "资源保护"] summary: "配置项作用 # async_search.node_concurrent_running_searches 配置项限制每个节点(协调节点)同时运行的异步搜索数量。当达到此限制时,新的异步搜索请求将被拒绝,直到有正在运行的搜索完成。 配置项类型 # 该配置项为动态配置,可以在运行时通过集群更新 API 进行修改,无需重启节点。 默认值 # 20 是否必需 # 可选配置项 取值范围 # 0 ~ Integer.MAX_VALUE 0 表示无限制 工作原理 # 每个节点维护一个活跃异步搜索上下文存储(AsynchronousSearchActiveStore),用于跟踪正在运行的异步搜索: 接收请求:新异步搜索请求到达时,检查当前活跃搜索数量 限制检查:如果当前数量已达到限制,拒绝新请求 上下文创建:未达到限制时,创建新的异步搜索上下文 资源释放:搜索完成后,从活跃存储中移除上下文,释放配额 拒绝行为 # 当超过并发限制时,系统返回以下错误: { "error": { "type": "rejected_execution_exception", "reason": "Trying to create too many concurrent searches. Must be less than or equal to: [20]. This limit can be set by changing the [async_search." --- ## 配置项作用 `async_search.node_concurrent_running_searches` 配置项限制每个节点(协调节点)同时运行的异步搜索数量。当达到此限制时,新的异步搜索请求将被拒绝,直到有正在运行的搜索完成。 ## 配置项类型 该配置项为**动态配置**,可以在运行时通过集群更新 API 进行修改,无需重启节点。 ## 默认值 ``` 20 ``` ## 是否必需 **可选配置项** ## 取值范围 ``` 0 ~ Integer.MAX_VALUE 0 表示无限制 ``` ## 工作原理 每个节点维护一个活跃异步搜索上下文存储(AsynchronousSearchActiveStore),用于跟踪正在运行的异步搜索: 1. **接收请求**:新异步搜索请求到达时,检查当前活跃搜索数量 2. **限制检查**:如果当前数量已达到限制,拒绝新请求 3. **上下文创建**:未达到限制时,创建新的异步搜索上下文 4. **资源释放**:搜索完成后,从活跃存储中移除上下文,释放配额 ## 拒绝行为 当超过并发限制时,系统返回以下错误: ```json { "error": { "type": "rejected_execution_exception", "reason": "Trying to create too many concurrent searches. Must be less than or equal to: [20]. This limit can be set by changing the [async_search.node_concurrent_running_searches] settings." } } ``` ## 使用示例 ```yaml # 默认配置(最多20个并发异步搜索) async_search.node_concurrent_running_searches: 20 # 增加并发限制(最多100个) async_search.node_concurrent_running_searches: 100 # 减少并发限制(最多5个) async_search.node_concurrent_running_searches: 5 # 无限制 async_search.node_concurrent_running_searches: 0 ``` ## 推荐设置建议 **生产环境建议**:根据节点硬件资源和业务需求设置 **推荐配置:** ```yaml # 小型节点(4核8G以下) async_search.node_concurrent_running_searches: 10 # 中型节点(8核16G) async_search.node_concurrent_running_searches: 20 # 大型节点(16核32G以上) async_search.node_concurrent_running_searches: 50 ``` **设置考虑因素:** 1. **CPU资源**:异步搜索会占用CPU进行查询处理 2. **内存资源**:每个异步搜索上下文需要维护状态和中间结果 3. **线程池**:需与 `async_search_generic` 线程池大小协调 4. **查询复杂度**:复杂查询需要更多资源 5. **业务需求**:高并发场景需要适当提高限制 ## 资源消耗估算 | 并发数 | 内存占用估算 | CPU占用估算 | 适用场景 | |-------|------------|------------|---------| | 5 | ~500MB | 低 | 小型节点 | | 20 | ~2GB | 中 | 中型节点 | | 50+ | ~5GB+ | 高 | 大型节点 | *注:实际资源消耗取决于查询复杂度和数据量* ## 监控建议 建议监控以下指标: ```bash # 获取异步搜索统计信息 GET /_async_search/stats # 响应示例 { "running": 15, "remaining": 5, "concurrent": 20 } ``` - **running**:当前运行的异步搜索数量 - **remaining**:剩余可用配额 - **concurrent**:配置的最大并发数 ## 相关配置项 | 配置项 | 作用 | 默认值 | |-------|------|-------| | `thread_pool.async_search_generic` | 异步搜索线程池 | core=1, max=96 | | `async_search.max_search_running_time` | 搜索最大运行时间 | 12小时 | | `async_search.active.context.reaper_interval` | 活跃上下文清理间隔 | 5分钟 | ## 与线程池的关系 ``` 异步搜索并发限制 (20) │ ▼ ┌─────────────────────────────┐ │ 活跃上下文存储 │ │ (AsynchronousSearchActiveStore) │ └─────────────────────────────┘ │ ▼ ┌─────────────────────────────┐ │ async_search_generic 线程池 │ │ (core=1, max=96) │ └─────────────────────────────┘ ``` 两个配置需要协调: - **并发限制**:控制同时运行的异步搜索数量 - **线程池**:控制执行异步搜索任务的线程数量 ## 注意事项 1. **动态更新**:修改此配置后立即生效 2. **节点级别**:此限制在每个节点上独立生效 3. **与普通搜索的区别**:此配置仅影响异步搜索,不影响普通同步搜索 4. **资源规划**:设置过高可能导致节点资源耗尽,影响其他服务 5. **错误处理**:客户端应处理 `rejected_execution_exception`,实现重试或降级逻辑 6. **无限制风险**:设置为 0 会移除此限制,需确保节点资源足够