菜单
文档breadcrumb arrow Grafana Mimirbreadcrumb arrow 配置breadcrumb arrow 响应式限流器
开源

关于 Grafana Mimir 响应式限流器

Mimir 的响应式并发限流器根据过载迹象自动调整并发限制。您可以使用响应式限流器来防止 Ingester 过载。

响应式限流器如何工作?

响应式限流器通过观察响应时间、正在处理的请求(inflight requests)和吞吐量来检测过载。

当最近的响应时间相对于长期趋势显著增加时,响应式限流器会暂时降低并发限制以避免潜在过载。同样,当正在处理的请求(inflight requests)增加与平稳或下降的吞吐量以及增加的响应时间相关联时,这表明存在过载,响应式限流器会降低并发限制。

当 Ingester 未过载时,并发限制会根据 `max-limit-factor` 增加到当前正在处理请求(inflight requests)的倍数。这为突发请求提供了缓冲空间,同时又不会太高,以便在检测到过载时可以快速降低。

当检测到 Ingester 过载时,限制会逐渐降低到任何过载资源的并发请求处理能力,然后只要过载持续存在,就会在该水平附近波动。

请求排队

由于正在处理的请求(inflight)限制最多是当前 Ingester 正在处理请求(inflight requests)的倍数,因此当 Ingester 的响应式限流器满时会发生一些请求排队。这使得可以容忍短时间的请求突发,同时仍能控制正在处理请求(inflight requests)的数量。允许的阻塞量基于 `initial-rejection-factor` 和 `max-rejection-factor`,并且请求仅在限流器满时才会排队。

请求拒绝

Ingester 支持独立的响应式限流器用于推送(push)和读取(read)请求,因为这些请求可能在不同时间被不同的资源过载。当 Ingester 负载很重时,这些限流器可能会满,当负载持续时,队列也可能填满。发生这种情况时,请求可能会被拒绝,优先拒绝读取请求而不是推送请求。

配置 Grafana Mimir 响应式限流器

要启用 Grafana Mimir Ingester 推送(push)和读取(read)响应式限流器,请设置 `-ingester.push-reactive-limiter.enabled=true` 和 `-ingester.read-reactive-limiter.enabled=true`。您可以独立启用推送和读取响应式限流器。启用其中一个不要求启用另一个。

主要配置

启用后,响应式限流器会附带一些适用于多种工作负载的默认配置。首先是短期和长期响应时间窗口的配置。这些配置跟踪最近的短期响应时间变化与长期响应时间的对比情况。

当请求由 Ingester 处理时,它们的响应时间首先在短期窗口中聚合。一旦窗口满,定期从中抽取一个分位数并添加到长期窗口。默认情况下,短期窗口的最小持续时间为 `1s`,必须观察到的最小响应数为 `50`,以及抽取聚合响应时间的分位数为 `.9`。长期窗口默认为 `60` 个测量值,这些值会随时间进行平滑。这些值可以通过 `short-window-min-duration`、`short-window-max-duration`、`short-window-min-samples`、`sample-quantile` 和 `long-window` 进行更改。

正在处理的请求(inflight)限制的默认范围为 `2` 到 `200`,初始值为 `20`。您可以通过 `min-inflight-limit`、`max-inflight-limit` 和 `initial-inflight-limit` 更改这些值。此外,正在处理的请求(inflight)限制仅增加到当前正在处理请求(inflight requests)的倍数,默认为 `5.0`。您可以通过 `max-limit-factor` 更改此值。

其他配置

虽然响应时间是检测过载的主要机制,但次要机制是跟踪正在处理的请求(inflight requests)和吞吐量之间的相关性。此相关性窗口的默认大小为 `50` 个样本,您可以通过 `correlation-window` 更改此值。

当限流器满时允许的排队量基于正在处理的请求(inflight)限制。默认情况下,当队列达到正在处理请求(inflight)限制的 `2` 倍时,请求开始被拒绝而不是排队;当队列达到正在处理请求(inflight)限制的 `3` 倍时,所有请求都被拒绝。您可以通过 `initial-rejection-factor` 和 `max-rejection-factor` 配置这些设置。

拒绝率基于最近的限流器吞吐量统计数据,默认情况下以 `1s` 为间隔为所有限流器计算。您可以通过 `-ingester.rejection-prioritizer.calibration-interval` 调整此设置。

Grafana Mimir 响应式限流器指标

Grafana Mimir Ingester 响应式限流器添加了以下指标。这些指标不属于任何 API 保证,并且随时可能更改

  • cortex_ingester_reactive_limiter_inflight_requests: Gauge 类型指标,显示响应式限流器中当前正在处理的请求数量。它包含 request_type 标签,其值为 pushread
  • cortex_ingester_reactive_limiter_inflight_limit: Gauge 类型指标,显示当前正在处理的请求(inflight)限制。它包含 request_type 标签,其值为 pushread
  • cortex_ingester_reactive_limiter_blocked_requests: Gauge 类型指标,显示当前在限流器上排队等待的请求数量。它包含 request_type 标签,其值为 pushread
  • cortex_ingester_rejection_rate: Gauge 类型指标,显示新请求被拒绝的当前速率。