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 always
策略调用时,执行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
- 回复一个人类可读的延迟分析报告。
请参考每个子命令的文档页面以获取更多信息。