【问题标题】:Search response time doubled erratically搜索响应时间不规律地翻了一番
【发布时间】:2017-01-29 18:35:33
【问题描述】:

我们的系统最近遇到了 CPU 使用率高峰,其根本原因仍然未知。过去,我们面临着高内存使用和磁盘警报,因为我们每晚都运行批量索引工作,更新几乎所有文档。但是高 CPU 使用率并不是问题。

目前收集的数据:

节点 03(6 个数据节点和 3 个主节点)遭受高 CPU 使用率 (> 95%) 5 分钟,导致响应时间峰值为 1 秒,而平均响应时间为 40 毫秒。 查看指标,在给定的高 CPU 节点上的索引计数略有增加,同时 Young GC 也有轻微的增加(但在这两种情况下都不像峰值)。

我不排除大量索引,因为我们确实有一个 kafka 消费者随时接受批量索引数据,但这控制在每秒最多 250 个文档的速度下,每个批量之间的延迟时间为 250 毫秒打电话。

此外,热线程端点确实提供了一些数据,虽然我还不能破译它。

Hot threads

更新

更新了问题标题,因为之前的观察结果是错误的。主要问题是响应时间加倍,并且 CPU 使用率不高,因为一段时间后使用率趋于稳定。

已经有了一些发展。峰值后,CPU使用率逐渐下降,属于正常现象。 但是,我们的响应时间始终保持在 100-250 毫秒之间(通常的平均值 - 35-100 毫秒)。

目前的响应中有一个接近锯齿形(不完全是一个均匀的锯齿形)模式。

此外,当峰值发生时,旧 GC 计数有一个小波动。

在节点统计中没有发现任何异常。找到后会更新。仍在发帖等待调查。

node stats

同时发布最近的热点话题-

hot_thread_2

【问题讨论】:

  • 如果您有权访问日志,请检查您在 CPU 峰值期间运行的查询类型。排序结果是 CPU 密集型的。您可能正在运行返回大量结果的查询。只是猜测......
  • @jay 我们有一个带有硬编码结果大小值的业务逻辑设置。还检查了日志是否有任何异常。找不到任何东西。
  • 所有热门话题都与搜索相关。你在高峰期有没有把热线程转储?您的查询有任何变化吗?聚合?如果您在这些服务器上进行了任何监控设置,您能否检查节点 03 在峰值时是否正在经历大量合并?
  • @jay 在高峰期间没有发生大量搜索查询。正如您在更新后的问题中看到的那样,我最关心的是响应时间增加了,这是平时的两倍。

标签: performance search elasticsearch


【解决方案1】:

Node 03 显然似乎经历了繁重的索引。

                "bulk": {
                "threads": 8,
                "queue": 0,
                "active": 0,
                "rejected": 0,
                "largest": 8,
                "completed": 9528532

我比较了节点 04 和节点 03 的统计数据。我在 03 上注意到的其他一些事情。

  • 4144165 文档但 256087749 (index_total) 索引请求?
  • 只有节点 03 有 41 个 open_contexts。因此,在您获取此统计信息时,它有 41 个搜索请求。其他所有节点均为 0。
  • 与其他节点相比,节点 03 和节点 01 的合并次数非常多。

您是否有任何将特定文档发送到特定节点的路由逻辑?或者这些节点可能包含更新更频繁的索引?

当您看到峰值时,您或您的应用程序是否有机会对节点 03 上的索引进行优化?查看节点统计信息,03 是唯一具有“已完成”优化的节点

"optimize": {
                "threads": 1,
                "queue": 0,
                "active": 0,
                "rejected": 0,
                "largest": 1,
                "completed": 1
            },

另外,你的 refresh_interval 是多少? ES 中的默认值为 1 秒。这可能会在批量索引时触发大量合并。

【讨论】:

  • 索引请求数量的增加可能是因为我们有一个半夜的工作来更新几乎所有的文档。此外,我们目前没有路由搜索请求的逻辑。目前,我们将所有搜索请求发送到前 3 个节点。此外,我们的批量索引主要在午夜运行,如果搜索响应在此期间上升,我们也可以。当前 refresh_interval 设置为 1 秒。
  • 关于路由问题。我怀疑只有 1 个节点会接收所有搜索请求。虽然我们没有适当的路由逻辑,但我们的应用服务器会根据可用性向节点发送请求。即便如此,我们也没有那么多的搜索请求会占用任何单个节点。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2016-02-02
相关资源
最近更新 更多