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
接受修改其行为的子命令。这些子命令是
LATENCY LATEST
- 返回所有事件的最新延迟样本。LATENCY HISTORY
- 返回给定事件的延迟时间序列。LATENCY RESET
- 重置一个或多个事件的延迟时间序列数据。LATENCY GRAPH
- 呈现事件的延迟样本的 ASCII 艺术图表。LATENCY DOCTOR
- 返回人类可读的延迟分析报告。
有关更多信息,请参阅每个子命令的文档页面。