首页/数据/NoSQL 速查/_cat/thread_pool 线程池与拒绝率
Elasticsearch89 条

_cat/thread_pool 线程池与拒绝率

线程池按操作类型(search/write/get 等)限流,队列满后请求被拒绝;_cat/thread_pool 展示各池的活跃线程、队列长度与累计拒绝数。

NoSQL 速查数据更新于 2026-10-13

线程池看什么

Elasticsearch 按操作类型把请求放进不同线程池:search、write、get、management、snapshot 等,每个池有固定数量的线程和一个容量有限的队列。队列排满后新请求会被直接拒绝,这个拒绝计数就是判断节点是否过载最直接的信号。

基本信息

接口GET /_cat/thread_pool?v
关键列node_name、name、active、queue、rejected、completed
常见池search、search_throttled、write、get、management、snapshot
拒绝含义队列已满且无线程可用,请求被拒并返回 429
深挖方式用 _nodes/stats/thread_pool 查看各节点明细

典型使用场景

  • 排查接口报 429:确认是哪个线程池在拒绝请求
  • 评估集群是否过载:观察 search 与 write 池的队列长度
  • 定位单节点异常:某个节点的拒绝数远高于其他节点
  • 容量规划:为扩容提供并发压力的量化依据
  • 验证限流效果:调整客户端并发后看拒绝数是否回落

常用写法

常用写法
# 按拒绝数排序,先看最严重的节点与线程池
GET /_cat/thread_pool?v&h=node_name,name,active,queue,rejected&s=rejected:desc

# 只看 search 与 write 两个关键池
GET /_cat/thread_pool/search,write?v

# 集群级统计:取各节点的拒绝计数
GET /_nodes/stats/thread_pool?filter_path=nodes.*.thread_pool.*.rejected

# 队列长度持续非零说明请求在排队
GET /_cat/thread_pool?v&h=node_name,name,active,queue,completed&s=queue:desc

关键列读法

列含义正常 / 异常
active正在执行任务的线程数长期打满说明并发超过处理能力
queue排队等待的任务数持续非零说明处理速度跟不上
rejected累计被拒绝的任务数增长快意味着已经过载
completed累计完成的任务数用于换算拒绝比例
name线程池名称search 与 write 最需要关注
rejected 是累计计数,趋势比绝对值重要:看单位时间的增长速率,持续增长意味着并发已超过节点处理能力,需要扩容或限制客户端并发。
单次超大聚合或多字段深排序同样可能压满 search 池并触发拒绝,遇到 429 时把线程池数据与慢日志一起看,比单纯扩大队列更能找到根因。

易错点

  • 靠调大队列长度来减少拒绝:请求仍然要排队等待,客户端超时只是出现得更晚,问题被推迟而不是被解决
  • write 池积压常与刷新频率和批量写法相关,先检查批量大小与 refresh 设置,再考虑扩队列
  • 只看集群总体拒绝数而忽略单节点差异,个别节点的过载会被平均值掩盖
  • 把 429 全部归因于集群规模不足:查询写法本身就可能压满线程池,先看请求内容再决定是否扩容

数据来源与参考

  • Elasticsearch Guide: cat thread pool API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌