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 个元素组成。
- 每个元素都是一个对,由测量延迟峰值时的时间戳和事件执行所花费的毫秒数组成。
- 在同一秒内发生的同一事件的延迟峰值通过取最大延迟合并。即使为给定事件测量到连续的延迟峰值(这可能发生在较低阈值的情况下),至少有 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
- 以人类可读的延迟分析报告进行回复。
有关更多信息,请参阅每个子命令的文档页面。