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) 命令。
  • forkfork(2) 系统调用。
  • rdb-unlink-temp-fileunlink(2) 系统调用。
  • aof-fsync-alwaysappendfsync 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-fstatfstat(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 接受修改其行为的子命令。这些子命令是

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

RATE THIS PAGE
Back to top ↑