JJava 知识库
JAVA INTERVIEW

高频面试题

ES高级约 2 分钟

ES 查询 P99 突然从 200ms 涨到 3 秒,你会从查询、分片、GC 和磁盘哪些方面排查?

参考回答约 2 分钟 · 口语表达
我的判断

ES P99 暴涨要按查询协调、分片执行、JVM 与磁盘逐层拆,先找是所有请求慢还是某类查询、某个节点或某个分片慢。

我会从慢日志和 APM 找到具体 query、索引、参数与命中分片,比较 took、并发和扫描范围。查询侧重点看深分页、高基数聚合、脚本、wildcard、返回字段过大,以及是否一次打了太多分片。用 profile 只对代表性查询低流量分析,不能全量开启。

节点侧看 search thread pool queue/reject、CPU、heap、GC、磁盘延迟、page cache 和 segment 数。若只有一个节点慢,查 shard 倾斜、热点或磁盘;全节点 GC 抖动,可能是大聚合、fielddata 或堆压力;磁盘 await 高则继续查 merge、recovery 和快照任务。

止损会限制问题查询、缩小时间范围、暂停离线聚合,必要时取消长查询。修复可能是改 mapping/query、减少分片、预聚合、增加 doc values 合理字段或调整数据布局。

验证时比较 P99、查询队列、拒绝、GC、磁盘和每请求涉及分片数,不能只看平均 took。

思路拆解问题分析

ES 查询是 scatter-gather:协调节点把请求发到多个分片,再合并结果。最慢分片决定尾延迟,所以排查必须下钻到节点和分片,集群平均值很容易掩盖问题。