学习

可以通过 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

部分#

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

值得注意的指标

  • redis_version
  • process_id
  • config_file
  • uptime_in_seconds
  • uptime_in_days

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

值得注意的指标

  • connected_clients
  • blocked_clients

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

值得注意的指标

  • used_memory
  • mem_fragmentation_ratio

持久性: RDB 或 AOF 指标

值得注意的指标

  • rdb_last_save_time
  • rdb_changes_since_last_save
  • aof_rewrite_in_progress

统计信息: 一些常规统计信息

值得注意的指标

  • keyspace_hits
  • keyspace_misses
  • expired_keys
  • evicted_keys
  • instantaneous_ops_per_sec

复制: 包括主/从标识符和偏移量的复制数据

值得注意的指标

  • master_link_down_since
  • connected_slaves
  • master_last_io_seconds_ago

CPU: 计算消耗统计信息

值得注意的指标

  • used_cpu_sys
  • used_cpu_user

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

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

  • ver
  • options

集群: 是否启用集群

值得注意的指标

  • cluster_enabled

键空间: 键和过期数据

值得注意的指标(每个 db)

  • 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)

可以添加 raw 或 csv 输出标志

$ 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)

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

$ 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

如果调试会话是临时的,可以通过 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

the fork(2) 系统调用

comrdb-unlink-temp-file

the unlink(2) 系统调用

aof-write

写入 AOF - 一个包含所有事件的事件 fsync(2) 系统调用

aof-fsync-always

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

aof-write-pending-fsync

the fsync(2) 系统调用,当有待处理的写入时

aof-write-active-child

the fsync(2) 系统调用,当由子进程执行时

aof-write-alone

the fsync(2) 系统调用,当由主进程执行时

aof-fstat

the fstat(2) 系统调用

aof-rename

the rename(2) 系统调用,用于在完成 BGREWRITEAOF 后重命名临时文件

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 指标,其中一些还提供警报功能。

一个例子是 Grafana 的 Redis 数据源。它是一个 Grafana 插件,允许用户连接到 Redis 数据库并构建仪表板,以便轻松观察 Redis 数据。它提供了一个开箱即用的预定义仪表板,但也允许您构建针对您的特定需求定制的仪表板。

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