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