Redis 延迟监控

发现 Redis 中的慢服务器事件

Redis 开源版

Redis 通常用于要求苛刻的用例,它在每个实例每秒处理大量查询,同时对平均响应时间和最坏情况延迟也有严格要求。

虽然 Redis 是一个内存系统,但它会以不同的方式与操作系统交互,例如在持久化到磁盘的场景下。此外,Redis 实现了一套丰富的命令。某些命令速度快,执行时间为常数或对数时间。其他命令是较慢的 O(N) 命令,可能导致延迟峰值。

最后,Redis 是单线程的。从每个核心能够执行的工作量以及能够提供的延迟指标来看,这通常是一个优势。然而,这对延迟构成了挑战,因为单线程必须能够以不影响正在服务的其他客户端的方式,逐步执行某些任务,例如键过期。

基于所有这些原因,Redis 2.8.13 引入了一个名为延迟监控的新功能,可帮助用户检查和排除可能的延迟问题。延迟监控由以下概念性部分组成

  • 采样不同延迟敏感代码路径的延迟挂钩。
  • 按不同事件划分的延迟峰值时间序列记录。
  • 用于从时间序列中获取原始数据的报告引擎。
  • 根据测量结果提供人类可读报告和提示的分析引擎。

本文档的其余部分介绍了延迟监控子系统的详细信息。有关 Redis 和延迟的总体主题的更多信息,请参阅 Redis 延迟问题排除

事件和时间序列

不同的被监控代码路径具有不同的名称,被称为事件。例如,command 是测量可能较慢的命令执行延迟峰值的事件,而 fast-command 是监控 O(1) 和 O(log N) 命令的事件名称。其他事件不太通用,监控 Redis 执行的特定操作。例如,fork 事件仅监控 Redis 执行 fork(2) 系统调用所需的时间。

延迟峰值是指运行时间超过配置的延迟阈值的事件。每个被监控事件都有一个单独的时间序列与之关联。时间序列的工作方式如下

  • 每当发生延迟峰值时,都会将其记录到相应的时间序列中。
  • 每个时间序列由 160 个元素组成。
  • 每个元素都是一个对,由测量延迟峰值时的 Unix 时间戳以及事件执行所花费的毫秒数组成。
  • 同一事件在同一秒内发生的延迟峰值会通过取最大延迟的方式合并。即使对给定事件(低阈值下可能发生)测量到连续的延迟峰值,至少仍可提供 160 秒的历史记录。
  • 记录每个元素的历史最大延迟。

该框架监控并记录这些事件执行时间中的延迟峰值

  • command: 常规命令。
  • fast-command: O(1) 和 O(log N) 命令。
  • fork: fork(2) 系统调用。
  • rdb-unlink-temp-file: unlink(2) 系统调用。
  • aof-fsync-always: 当由 appendfsync allways 策略调用时的 fsync(2) 系统调用。
  • aof-write: 写入 AOF - 这是一个涵盖所有 write(2) 系统调用的事件。
  • aof-write-pending-fsync: 当有挂起的 fsync 时的 write(2) 系统调用。
  • aof-write-active-child: 当有活动的子进程时的 write(2) 系统调用。
  • aof-write-alone: 当没有挂起的 fsync 也没有活动的子进程时的 write(2) 系统调用。
  • aof-fstat: fstat(2) 系统调用。
  • aof-rename: 完成 BGREWRITEAOF 后重命名临时文件的 rename(2) 系统调用。
  • aof-rewrite-diff-write: 执行 BGREWRITEAOF 期间累积的差异写入。
  • active-defrag-cycle: 主动碎片整理周期。
  • expire-cycle: 过期周期。
  • eviction-cycle: 逐出周期。
  • eviction-del: 逐出周期期间的删除操作。

如何启用延迟监控

对一个用例而言的高延迟可能对另一个用例而言不是高延迟。某些应用可能要求所有查询都在不到 1 毫秒内得到服务。对于其他应用,偶尔有一小部分客户端经历 2 秒延迟可能是可以接受的。

启用延迟监控的第一步是设置一个以毫秒为单位的延迟阈值。只有耗时超过指定阈值的事件才会被记录为延迟峰值。用户应根据自身需求设置阈值。例如,如果应用要求最大可接受延迟为 100 毫秒,则应将阈值设置为记录所有阻塞服务器时间等于或大于 100 毫秒的事件。

在生产服务器运行时使用以下命令启用延迟监控

CONFIG SET latency-monitor-threshold 100

默认情况下,监控处于关闭状态(阈值设置为 0),即使延迟监控的实际成本接近于零。虽然延迟监控的内存需求非常小,但对于一个运行良好的 Redis 实例来说,没有充分的理由增加其基线内存使用。

使用 LATENCY 命令报告信息

延迟监控子系统的用户界面是 LATENCY 命令。与许多其他 Redis 命令一样,LATENCY 接受修改其行为的子命令。这些子命令包括

有关更多信息,请参阅每个子命令的文档页面。

评价此页面
回到顶部 ↑