为什么在elasticsearch慢查询中took_millis和超时之间有很多时间成本

Why there is much time cost between took_millis and timeout in elasticsearch slow query

我在生产环境中遇到了一些慢查询,我配置了慢日志来查找一些慢查询信息,比如这样(query_string 超时 500 毫秒):

[2021-06-21T10:43:33,930][DEBUG][index.search.slowlog.query.xxxx] [xxx][g][2] took[1s], took_millis[1043], total_hits[424690], types[top], stats[], search_typ      e[QUERY_THEN_FETCH], total_shards[6], source[{query_string}]

本例查询超时为500ms,响应took_millis为1043ms。 据我所知,超时仅对查询解析有用,取值代表 es 中的执行时间,没有一些外部阶段,如 Query timing: ‘took’ value and what I’m measuring。我有两个问题:

非常感谢!

为查询设置超时并不能确保查询在其执行时间超过该超时时实际上被取消。 Elasticsearch 文档指出:

"By default, a running search only checks if it is cancelled or not on segment boundaries, therefore the cancellation can be delayed by large segments."

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search.html#global-search-timeout

检查问题3627, 4586 and 2929

这可以解释超时和took_millis之间的504毫秒,你的查询就花了这么长时间,并没有及时取消。

要分析查询执行并查看可能导致这些长时间延迟的原因,您可以使用 profile API 重新运行查询。请注意,如果您的查询执行缓慢无法重现,这将无法帮助您解决问题。如果您的查询大部分时间都运行良好,请尝试将这些慢速 运行 查询与服务器负载等外部因素相关联。