Valkey 经常用于高要求的使用场景,在这些场景中,每个实例每秒处理大量查询,同时对平均响应时间和最坏情况延迟也有严格要求。
尽管 Valkey 是一个内存系统,但它以不同方式与操作系统交互,例如在持久化到磁盘时。此外,Valkey 实现了丰富的命令集。某些命令速度快,以常数时间或对数时间运行。其他命令是较慢的 O(N) 命令,可能导致延迟峰值。
最后,Valkey 是单线程的。从每个核心可执行的工作量以及它能提供的延迟数据来看,这通常是一个优势。然而,它对延迟提出了挑战,因为单线程必须能够增量地执行某些任务,例如键过期,并且不影响正在服务的其他客户端。
由于所有这些原因,存在一个名为 延迟监控 的功能,它帮助用户检查和排除可能的延迟问题。延迟监控由以下概念部分组成
- 对不同延迟敏感的代码路径进行采样的延迟挂钩。
- 按不同事件划分的延迟峰值时间序列记录。
- 从时间序列中获取原始数据的报告引擎。
- 根据测量结果提供人类可读报告和提示的分析引擎。
本文档的其余部分涵盖了延迟监控子系统的详细信息。有关 Valkey 和延迟的常见主题的更多信息,请参阅 Valkey 延迟问题故障排除。
事件和时间序列
不同的被监控代码路径有不同的名称,被称为 事件。例如,`command` 是一个用于测量可能较慢的命令执行延迟峰值的事件,而 `fast-command` 是用于监控 O(1) 和 O(log N) 命令的事件名称。其他事件则不那么通用,它们监控 Valkey 执行的特定操作。例如,`fork` 事件只监控 Valkey 执行 `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),即使延迟监控的实际开销接近于零。虽然延迟监控的内存需求非常小,但没有充分理由增加一个运行良好的 Valkey 实例的基线内存使用量。
使用 LATENCY 命令报告信息
延迟监控子系统的用户界面是 `LATENCY` 命令。与许多其他 Valkey 命令一样,`LATENCY` 接受子命令来修改其行为。这些子命令是
- `LATENCY LATEST` - 返回所有事件的最新延迟样本。
- `LATENCY HISTORY` - 返回给定事件的延迟时间序列。
- `LATENCY RESET` - 重置一个或多个事件的延迟时间序列数据。
- `LATENCY GRAPH` - 渲染事件延迟样本的 ASCII 艺术图。
- `LATENCY DOCTOR` - 回复人类可读的延迟分析报告。
有关更多信息,请参阅每个子命令的文档页面。