Elasticsearch 使用线程池管理节点 CPU 与 JVM 资源,支持并发操作。各线程池分配不同线程数,通常取决于节点获得的处理器数量,帮助节点在处理昂贵任务或积压队列时保持响应。线程池队列饱和时,会拒绝相关请求。
一个任务可以在多个线程上产生工作。单个线程占满 CPU 很正常,可能在处理一个昂贵任务,也可能连续处理多个任务。hot threads 报告是某段时间内 Java 线程的快照,不能直接一一对应到节点任务。
节点可能短暂占满全部已分配 CPU 线程,但长期如此并不寻常。可能是节点规格与同数据层其他节点不匹配、请求量超过能力,例如低于推荐最低配置,或正在处理昂贵任务。
为缓解性能故障,默认建议先收集 Elasticsearch 诊断供事后分析,同时尝试通过扩容恢复服务。
诊断
检查节点 CPU
使用 cat nodes API:
GET _cat/nodes?v=true&s=cpu:desc&h=name,role,master,cpu,load*,allocated_processors
指标含义:
cpu:系统 CPU 的瞬时使用百分比。load_1m、load_5m、load_15m:对应时间段平均等待进程数。allocated_processors:节点分配的处理器数量。
更多细节见节点统计 API。告警阈值应根据工作负载与持续时间要求确定,一般可从以下基线开始:
- 推荐调查 CPU 长时间高于 95% 的情况。
- 负载平均值除以已分配处理器数量持续偏高,也值得关注,但不能单独判断;需结合响应时间,否则可能只是正常后台 I/O。
如果 CPU 确实异常,按 role 与 master 列查看流量分布或热点。整个数据层都异常,通常提示配置问题或规模不足;只有部分节点异常,则更像任务热点。
检查热点线程
高 CPU 常与长任务或任务积压相关。节点 CPU 升高时,使用 hot threads API 查看高资源线程,辅助关联任务:
GET _nodes/hot_threads
简化输出示例:
::: {instance-0000000001}{9fVI1XoXQJCgHwsOPlVEig}{RrJGwEaESRmNs75Gjs1SOg}{instance-0000000001}{10.42.9.84}{10.42.9.84:19058}{himrst}{9.3.0}{7000099-8525000}{region=unknown-region, server_name=instance-0000000001.b84ab96b481f43d791a1a73477a10d40, xpack.installed=true, transform.config_version=10.0.0, ml.config_version=12.0.0, data=hot, logical_availability_zone=zone-1, availability_zone=us-central1-a, instance_configuration=gcp.es.datahot.n2.68x10x45}
Hot threads at 2025-05-14T17:59:30.199Z, interval=500ms, busiestThreads=10000, ignoreIdleThreads=true:
88.5% [cpu=88.5%, other=0.0%] (442.5ms out of 500ms) cpu usage by thread '[write]'
8/10 snapshots sharing following 29 elements
com.fasterxml.jackson.dataformat.smile@2.17.2/com.fasterxml.jackson.dataformat.smile.SmileParser.nextToken(SmileParser.java:434)
org.elasticsearch.xpack.monitoring.exporter.local.LocalBulk.doAdd(LocalBulk.java:69)
# ...
2/10 snapshots sharing following 37 elements
app/org.elasticsearch.xcontent/org.elasticsearch.xcontent.support.filtering.FilterPath$FilterPathBuilder.insertNode(FilterPath.java:172)
# ...
格式如下:
::: {NAME}{ID}{...}{HOST_NAME}{ADDRESS}{...}{ROLES}{VERSION}{...}{ATTRIBUTES}
Hot threads at TIMESTAMP, interval=INTERVAL_FROM_API, busiestThreads=THREADS_FROM_API, ignoreIdleThreads=IDLE_FROM_API:
TOTAL_CPU% [cpu=ELASTIC_CPU%, other=OTHER_CPU%] (Xms out of INTERVAL_FROM_API) cpu usage by thread 'THREAD'
X/... snapshots sharing following X elements
STACKTRACE_SAMPLE
# ...
X/... snapshots sharing following X elements
STACKTRACE_SAMPLE
# ...
其中三个 CPU 时间指标:
TOTAL_CPU:线程总 CPU 使用量,包括 Elasticsearch 与操作系统。ELASTIC_CPU:Elasticsearch 可用且由它使用的 CPU。OTHER_CPU:磁盘/网络 I/O 或垃圾回收等其他类别。
虽然 ELASTIC_CPU 通常是总 CPU 升高的主因,仍应查看堆栈样本。它通常显示 Elasticsearch 调用,也可能暴露非 Elasticsearch 进程。常见线索:
org.elasticsearch.action.search或org.elasticsearch.search:搜索。org.elasticsearch.cluster.metadata.Metadata.findAliases:别名查找/解析。org.elasticsearch.common.regex:自定义正则。org.elasticsearch.grok:自定义 Grok。org.elasticsearch.index.fielddata.ordinals.GlobalOrdinalsBuilder.build:构建全局序数。org.elasticsearch.ingest.Pipeline或org.elasticsearch.ingest.CompoundProcessor:摄取流水线。org.elasticsearch.xpack.core.esql或org.elasticsearch.xpack.esql:ES|QL 查询。
需要支持团队协助关联热点线程与任务时,请同时提供 Elasticsearch 诊断。
检查垃圾回收
过多 JVM GC 活动常导致高 CPU,根因通常是配置问题或低效查询增加堆使用。排查方法见高 JVM 内存压力文档。
持续监控
AutoOps 可以实时检测问题并给出解决和性能建议。建议开启监控以跟踪 CPU 趋势。
Elastic Cloud 托管部署可启用 AutoOps,或启用日志和指标,在 Kibana Stack Monitoring 查看。还可开启 CPU 阈值邮件告警。
部署菜单的 Performance 页面显示 CPU 使用百分比,以及按 CPU 秒数计算的剩余 CPU credits。Elastic Cloud Hosted 为较小集群提供 CPU credits,用于短期提升。高使用量会耗尽额度,造成性能下降和响应延迟。
其他适用部署同样可启用 AutoOps 或 Elasticsearch 监控,并配置 CPU 阈值邮件告警。也可以开启慢日志,作为任务积压分析的一部分。
降低 CPU 使用率
高 CPU 通常对应正在执行的昂贵任务或积压任务。下面是即使流量很低或没有流量时,也可能持续消耗 CPU 的常见原因。
分片过多
常由大量过小分片导致。建议每个分片最多约两亿文档,或大小保持在 10–50 GB;可成为主节点的节点,每 3000 个索引至少配置 1 GB 堆。
虽然没有严格最小分片大小,太多小分片会消耗资源,因为 Elasticsearch 要维护元数据,并在全部节点管理分片状态。
可以删除空或未使用索引,删除或关闭过期及不需要的数据索引,或将小分片重新索引为数量更少、体积更大的分片。
如果分片大小合理但数量仍过多,可以采用更积极的生命周期管理策略,或删除旧索引。
覆盖了处理器分配
默认按操作系统报告的可用处理器数分配。可以通过 node.processors 覆盖,但这是高级设置,应完成负载测试后再配置。
Elastic Cloud Hosted 的 vCPU boosting 应仅用于短时突发流量,不能作为常规工作负载的基础容量。
原文:Symptom: High CPU usage。作者/维护方:Elastic 文档维护者。本文为中文翻译,代码及命令保留原文。











暂无评论内容