Redis监控步骤get!Google精髓的四大法则直接掌握

Redis也是对外服务,所以Google四个黄金指标同样适用,还从延迟、流量、错误、饱和度分析Redis关键指标。

1 延迟

选择Redis是想得到更快响应速度和更高吞吐量,所以延迟数据对使用Redis的应用程序至关重要。

1.1 如何监控延迟

① 客户端应用程序埋点

Java程序调用Redis时,计算各命令花费多久,然后把耗时数据推给监控系统。

灵活,想按什么维度统计就按啥

缺点:代码侵入性,和客户端埋点监控MySQL的原理一样。

② redis-cli的–latency

客户端连上 redis-server,然后不断发 ping 命令,统计耗时。我在远端机器对某 redis-server 做探测,看探测结果:

javaedge@JavaEdgedeMac-mini ~ % redis-cli --latency -h x.x.x.x -p 6379
min: 5, max: 187, avg: 8.19 (469 samples)^C
javaedge@JavaEdgedeMac-mini ~ %

跑到 localhost 机器对本机的 redis-server 做探测:

javaedge@JavaEdgedeMac-mini ~ % redis-cli --latency -h localhost -p 6379
min: 0, max: 12, avg: 0.23 (1505 samples)^C
javaedge@JavaEdgedeMac-mini ~ %

远端机器平均延迟是 8.19 ms,本地探测平均延迟是 0.23 ms,相差巨大,时间主要花在网络 I/O,Redis本身执行效率是很高的。

只使用 ping 对 redis-server 探测,怎能反映真实工作负载?

是不是ping命令执行很快,而应用发起的真实请求其实很慢?

Redis 是单线程顺序执行,若某请求执行得慢,其他所有客户端都得等,所以 ping 对 redis-server 探测,理论上探测结果就能反映 redis-server 真实情况。

若发现Redis变慢,咋找那些执行慢的命令?

slowlog,先定义执行时间超过多久算慢,Redis默认配置10ms,比如调成5ms。

javaedge@JavaEdgedeMac-mini redis % grep slower redis.conf  
# In many cases the disk is slower than the network, and storing and loading
slowlog-log-slower-than 10000

javaedge@JavaEdgedeMac-mini redis % redis-cli
127.0.0.1:6379> config set slowlog-log-slower-than 5000
OK
127.0.0.1:6379> get slowlog-log-slower-than
(nil)
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "5000"
127.0.0.1:6379> config rewrite
OK
127.0.0.1:6379> quit
javaedge@JavaEdgedeMac-mini redis %  grep slower redis.conf
slowlog-log-slower-than 5000

之后一些执行时间超过5ms的命令就会被记录,然后 slowlog get [count] 查看 count 出的slowlog条数。

# 获取 2 条作为示例
127.0.0.1:6379> SLOWLOG get 2
# 序号
1) 1) (integer) 47
	 # 时间戳
   2) (integer) 1668743666
   # 执行时间(单位是微秒)
   3) (integer) 13168
   # 命令及其参数
   4) 1) "hset"
      2) "/idents/Default"
      3) "tt-fc-dev01.nj"
      4) "1668743666"
   # 客户端IP和端口   
   5) "127.0.0.1:43172"
   6) ""
2) 1) (integer) 46
   2) (integer) 1668646906
   3) (integer) 13873
   4) 1) "hset"
      2) "/idents/Default"
      3) "10.206.16.3"
      4) "1668646906"
   5) "127.0.0.1:44612"
   6) ""

2 流量

Redis每秒处理多少请求,每秒接收、返回多少字节,在Redis都内置相关指标,通过 redis-cli 连上Redis,执行 info all 。绝大部分监控系统都是从 info 返回内容提取的指标。

javaedge@JavaEdgedeMac-mini ~ % redis-cli -h 127.0.0.1 -p 6379 info all | grep instantaneous
# 每秒执行多少次操作
instantaneous_ops_per_sec:0
# 每秒接收多少 KiB
instantaneous_input_kbps:0.00
# 每秒返回多少 KiB
instantaneous_output_kbps:0.00
instantaneous_input_repl_kbps:0.00
instantaneous_output_repl_kbps:0.00
javaedge@JavaEdgedeMac-mini ~ %

一般一个 Redis 实例每s处理几w个请求都正常。

每s处理的操作如较恒定,则很健康。如发现 ops_per_sec 变少,注意可能:

  • 某耗时操作导致命令阻塞

  • 客户端出问题,不发请求过来了

若把 Redis 做缓存,还需关注指标:

javaedge@JavaEdgedeMac-mini ~ % redis-cli -h 127.0.0.1 -p 6379 info all | grep keyspace
keyspace_hits:0
keyspace_misses:1

都 Counter 型,即 Redis 实例启动以来统计的所有命中的数量和未命中数量。如统计总体命中率,使用 hits 除以总量。

hit rate = keyspace_hits / (keyspace_hits + keyspace_misses)

近期命中率,如最近10min,通过 PromQL increase 函数做二次运算:

increase(keyspace_hits[10m])
/
(increase(keyspace_hits[10m]) + increase(keyspace_misses[10m]))

命中率低于 0.8 就要注意可能:

  • 内存不够用,很多 Key 被清了
  • 数据没及时填充或过期了

较低命中率影响应用程序延迟,因为通常当应用程序无法从 Redis 获取缓存数据时,就要穿透到更慢的存储介质取数。

3 错误

Redis响应客户端请求时,只是操作内存,依赖较少,异常概率很小。如客户端操作 Redis 返回错误,大概率网络问题或命令写错。最好做客户端埋点监控,自己发现自己解决。

Redis 对客户端数量限制默认10w,如超过,rejected_connections 指标+1。和MySQL不同,Redis应该很少遇到超过最大连接数(maxclients) 。

4 饱和度

Redis重度使用内存,内存的使用率、碎片率及因为内存不够用而清理的Key数量都需关注。 info memory 查看:

# Memory
used_memory:26276368
used_memory_human:25.06M
used_memory_rss:39575552
used_memory_rss_human:37.74M
used_memory_peak:33979824
used_memory_peak_human:32.41M
...
maxmemory:0
maxmemory_human:0B
...
mem_fragmentation_ratio:1.51
...

used_memory 顾名思义就是使用了多少内存,是从 Redis 自身视角来看的,human后缀表示人类易读方式来展示结果。

used_memory_rss:从os视角看分配多少内存给Redis

used_memory_rss 除以 used_memory 就是内存碎片率(mem_fragmentation_ratio):

used_memory_rss(39575552) / used_memory(26276368) = mem_fragmentation_ratio(1.51)

碎片化率较高说明 used_memory_rss 相对大,used_memory 相对小,即OS给Redis分配很多内存,但Redis利用不好。OS分配内存时因为有分配单位(如8byte、16byte、32byte、64byte)限制,如Redis申请222个字节,os直接分配256个字节,就会产生内存碎片,但这种内存碎片不多,要不然OS会浪费很多内存,所以多给一些内存正常,即 mem_fragmentation_ratio稍大于1没问题。

若执行 Flushdb,会让Redis把数据删掉,而Redis不会立马把这部分内存归还给OS,碎片化率指标就会巨高,此时推荐重启Redis。毕竟,都已Flushdb,说明 Redis 里已无数据。

随应用程序不断删除、修改Redis数据,内存碎片化率也会上升,mem_fragmentation_ratio>1.5,就说明碎片率太高,需重启 Redis或命令Redis清理碎片:

CONFIG SET activedefrag yes

搞得很紧张啊,这大可不必,就像这例,RSS才占37M,Redis实际使用25M,碎片12M,很小啊,虽 mem_fragmentation_ratio已1.51 ,但无需处理。used_memory_peak 32.41M,说明曾经用到过这么多,后来有些 Key 过期或删除/修改,才导致碎片率高点。

何时需处理碎片?

  • 机器内存不够用
  • 碎片化内存浪费太多
  • 且碎片化率很高时

才需处理。调整如下参数控制碎片处理过程。

# 开启自动内存碎片整理(总开关)
activedefrag yes
# 当碎片达到 100mb 时,开启内存碎片整理
active-defrag-ignore-bytes 100mb
# 当碎片超过 10% 时,开启内存碎片整理
active-defrag-threshold-lower 10
# 内存碎片超过 100%,则尽最大努力整理
active-defrag-threshold-upper 100
# 内存自动整理占用资源最小百分比
active-defrag-cycle-min 25
# 内存自动整理占用资源最大百分比
active-defrag-cycle-max 75

上面讨论 mem_fragmentation_ratio 过大case,实际上这值还可能小于1,表示Redis使用了超过RSS数量的内存,说明此时部分内存已被放到交换分区,而磁盘性能相比内存差了约5个数量级,所以出现这种情况严重影响性能。

饱和度的度量还有指标evicted_keys:当内存占用超maxmemory时,Redis清理的Key的数量。内存达maxmemory时的处理策略可配置,默认noeviction。

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

这些指标出问题,上游服务大概率受影响,还有一些指标虽然短期不会影响上游服务,但是如果不及时处理未来也会出现大麻烦,这类指标通常用于衡量Redis内部的一些运行状况,如:

  • 持久化相关指标:rdb_changes_since_last_save 自从上次落盘以来又有多少次变更
  • 主从相关指标:master_link_down_since_seconds 主从连接已断开的时长

5 采集配置

Categraf 也提供 Redis 采集插件,配置样例在 conf/input.redis/redis.toml

[[instances]]

# 最核心配置,即Redis的连接地址
# address = "127.0.0.1:6379"

# 认证信息,username 字段低版本的 Redis 是不需要的,6.0以上版本并且启用了ACL的才需要。
# username = ""
# password = ""
# pool_size = 2

# # Optional. Specify redis commands to retrieve values
# 自定义一些命令来获取指标,类似MySQL采集器的queries ,适用于业务指标采集的场景
# commands = [
#     {command = ["get", "sample-key1"], metric = "custom_metric_name1"},
#     {command = ["get", "sample-key2"], metric = "custom_metric_name2"}
# ]

# 通用配置,所有的 Categraf 的采集器,都支持在 `[[instances]]` 下面自定义标签
# labels = { instance="n9e-dev-redis" }

个人习惯机器名过滤,便于把 Redis 指标和 Redis 所在机器的指标放到一张大盘。 仪表盘样例:

Redis 监控的原理、采集方法、仪表盘相关的知识就讲解完了,下面我们做一个总结。

6 总结

Redis也是对外服务,所以还 Google四个黄金指标的法则来梳理指标。

  • 延迟方面使用 redis-cli --latency 探测,不过采集器一般不会直接调用这命令行工具,而是采集时先 ping 获取延迟。

  • 流量,关注每s处理多少command,每秒收到多少网络流量,返回多少网络流量
  • Redis只是操作内存,基本遇不到错误,可使用客户端埋点采集网络、命令错误
  • 饱和度方面,则重点关注内存饱和度,尤其内存碎片率,<1不行,太大也不好

7 FAQ

Redis监控关键指标和告警规则可根据具体业务需求而变化,以下是一些常见的Redis告警规则PromQL表达式:

  1. 监控Redis内存使用情况:当连续3次采集到的Redis使用的内存超过阈值时,发出告警。

    ALARM: expr: REDIS_MEMORY_USAGE > $REDIS_THRESHOLD_FOR_MEMORY_USAGE
    FOR: 3m
    ANOMALY_DETECTION_CONFIG:
     pattern: 7/10 sudden increase
     lowerBound: 0
     upperBound: 2
    
  2. 监控Redis连接数:当Redis客户端连接数超过阈值时触发告警。

    redisconnectedclients > $REDIS_CLIENTS_MAX_ALERT_VALUE
    
  3. 监控Redis响应时间:如果Redis响应时间超过设定值,则触发告警。

    redis_latency_milliseconds > $REDIS_LATENCY_THRESHOLD_VALUE
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/16330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之深入解析如何实现一个线程池

一、基础概念 当进行并行的任务作业操作时&#xff0c;线程的建立与销毁的开销是&#xff0c;阻碍性能进步的关键&#xff0c;因此线程池&#xff0c;由此产生。使用多个线程&#xff0c;无限制循环等待队列&#xff0c;进行计算和操作&#xff0c;帮助快速降低和减少性能损耗…

Linux安装Mysql操作步骤详解

目录 1. 检测当前系统中是否安装了MySql数据库 2. 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 3. 解压并解包到/usr/local/mysql&#xff08;便于区分&#xff09; 第一步&#xff1a;将包先移动到该目录下 第二步&#xff1a;解压解包 第三步&#xff1a…

springboot的创建和使用

目录 1.springboot的优点 2.springboot项目创建 2.1使用idea创建 2. 2 ⽹⻚版创建 3.项⽬⽬录介绍和运⾏ 3.1运行项目 3.2输出hello world 4.注意事项 1.路径 2.约定大于配置 spring的诞生为了简化java程序,springboot的诞生为了简化spring程序开发 1.springboot的优点…

了解标量、向量和点积

数据科学基础数学&#xff1a;线性代数简介 了解标量、向量和点积 机器只能按着算法理解和处理数据结构存储的数字. 例如创建垃圾邮件检测器&#xff0c;则首先必须将文本数据转换为数字(通过单词嵌入)。 两个句子之间的余弦相似性 两个句子之间的余弦相似性可以通过它们的向量…

Python小姿势 - Python使用Jupyter Notebook

Python使用Jupyter Notebook Jupyter Notebook是一个开源的Web应用程序&#xff0c;可以用来创建和共享包含 live code&#xff0c;公式&#xff0c;可视化和解释性文本的文档。 安装Jupyter Notebook 首先&#xff0c;确保你安装了正确的Python版本和包管理器&#xff08;pip&…

java中的\t说明

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

加载自己的图像数据集

文章目录 1 加载图像数据集2 图像预处理3 再次加载数据集4 这里还有一个问题&#xff0c;我们没有验证集5 构建DataLoader6 检查是否正确导入数据集 原文链接&#xff1a;《加载自己的图像数据集》 ​ 数据集下载链接 1 加载图像数据集 目录结构&#xff1a; 针对这种非常典型…

while语句和until语句顺便带点小实验

while语句和until语句 一、while用法二、Until循环语句三、趣味小实验猜价格的游戏&#xff08;价格是随机数&#xff09;写一个计算器脚本闲来无事去购物 一、while用法 for循环语句非常适用于列表对象无规律&#xff0c;且列表来源以固定&#xff08;如某个列表文件&#xf…

nginx配置sh脚本远程执行一键安装

背景 本地多机重复操作某些shell指令&#xff0c;分步执行&#xff0c;很耗费时间&#xff0c; 需要远程一键部署&#xff0c;傻瓜化运维&#xff0c;更为通用安装。 即参考docker通用安装 sudo curl https://get.docker.com | sh - # sudo python3 -m pip install docker-co…

Design_transformer

磁性元件设计 思路 滤波电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铜损大于铁损 谐振电感设计 磁芯不要饱和&#xff08;开气隙&#xff09; 考虑铁损大于铜损 变压器设计 磁芯不要饱和&#xff08;开气隙&#xff09; 励磁电流产生磁场 开气隙 增加了…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

内存优化-比glibc更快的tcmalloc

TCMalloc 是 Google 开发的内存分配器&#xff0c;在不少项目中都有使用&#xff0c;例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征&#xff1a;对抗内存碎片、在多核处理器能够 scale。据称&#xff0c;它的内存分配速度是 glibc2.3 中实…

vue3表单输入绑定

初识表单输入绑定 vue3可以帮助我们将vue定义的变量绑定到html表单元素上&#xff0c;并且监听到html表单元素修改值时&#xff0c;会将对应的vue定义的变量修改。 <!-- 将vue3定义的text绑定给inut元素, 当input元素发生input输入事件时, 将修改vue3定义的text --> <…

WeakMap 与 WeakSet

WeakSet WeakSet 结构与 Set 类似&#xff0c;也是不重复的值的集合。 成员都是数组和类似数组的对象&#xff0c;WeakSet 的成员只能是对象&#xff0c;而不能是其他类型的值。 若调用 add() 方法时传入了非数组和类似数组的对象的参数&#xff0c;就会抛出错误。 const b …

SpringBoot + Druid DataSource 实现监控 MySQL 性能

1 添加依赖 <properties><java.version>1.8</java.version><alibabaDruidStarter.version>1.2.11</alibabaDruidStarter.version> </properties><dependency><groupId>com.alibaba</groupId><artifactId>druid-s…

MYSQL进阶02

MYSQL进阶02 数据类型char与varchartext与blob浮点数与定点数日期类型的选择 数据类型 char与varchar char和varchar类型类似&#xff0c;都用来存储字符串&#xff0c;但是他们保存和检索的方式不同。char属于固定长度的字符类型&#xff0c;而varchar属于可变长度的字符类型…

【Java校招面试】基础知识(四)——JVM

目录 前言一、基础概念二、反射三、类加载器ClassLoader四、JVM内存模型后记 前言 本篇主要介绍Java虚拟机——JVM的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第四篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回…

营收、利润增速第一!海尔智家为何领跑?

“企业只有保持领先的能力&#xff0c;才有可能取得经济成果。” 管理学大师德鲁克曾如此强调。所谓“领先”&#xff0c;就是独一无二的、有价值的东西。利润&#xff0c;是企业在某个领域取得领先优势后&#xff0c;必然获得的回报。 这种“领先优势”&#xff0c;在各行业…

Linux基础IO【重定向及缓冲区理解】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、文件描述符1.1、先描述&#xff0c;再组织1.2、files_struct1.3、分配规则…

跨平台Office文档预览原生插件,非腾讯X5,支持离线,稳定高可用

引言 2023年4月13日零时起&#xff0c;腾讯浏览服务内核文档能力正式下线&#xff0c;要实现真正离线文档预览&#xff0c;于是有了这边文章。 前面写了多篇关于<跨平台文件在线预览解决方案>&#xff0c;不管使用pdf.js、LibreOffice&#xff0c;还是永中DCS&#xff…