Elasticsearch 7.10 慢查询日志开启后如何分析具体耗时阶段?

文章导读
开启 Elasticsearch 7.10 慢查询日志后,直接查看集群日志目录下的 index_search_slowlog.log 文件,重点关注 total_time、query_time 和 fetch_time 字段来定位耗时阶段。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

开启 Elasticsearch 7.10 慢查询日志后,直接查看集群日志目录下的 index_search_slowlog.log 文件,重点关注 total_time、query_time 和 fetch_time 字段来定位耗时阶段。

先说结论:慢查询日志通过记录超过阈值的搜索请求及其内部阶段耗时,帮助定位是查询构建还是数据获取阶段慢。

  • 先定位:确认慢查询阈值配置已生效,找到对应的日志文件路径。
  • 先做:执行触发慢查询的业务请求,生成日志记录。
  • 再验证:对比日志中的 query 和 fetch 耗时占比,确定优化方向。

命令速用版

通过 PUT 请求动态开启指定索引的慢查询日志阈值,无需重启节点。

PUT /your_index_name/_settings
{
  "index.search.slowlog.threshold.query.warn": "10s",
  "index.search.slowlog.threshold.query.info": "5s",
  "index.search.slowlog.threshold.fetch.warn": "1s",
  "index.search.slowlog.source": "1000"
}

为什么会这样

Elasticsearch 将搜索请求处理分为查询(query)和获取(fetch)两个主要阶段,慢查询日志会分别记录这两个阶段的耗时。

当请求总耗时或阶段耗时超过设定的阈值(threshold)时,ES 会将请求详情写入独立的日志文件。query 阶段耗时主要反映倒排索引匹配速度,fetch 阶段耗时主要反映从磁盘加载源文档(_source)或字段数据的速度。分析这两个时间的比例,可以判断是查询语句复杂度高还是数据读取 IO 瓶颈。

分步处理

步骤 1:确认日志配置与路径

检查 elasticsearch.yml 配置文件,确认 slowlog 的日志级别和输出路径。默认情况下,日志文件位于 ES 安装目录的 logs 文件夹下,命名格式通常为<集群名>_index_search_slowlog.log。

步骤 2:调整阈值触发日志

如果当前没有日志生成,说明请求耗时未超过默认阈值。使用上述“命令速用版”中的 API 将阈值调低(例如从 10s 调至 1s),强制让当前业务请求落入慢查询范围。

步骤 3:解析日志耗时字段

打开慢查询日志文件,查找最近生成的条目。每条日志包含 total_time(总耗时)、query_time(查询阶段耗时)和 fetch_time(获取阶段耗时)。

示例日志片段:

[2023-10-27T10:00:00,000][WARN ][index.search.slowlog.query] [node-1] [your_index_name] took[12.5ms], took_millis[12], total_hits[100], types[], stats[], search_type[QUERY_THEN_FETCH], total_shards[5], source[{"query": {...}}], id[], 

注意不同版本的日志格式可能略有差异,但耗时字段 key 通常保持一致。

Elasticsearch 7.10 慢查询日志开启后如何分析具体耗时阶段?

怎么验证是否生效

执行一次已知耗时的搜索请求,然后立即查看慢查询日志文件的最后修改时间和内容。

如果日志文件中出现了新的记录,且记录中的 source 字段与你发出的请求一致,说明配置生效。检查记录中的 took 值是否与你客户端接收到的耗时大致吻合。

常见坑

日志本身影响性能

开启慢查询日志会增加磁盘 IO 和 CPU 开销。公开资料中没有看到可靠的量化数据说明具体损耗比例,但在高并发场景下,过低的阈值会导致日志量激增,建议仅在排查问题时临时调低阈值。

日志轮转丢失数据

如果慢查询日志文件配置了轮转策略(logrotate),高频慢查询可能导致日志被快速覆盖。排查期间建议暂时关闭日志轮转或增大文件保留大小。

阈值设置过低

将阈值设置为 0 或极小值会导致所有请求都被记录,这可能填满磁盘空间。生产环境建议仅在测试复现问题时临时使用低阈值。

常见问题

慢查询日志文件在哪里?

默认位于 Elasticsearch 安装目录的 logs 子目录下,文件名包含 index_search_slowlog 字样。

开启慢查询日志会影响集群性能吗?

会消耗额外的磁盘 IO 和 CPU 资源,建议排查结束后调高阈值或关闭记录。

如何关闭慢查询日志?

将索引设置中的 slowlog 阈值恢复为 null 或极高值即可停止记录。

参考来源

Elasticsearch Reference 7.10, Search Slow Log, https://www.elastic.co/guide/en/elasticsearch/reference/7.10/search-slow-log.html