开启 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 通常保持一致。
怎么验证是否生效
执行一次已知耗时的搜索请求,然后立即查看慢查询日志文件的最后修改时间和内容。
如果日志文件中出现了新的记录,且记录中的 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