Redis性能问题排查指引

news2024/12/24 8:44:10

目录

  • Redis性能问题排查手段

    • 1. 定位问题点

    • 2. 定位Redis具体性能问题

    • 参考:

Redis性能问题排查手段

1. 定位问题点

当发生业务系统访问Redis慢或者超时异常时,可能的原因有以下三个:

  1. 客户端问题: 如果客户端使用的是Java版本的Lettuce SDK,如果业务应用的CPU使用率比较高时,由于不能及时处理Redis返回的命令,也会报Command Timeout的异常。可以查看业务应用的CPU使用率情况

  2. 网络问题: 可以从客户端进行ping操作验证网络是否存在延迟

  3. Redis性能问题: 通过redis-cli工具判断Redis是否存在性能问题

    # 判断Redis整体是否存在性能问题,正常情况下如果是本机执行avg应小于1(原理是发送ping命令,计算返回时长,无需输入密码)
    redis-cli -h "127.0.0.1" -p "6379" --latency-history
    min: 0, max: 1, avg: 0.11 (1323 samples) -- 15.00 seconds range
    min: 0, max: 1, avg: 0.10 (1330 samples) -- 15.00 seconds range
    min: 0, max: 1, avg: 0.12 (1321 samples) -- 15.01 seconds range
    min: 0, max: 1, avg: 0.10 (1319 samples) -- 15.01 seconds range
    min: 0, max: 1, avg: 0.10 (1321 samples) -- 15.00 seconds range
    min: 0, max: 1, avg: 0.10 (1319 samples) -- 15.01 seconds range
    
    

2. 定位Redis具体性能问题

如果通过Redis性能问题: 通过redis-cli工具判断Redis是否存在性能问题定位到Redis存在性能问题,则可以通过以下手段定位具体原因

  1. 查看Redis内存占用

    通过redisl-cli连接到Redis,执行info memory命令,重点查看used_memory_rss_human、total_system_memory_human、maxmemory_human几个参数

    • maxmemory_human如果为0,表示不限制Redis的内存使用,通常不建议这样配置

    • 当used_memory_human_rss达到maxmemory(如果maxmemory配置为0,则参考total_system_memory_human)的90%时容易产生性能问题

    • 确保maxmemory_human < total_system_memory_human

    redis-cli -h "127.0.0.1" -p "6379" -a ""
    127.0.0.1:6379> info memory
    # Memory
    used_memory:904768
    # 当used_memory_human达到maxmemory(如果maxmemory配置为0,则参考total_system_memory_human)的80%时容易产生性能问题
    used_memory_human:883.56K
    used_memory_rss:7266304
    used_memory_rss_human:6.93M
    used_memory_peak:964504
    used_memory_peak_human:941.90K
    used_memory_peak_perc:93.81%
    used_memory_overhead:863304
    used_memory_startup:842624
    used_memory_dataset:41464
    used_memory_dataset_perc:66.72%
    allocator_allocated:1803176
    allocator_active:7864320
    allocator_resident:8912896
    total_system_memory:2085294080
    total_system_memory_human:1.94G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    used_memory_scripts:0
    used_memory_scripts_human:0B
    number_of_cached_scripts:0
    # maxmemory配置为0,表示不限制Redis的内存使用,当used_memory_human较大时,容易产生性能问题
    maxmemory:0
    maxmemory_human:0B
    
  2. 查看Redis的命令数

    通过redisl-cli连接到Redis,执行info stats命令,重点查看instantaneous_ops_per_sec参数

    • 由于Redis支持的最高Ops与key、value的大小有很大的关系,可以参考下图的Redis性能判断Redis是否达到性能瓶颈
    redis-cli -h "127.0.0.1" -p "6379" -a ""
    127.0.0.1:6379> info stats
    # Stats
    instantaneous_ops_per_sec:0
    

image.png

  1. 查看是否存在磁盘性能问题

    如果Redis配置了AOF持久化,并且appendfsync设置为everysec,即每秒持久化磁盘一次。如果磁盘性能存在问题就会影响Redis的读写性能。

    查看Redis的日志文件是否存在如下内容:

    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    

    解决办法:临时设置appendfsync参数为no,如果磁盘的性能太差,即使appendfsync设置为no,不再打印fsync slow的日志,也可能会影响Redis性能,可以通过后续介绍的latency-monitor定位到。

    redis-cli -h "127.0.0.1" -p "6379" -a ""
    127.0.0.1:6379> config set appendfsync no
    
  2. 查看连接数

    当Redis的连接数超过最大连接数时会对新的连接进行排队或者直接拒绝,需确认connected_clients小于maxclients

    redis-cli -h "127.0.0.1" -p "6379" -a ""
    127.0.0.1:6379> info clients
    # Clients
    connected_clients:1
    cluster_connections:0
    maxclients:10000
    client_recent_max_input_buffer:16
    client_recent_max_output_buffer:0
    blocked_clients:0
    tracking_clients:0
    clients_in_timeout_table:0
    
  3. 查看是否有慢查询(时间复杂度较高的命令)

    redis-cli -h "127.0.0.1" -p "6379" -a ""
    127.0.0.1:6379> slowlog get 100
    1) 1) (integer) 0
       2) (integer) 1668745341
       3) (integer) 1001516
       4) 1) "debug"
          2) "sleep"
          3) "1"
       5) "127.0.0.1:40420"
       6) ""
    
  4. 检查操作系统是否存在性能问题

    # 判断Redis所在的服务器是否存在性能问题,这个指标需要与正常的运行的Redis示例所在服务器进行对比才行,如果参数是正常运行Redis的两倍左右,就说明操作系统性能存在问题
    # 该命令只是简单的运行一些加减运算的命令,必须在Redis服务器上执行,所以用于判断操作系统的是否存在固有延迟
    redis-cli --intrinsic-latency 60
    Max latency so far: 1 microseconds.
    Max latency so far: 65 microseconds.
    Max latency so far: 107 microseconds.
    Max latency so far: 448 microseconds.
    
    
  5. 开启延迟监控(对尖峰延迟尤其有效

    开启latency-monitor监控,该功能对于定位存在延迟尖峰的场景尤其有用(即Redis响应慢的现象是间歇性或偶发的)

    # 开启latency-monitor监控(单位是毫秒)
    redis-cli -h "127.0.0.1" -p "6379" -a ""
    CONFIG SET latency-monitor-threshold 100
    

    Redis是对事件的延迟进行统计,可以通过以下命令查询是否存在延迟事件

    # 显示每个事件的最新一次时间戳和耗时
    latency latest
    1) 1) "command"           # Event name
       2) (integer) 1439479413  # Unix timestamp
       3) (integer) 381   # Latency of latest event
       4) (integer) 6802    # All time maximum latency
    
    # 显示指定事件的历史时间戳和耗时
    latency history command
    1) 1) (integer) 1425038819   # Unix timestamp
       2) (integer) 383      # Execution time (in ms)
    2) 1) (integer) 1425038944
       2) (integer) 4513
       
    # 清理latency记录
    latency reset
    
    # 图形化的方式展示指定事件的历史统计
    latency graph command
    

    事件列表参考:

    • command: regular commands.

    • fast-command: O(1) and O(log N) commands.

    • fork: the fork(2) system call.

    • rdb-unlink-temp-file: the unlink(2) system call.

    • aof-fsync-always: the fsync(2) system call when invoked by the appendfsync allways policy.

    • aof-write: writing to the AOF - a catchall event for write(2) system calls.

    • aof-write-pending-fsync: the write(2) system call when there is a pending fsync.

    • aof-write-active-child: the write(2) system call when there are active child processes.

    • aof-write-alone: the write(2) system call when no pending fsync and no active child process.

    • aof-fstat: the fstat(2) system call.

    • aof-rename: the rename(2) system call for renaming the temporary file after completing BGREWRITEAOF.

    • aof-rewrite-diff-write: writing the differences accumulated while performing BGREWRITEAOF.

    • active-defrag-cycle: the active defragmentation cycle.

    • expire-cycle: the expiration cycle.

    • eviction-cycle: the eviction cycle.

    • eviction-del: deletes during the eviction cycle.

参考:

线上 Redis 搞炸了,反应巨慢,怎么破? - 知乎 (zhihu.com)

Understanding the Top 5 Redis Performance Metrics (datadoghq.com)

How to Collect Redis Metrics | Datadog (datadoghq.com)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VueJS 之组件的生命周期

文章目录参考描述生命周期生命周期图示生命周期钩子组件创建阶段组件运行阶段组件销毁阶段举个栗子参考 项目描述搜索引擎Bing哔哩哔哩黑马程序员VueJS官方文档 描述 项目描述Edge109.0.1518.70 (正式版本) (64 位)操作系统Windows 10 专业版vue/cli5.0.8npm8.19.3VueJS2.6.1…

实战30:基于Open CV的车道线检测 附完整代码

车道线检测,在色彩切片、边界提取处,可以选用许多不同的方法来实现。色彩切片处是希望通过车道线的颜色特征:白色或者黄色来提取车道线,白色和黄色单独提取后两者图像相加便得到了同时含有白色车道和黄色车道的图像。色彩切片步骤的关键在于如何获得较为纯净的车道线,以让…

Java JVM:Java 内存模型与线程(七)

衡量一个服务性能的高低好坏&#xff0c;每秒事物处理数&#xff08;TPS&#xff09;是重要的指标之一&#xff0c;而 TPS 值与程序的并发能力又有非常密切的关系 目录一、硬件的效率与一致性二、Java 内存模型三、Java 与线程这里是看书笔记&#xff0c;之前文章也有相关介绍&…

操作系统权限提升(八)之系统错误配置-注册表键AlwaysInstall提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

异质性区域下的宏观基本图构建

这是我们发表在Physica A: Statistical Mechanics and its Applications期刊上的一篇论文&#xff0c;主要是对现在的宏观基本图构建进行了一定的优化&#xff0c;论文详见&#xff1a;https://www.sciencedirect.com/science/article/pii/S0378437123000869 1.论文概述 论文…

stream操作常用API 示例详解

简介 从JDK8开始&#xff0c;增加了一新特性Stream流式操作&#xff0c;Stream中提供了非常多的API供大家使用&#xff0c;灵活的使用这些API&#xff0c;可以非常的方便且优美的实现我们的代码逻辑。 流式操作主要用来处理数据&#xff08;比如集合&#xff09;&#xff0c;…

Java两大工具库:Commons和Guava(4)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客。值此新春佳节&#xff0c;我给您拜年啦&#xff5e;祝您在新的一年中所求皆所愿&#xff0c;所行皆坦途&#xff0c;展宏“兔”&#xff0c;有钱“兔”&#xff0c;多喜乐&#xff0c;常安宁&#xff01;在Nginx中提到过…

说一下Vue组件中的自定义事件和全局事件总线

一&#xff0c;自定义事件 1.自定义事件是什么 自定义事件一种组件间通信的方式&#xff0c;适用于 子组件 ——> 父组件传输数据等 2.要在什么地方使用 若App是父组件&#xff0c;School是子组件&#xff0c;School想给App传数据&#xff0c;那么就要在App中给School绑…

MySQL表中的聚合查询

聚合查询在MySQL初阶中进行的查询都是对于同一条记录的列与列之间进行的运算,那如何对多条记录的不同行进行运算呢(比如计算所有同学某一单科的总分,某一单科的平均分)?此时就需要聚合查询来操作了!1.聚合函数函数 说明COUNT([DISTINCT] expr)返回查询到的数据的数量SUM([DIST…

pod访问不通问题--kube-proxy未正常创建

用户问题Pod创建后访问对象存储OSS不通。初步排查初步排查&#xff0c;网络连通性是OK的。再次反馈创建Pod后2分钟内可能存在业务不通。业务架构该集群采用了节点自动弹缩功能&#xff0c;节点弹缩范围在13-28之间。用户周期性创建大批量Pod&#xff0c;共300个&#xff0c;与对…

46_API接口漏洞

API接口漏洞 一、概念 api > application interface 应用接口 向特定的接口发送一个请求包 返回一个类似于json格式的字符串 二、REST型web service 可以从网上去搜索下api接口去理解,下面有个我找到的网址,给出api接口的分类 https://blog.csdn.net/t79036912/article…

Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘

1. 设置NAS&#xff0c;共享目录 1. 文件服务 设置 首先进入NAS服务&#xff0c;打开 [控制面板] &#xff0c;在控制面版包含** 文件服务 ** 功能如图所示。 2.选中要共享的文件夹后&#xff0c;点击操作栏的 【编辑】 按钮&#xff0c;如图&#xff1a; 3.进入编辑面板后&a…

盘点三个超好用的截图软件

一款好用的截图软件往往能给人们带来更高的工作效率&#xff0c;目前市面上的截图软件已经很多&#xff0c;今天就给大家盘点一些好用的截图软件。 QQ截图 QQ截图软件是QQ内置自带的一款截图&#xff0c;快捷键ctrlA 可以唤起&#xff0c;其功能也是应有尽有包括屏幕录制&#…

【JavaScript】数据劫持(代理)详解

&#x1f4bb; 【JavaScript】数据劫持(代理)详解 &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…

3万行代码硬撸一个一键发布文章工具,简直不要太好用,从此写文章,发文章,太简单了好伐

theme: channing-cyan highlight: github-gist 本人6年前端开发老鸟- 【程序员蜗牛】&#xff0c;欢迎沟通交流 操作演示&#xff08;视频&#xff09; 视频演示 项目背景 程序员工作中&#xff0c;不免会遇到一些技术难题&#xff0c;然后通过不懈努力将问题攻克&#xf…

1x1卷积、Inception网络、

目录1.1x1卷积(1x1 convolution)又称网络中的网络(network in network)池化层只能压缩图像的宽和高&#xff0c;1x1卷积能压缩通道数量&#xff0c;减少计算成本。如上图&#xff0c;输入维度的通道数为192&#xff0c;用32个1x1x192的filters&#xff0c;就能将输出的通道数压…

【Rust】20. Rust 的高级特征

20.1 不安全 Rust 20.1.1 不安全的超能力 20.1.2 解引用裸指针 裸指针&#xff08;raw pointers&#xff09;&#xff1a;类似于引用类型&#xff1b;和引用一样&#xff0c;裸指针是不可变或可变的&#xff0c;分别写作 *const T 和 *mut T&#xff0c;这里的星号不是解引用运…

Kubernetes集群部署与实践

一、提要 部署Kubernetes集群至少需要3台服务器&#xff0c;其中至少要有1个服务器做master节点&#xff0c;至少要有1个服务器做node节点&#xff0c;且节点名称是唯一的。 当集群中只有一个master节点时&#xff0c;如果其出现了故障&#xff0c;会导致Kubernetes的控制平面…

规则引擎-drools-5-决策表

文章目录Excel格式决策表 官网地址决策表使用方式Excel组成部分与drl规则文件对应关系Excel文件内容示例drl规则文件内容Excel决策表内容说明1. RuleSet2. RuleTable3. Attributes示例Excel转化drl代码及结果执行drl代码及结果Excel格式决策表 官网地址 决策表这部分内容在官网…

几种IO模型

IO真正的IO操作涉及到和IO设备的交互&#xff0c;而操作系统限制了应用程序直接和设备交互。我们通常说的IO操作实际上是应用程序和操作系统进行交互&#xff0c;一般会使用操作系统的System Call&#xff0c;即系统调用&#xff0c;读是read()&#xff0c;写是write()&#xf…