学习

可以通过 redis-cli 查看几个 Redis 指标。

Redis INFO 命令#

运行 INFO 命令可在单个视图中提供许多可用指标。

127.0.0.1:6379> INFO
# Server
redis_version:6.0.1
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:e02d1d807e41d65
redis_mode:standalone
os:Linux 4.19.121-linuxkit x86_64

有几个部分可以单独获取。例如,如果您只想获取 CLIENTS 部分,可以将该部分作为参数传递给 INFO 命令。

127.0.0.1:6379> INFO CLIENTS
# Clients
connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0

部分#

Server:当前的 Redis 服务器信息。

值得注意的指标

  • redis_version
  • process_id
  • config_file
  • uptime_in_seconds
  • uptime_in_days

Clients:关于连接客户端或失败连接的可用数据。

值得注意的指标

  • connected_clients
  • blocked_clients

Memory:内存使用情况和统计信息

值得注意的指标

  • used_memory
  • mem_fragmentation_ratio

Persistence:RDB 或 AOF 指标

值得注意的指标

  • rdb_last_save_time
  • rdb_changes_since_last_save
  • aof_rewrite_in_progress

Stats:一些常规统计信息

值得注意的指标

  • keyspace_hits
  • keyspace_misses
  • expired_keys
  • evicted_keys
  • instantaneous_ops_per_sec

Replication:复制数据,包括主/副本标识符和偏移量

值得注意的指标

  • master_link_down_since
  • connected_slaves
  • master_last_io_seconds_ago

CPU:计算消耗统计信息

值得注意的指标

  • used_cpu_sys
  • used_cpu_user

Modules:来自任何已加载模块的数据

值得注意的指标(每个模块)

  • ver
  • options

Cluster:集群是否已启用

值得注意的指标

  • cluster_enabled

Keyspace:键和过期数据

值得注意的指标(每个数据库)

  • keys
  • expires
  • avg_ttl

输出可以从结果中读取或通过管道输送到文件。

127.0.0.1:6379> redis-cli INFO STATS > redis-info-stats

这可以按时间间隔进行,并由本地或第三方监控服务消费。

INFO 返回的一些数据是静态的。例如,Redis 版本在更新之前不会改变。其他数据是动态的,例如 keyspace_hits ÷ keyspace_misses。后者可以用于计算命中率,并作为长期指标进行观察。复制部分的字段 master_link_down_since 可以作为触发警报的指标。

一些针对给定指标可能设置的警报示例

指标

警报示例

uptime_in_seconds

< 300 秒:确保服务器保持运行

connected_clients

< 预期的最小应用连接数

master_link_down_since

> 30 秒:复制应该正常运行

rdb_last_save_time

> 最大可接受的快照间隔

注意

这并非穷尽列表,仅用于说明 INFO 中的指标如何使用。

通过 redis-cli 选项获取延迟和统计数据#

redis-cli 客户端有一些内置选项,允许您拉取一些实时延迟和统计数据。

注意

这些并非 Redis 命令,而是 redis-cli 中的选项。

延迟选项

持续采样延迟

$ redis-cli --latency
min: 1, max: 17, avg: 4.03 (927 samples)

可以添加 rawcsv 输出标志

$ redis-cli --latency --csv
1,4,1.94,78

为了采样超过一秒钟,可以使用 latency-history,其默认间隔为 15 秒,但可以使用 -i 参数指定。

$ redis-cli --latency-history -i 60
min: 1, max: 30, avg: 4.84 (328 samples)

这也可以与 csvraw 输出格式标志结合使用。

$ redis-cli --latency-history -i 60 --csv
13,13,13.00,1
5,13,9.00,2
3,13,7.00,3
3,13,6.00,4
3,13,5.60,5
2,13,5.00,6
2,13,5.43,7
2,13,5.62,8
2,13,5.22,9
2,13,5.00,10
1,13,4.64,11

两者都可以通过管道输送到文件。

latency-dist 选项以频谱形式显示延迟。默认间隔为一秒,但可以使用 -i 参数更改。

统计选项

使用 stat  标志获取服务器的滚动统计信息。

$ redis-cli --stat
------- data ------ --------------------- load -------------------- - child -
keys       mem      clients blocked requests            connections
4          9.98M    51      0       8168035 (+0)        4132
4          9.98M    51      0       8181542 (+13507)    4132
4          9.98M    51      0       8196100 (+14558)    4132
4          9.98M    51      0       8209794 (+13694)    4132
4          9.98M    51      0       8223420 (+13626)    4132
4          9.98M    51      0       8236624 (+13204)    4132
4          9.98M    51      0       8251376 (+14752)    4132
4          9.98M    51      0       8263417 (+12041)    4182
4          9.98M    51      0       8276781 (+13364)    4182
4          9.90M    51      0       8289693 (+12912)    4182

内存统计信息#

Redis 包含一个 MEMORY 命令,其中包括一个子命令来获取统计信息。

127.0.0.1:6379> memory stats
 1) "peak.allocated"
 2) (integer) 11912984
 3) "total.allocated"
 4) (integer) 8379168
 5) "startup.allocated"
 6) (integer) 5292168
 7) "replication.backlog"
 8) (integer) 0
 9) "clients.slaves"
10) (integer) 0
11) "clients.normal"
12) (integer) 16986
13) "aof.buffer"
14) (integer) 0

这些值在 INFO MEMORY 命令中也可用,但在此处它们以典型的 Redis RESP 数组回复返回。

还有一个 LATENCY DOCTOR 子命令,包含当前内存指标的分析报告。

延迟监控#

我们知道 Redis 速度很快,因此经常用于对低延迟要求极高的场景。Redis 有一个称为延迟监控的功能,允许您深入研究可能的延迟问题。延迟监控由以下概念部分组成

  • 对不同延迟敏感代码路径进行采样的延迟钩子。
  • 按不同事件分割的延迟峰值时间序列记录。
  • 一个从时间序列获取原始数据的报告引擎。
  • 一个根据测量结果提供可读报告和提示的分析引擎。

默认情况下此功能是禁用的,因为大多数情况下不需要它。为了启用它,您可以在 Redis 配置中更新您想要监控的阈值时间(以毫秒为单位)。超过阈值的事件将记录为延迟峰值。如果要求识别所有阻塞服务器时间超过 10 毫秒的事件,则应相应设置阈值配置。

latency-monitor-threshold 10

如果调试会话 intended 是临时的,可以通过 redis-cli 设置阈值。

127.0.0.1:6379> CONFIG SET latency-monitor-threshold 10

要禁用延迟框架,应将阈值设置回 0。

127.0.0.1:6379> CONFIG SET latency-monitor-threshold 0

延迟数据可以使用 LATENCY 命令及其子命令查看

  • LATENCY LATEST - 所有事件的最新样本
  • LATENCY HISTORY - 给定事件的最新时间序列
  • LATENCY RESET - 重置时间序列数据
  • LATENCY GRAPH  - 渲染 ASCII 艺术图
  • LATENCY DOCTOR - 分析报告

为了利用这些命令,您需要熟悉延迟监控框架正在跟踪的不同事件。(摘自https://redis.ac.cn/topics/latency-monitor")

指标

警报示例

命令

常规命令

快速命令

O(1)O(log N) 命令

fork

fork(2) 系统调用

comrdb-unlink-temp-file

unlink(2) 系统调用

aof-write

写入 AOF - 一个包罗万象的事件 fsync(2) 系统调用

aof-fsync-always

当由 appendfsync always 策略调用时,fsync(2) 系统调用

aof-write-pending-fsync

当存在待写入操作时,fsync(2) 系统调用

aof-write-active-child

由子进程执行的 fsync(2) 系统调用

aof-write-alone

由主进程执行的 fsync(2) 系统调用

aof-fstat

fstat(2) 系统调用

aof-rename

完成 BGREWRITEAOF 后重命名临时文件的 rename(2) 系统调用

aof-rewrite-diff-write

写入执行 BGREWRITEAOF 期间累积的差异

active-defrag-cycle

主动碎片整理周期

expire-cycle

过期周期

eviction-cycle

逐出周期

eviction-del

逐出周期期间的删除

例如,您可以使用 LATENCY LATEST 子命令,您可能会看到如下数据:

127.0.0.1:6379> latency latest
1) 1) "command"
   2) (integer) 1616372606
   3) (integer) 600
   4) (integer) 600
2) 1) "fast-command"
   2) (integer) 1616372434
   3) (integer) 12
   4) (integer) 12

此命令的结果提供此事件的时间戳、延迟和最大延迟。利用上面的事件表,我可以看到常规命令出现了延迟峰值,最新延迟和最大延迟为 600 毫秒,而 O(1) 或 O(log N) 命令出现了 12 毫秒的延迟峰值。

某些延迟命令需要传递特定的事件。

127.0.0.1:6379> latency graph command
command - high 600 ms, low 100 ms (all time high 600 ms)
--------------------------------------------------------------------------------
    _##
   o|||
  o||||
_#|||||

3222184
05308ss
sssss

虽然启用延迟监控的成本几乎为零,并且内存需求非常小,但它会提高您的基本内存使用量,因此如果您从 Redis 中获得了所需的性能,则无需保持此功能启用状态。

监控工具#

有许多开源监控工具和服务可以可视化您的 Redis 指标 - 其中一些还提供了警报功能。

其中一个例子是 Redis Data Source for Grafana。它是 Grafana 插件,允许用户连接到 Redis 数据库并构建仪表盘以轻松观察 Redis 数据。它提供了一个开箱即用的预定义仪表盘,但也允许您构建根据您的特定需求调整的自定义仪表盘。

$ redis-cli --latency
min: 1, max: 17, avg: 4.03 (927 samples)