【运维篇】5.4 Redis 并发延迟检测

文章目录

  • 0.前言
    • Redis工作原理
      • 可能引起并发延迟的常见操作和命令
      • 并发延迟检测
      • 分析和解读监控数据:
      • 优化并发延迟的策略
  • 1. 检查CPU情况
  • 2. 检查网络情况
  • 3. 检查系统情况
  • 4. 检查连接数
  • 5. 检查持久化 :
  • 6. 检查命令执行情况

在这里插入图片描述

0.前言

Redis 6.0版本之前其使用单线程模型处理所有命令。这意味着在给定的时间内,只有一个命令正在执行。虽然Redis非常快,每秒可以处理上万到十万个命令,但如果有一个命令需要大量的时间来执行,那么其他的命令就必须等待,这就是所谓的"并发延迟"。

并发延迟可能会导致应用程序的整体性能下降,因此对Redis的并发延迟进行检测和优化十分重要。尤其是在并发高、数据量大的生产环境中,及时地发现并解决潜在的并发延迟问题,对于保证Redis的性能和稳定性至关重要。

本篇博文将介绍Redis并发延迟的原因,以及如何检测并优化Redis的并发延迟。我们首先会解释Redis的工作原理,然后讨论一些可能引起并发延迟的常见操作和命令。接着,我们将讨论如何使用Redis自带的延迟监控功能进行并发延迟检测,以及如何分析和解读这些监控数据。最后,我们将提供一些实际的策略和建议,来帮助你优化Redis的并发延迟,提高Redis的性能和稳定性。

Redis工作原理

Redis 每个请求被接收后,Redis会将它放入一个队列中,然后顺序执行每个命令。这种模型的好处是避免了多线程并发访问数据时可能发生的冲突和锁的问题,但同时也意味着如果有一个命令执行时间过长,它会阻塞后面的所有命令。

可能引起并发延迟的常见操作和命令

  1. 大键操作:对于包含大量元素的列表、集合、有序集合或哈希等数据结构的操作可能会导致延迟。
  2. 慢查询:一些复杂的查询或计算密集型命令(如SORT、SUNION等)可能花费更长时间执行。
  3. 阻塞命令:某些命令(如BLPOP)在等待条件满足时会阻塞其他命令的执行。
  4. 持久化:如果使用RDB或AOF方式持久化数据,持久化操作可能会影响命令的执行。

并发延迟检测

Redis提供了一些内置的工具和命令来监控并发延迟:

  1. SLOWLOG 命令:记录执行时间超过指定阈值的命令。
  2. INFO 命令:查看和分析Redis服务器的统计信息和性能指标。
  3. LATENCY MONITOR特性:监控和报告Redis操作的延迟。

分析和解读监控数据:

  1. SLOWLOG GET:分析慢查询日志,找出执行时间过长的命令。
  2. INFO命令的输出:查看特定的性能指标,例如每秒命令数、命中率、内存使用情况等。
  3. LATENCY MONITOR:识别导致延迟的具体操作和时间点。

优化并发延迟的策略

  1. 优化数据结构:避免使用大键,合理设计数据结构。
  2. 限制慢查询:设置合理的超时阈值,对慢查询进行限制。
  3. 分片:将数据分布到多个Redis实例上,减轻单个实例的负担。
  4. 使用更快的持久化策略:如使用无磁盘同步等技术减少持久化操作对性能的影响。
  5. 硬件优化:升级硬件资源,如使用更快的CPU或增加内存。
  6. 避免阻塞命令:尽量避免使用会造成阻塞的命令,或将它们移到辅助线程中执行。
  7. 监控和调优:定期监控Redis的性能指标,根据监控数据调优配置。

1. 检查CPU情况

使用top命令查看CPU使用情况。

   top - 10:00:01 up 1 day,  2:43,  2 users,  load average: 1.05, 0.70, 0.58Tasks: 193 total,   2 running, 191 sleeping,   0 stopped,   0 zombie%Cpu(s): 25.1 us,  1.4 sy,  0.0 ni, 73.0 id,  0.4 wa,  0.0 hi,  0.1 si,  0.0 stKiB Mem : 16337836 total,   812508 free,  8736168 used,  6715160 buff/cacheKiB Swap:  2097148 total,  2097148 free,        0 used.  7106764 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND12345 redis     20   0  1.916g 1.800g   1020 S  99.9 11.4  22:10.82 redis-server

这里可以看到,redis-server进程的CPU使用率接近100%,这表明可能需要垂直扩展。
也可以使用mpstat

mpstat是一个展示CPU使用情况的工具,它可以显示所有CPU的统计信息,以及单个CPU的统计信息。命令mpstat -P ALL 1的含义是显示所有CPU核心的性能统计数据,每隔1秒更新一次。以下是该命令的模拟输出:

Linux 4.15.0-123-generic (ubuntu)     12/02/2021      _x86_64_        (8 CPU)10:01:01 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:01:02 AM  all    3.50    0.00    1.25    0.75    0.00    0.12    0.00    0.00    0.00   94.38
10:01:02 AM    0    7.00    0.00    1.00    2.00    0.00    0.00    0.00    0.00    0.00   90.00
10:01:02 AM    1    2.00    0.00    1.50    0.00    0.00    0.50    0.00    0.00    0.00   96.00
10:01:02 AM    2    3.00    0.00    1.00    1.00    0.00    0.00    0.00    0.00    0.00   95.00
10:01:02 AM    3    4.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00    0.00   94.00
10:01:02 AM    4    3.00    0.00    1.00    1.00    0.00    0.00    0.00    0.00    0.00   95.00
10:01:02 AM    5    3.00    0.00    1.00    0.50    0.00    0.50    0.00    0.00    0.00   95.00
10:01:02 AM    6    4.00    0.00    2.00    0.50    0.00    0.50    0.00    0.00    0.00   93.00
10:01:02 AM    7    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00

每一行表示一个CPU的统计数据,包括用户空间(%usr)、优先级更低的进程(%nice)、系统空间(%sys)等等。最后一列是空闲时间(%idle)。

2. 检查网络情况

使用netstat命令检查Redis端口的网络情况。

   netstat -nlt | grep 6379tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN     tcp6       0      0 ::1:6379                :::*                    LISTEN     

这里显示了本机6379端口正在监听网络连接。

3. 检查系统情况

使用vmstat命令检查系统资源情况。

   vmstat 1 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st2  0      0 812508  12345 6715160    0    0    12    45  342 1234 25  1 73  0  0...

Redis 本身并不提供直接的命令来检查网络情况,但可以通过几种方式来评估Redis服务的网络性能或连接状态。

  1. PING命令:这是Redis的一个基础命令,用于检查服务是否运行并能响应命令。
   PING

如果服务运行正常,将得到一个PONG响应。

  1. INFO命令:这个命令提供了Redis服务器和其客户端的详细信息,包括网络相关的统计数据。比如:
   INFO replicationINFO stats

这些子命令会显示连接和同步的信息,以及执行的命令数量等。

  1. CLIENT LIST命令:这个命令会展示所有连接到Redis服务器的客户端列表及其相关的信息,包括地址、端口、连接时长、空闲时间等。
   CLIENT LIST
  1. 网络工具:除了Redis命令,还可以使用标准的网络工具来检测与Redis服务的连接情况。比如ping命令检查网络延迟,telnetnc(netcat)尝试连接到Redis服务端口,traceroutetracert(在Windows上)来追踪数据包路径。
   ping <redis-server-ip>telnet <redis-server-ip> <redis-port>nc -vz <redis-server-ip> <redis-port>traceroute <redis-server-ip>
  1. MONITOR命令:尽管这并非直接检查网络情况的命令,但它允许监视实时的Redis服务器接收到的命令,可以帮助理解Redis服务器的负载情况。
   MONITOR

如果发现Redis的响应时间长或连接数异常,可能是网络延迟、带宽限制、过载或其他网络问题。在这种情况下,检查的网络配置、防火墙规则和硬件设备可能会很有帮助。

在Redis中,你可以使用以下命令检查系统的状态和性能:

INFO命令:这个命令提供了关于Redis服务器的各种信息和统计,包括内存使用、CPU使用、客户端连接、数据库统计等。

INFO

这会返回一系列的信息。对于系统和网络的检查,你可能会对这部分感兴趣:

  • used_memory: 用于表示Redis分配的内存总量,以字节(bytes)为单位。
  • used_memory_human: 以更易读的格式展示Redis分配的内存总量(如KB、MB、GB)。
  • connected_clients: 已连接客户端的数量。
  • instantaneous_ops_per_sec: Redis当前的qps,即每秒的查询次数。
  1. SLOWLOG命令:这个命令可以帮你找到那些执行时间较长的命令。你可以使用SLOWLOG GET来获取慢查询日志的内容,使用SLOWLOG LEN来获取慢查询日志的长度,使用SLOWLOG RESET来清空慢查询日志。
   SLOWLOG GETSLOWLOG LENSLOWLOG RESET

4. 检查连接数

使用redis-cli info命令查看Redis的连接数。模拟输出可能如下:

   redis-cli info | grep connected_clientsconnected_clients:10

显示当前有10个客户端连接到Redis服务器。
在这里插入图片描述

5. 检查持久化 :

使用redis-cli info命令检查Redis持久化情况。

   redis-cli info | grep rdb_last_bgsave_statusrdb_last_bgsave_status:ok

显示最后一次背景保存(bgsave)的状态是成功的。
在Redis中,最常用的持久化方式有RDB和AOF,可以通过INFO persistence命令查看相关的持久化信息。

对于RDB持久化,latest_fork_usec字段显示上一次执行fork操作的持续时间,单位为微秒。这通常在Redis每次执行RDB或AOF重写时发生。

以下是INFO persistence命令的一些输出示例:

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1626293675
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:2498560
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0

其中,关于RDB的一些关键字段解释如下:

  • rdb_changes_since_last_save: 自上次成功生成RDB文件后,Redis服务器接收到的写命令数量。
  • rdb_bgsave_in_progress: 如果服务器正在创建RDB文件,那么值为1,否则为0。
  • rdb_last_save_time: 服务器最后一次成功执行SAVEBGSAVE命令的Unix时间戳。
  • rdb_last_bgsave_status: 最后一次BGSAVE命令的执行状态,成功为ok,失败为err。
  • rdb_last_bgsave_time_sec: 最后一次成功执行BGSAVE命令耗费的时长,以秒为单位。

同样,你也可以通过CONFIG GET save命令查看RDB的触发条件,该命令返回的结果形式如下:

1) "save"
2) "900 1 300 10 60 10000"

上述结果表示,当以下任一条件满足时,Redis会自动触发BGSAVE命令:

  • 900秒内有1个key发生变更
  • 300秒内有10个key发生变更
  • 60秒内有10000个key发生变更

6. 检查命令执行情况

使用redis-cli monitor命令查看Redis命令执行的实时情况。

   redis-cli monitor1614092587.248133 [0 127.0.0.1:6379] "set" "key1" "value1"1614092587.251993 [0 127.0.0.1:6379] "get" "key1"

检查Redis中每个命令的执行情况可以通过INFO commandstats命令,这个命令提供了关于Redis服务器上每个命令执行的统计数据。

INFO commandstats

执行上述命令,Redis将返回各种命令及其相关统计信息。返回的结果形式如下:

cmdstat_get:calls=100,usec=700,usec_per_call=7.00
cmdstat_set:calls=50,usec=300,usec_per_call=6.00
cmdstat_del:calls=20,usec=200,usec_per_call=10.00

在上面的输出中,每一行表示一个命令的统计信息:

  • cmdstat_get, cmdstat_set, cmdstat_del分别代表get, set, del这三个命令的统计数据。
  • calls字段表示该命令被调用的次数。
  • usec字段表示该命令总的执行时间,以微秒为单位。
  • usec_per_call字段表示该命令每次执行的平均时间,以微秒为单位。

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

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

相关文章

Java 算法篇-链表的经典算法:判断回文链表、判断环链表与寻找环入口节点(“龟兔赛跑“算法实现)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的创建 2.0 判断回文链表说明 2.1 快慢指针方法 2.2 使用递归方式实现反转链表方法 2.3 实现判断回文链表 - 使用快慢指针与反转链表方法 3.0 判断环链表说明…

设计模式-迭代器模式-笔记

动机&#xff08;Motivaton&#xff09; 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们呢希望在不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b;同时这种“透明遍历”也为“同一…

记一次攻防实战渗透

经典开局一个登录框 由于漏洞应该还未修复。对于数据和相关网址打个码见谅一下 常规思路&#xff08;爆破&#xff09; 常规操作进行一波 尝试弱口令然后开始爆破 对于此种有验证码的爆破&#xff0c;可以借用一个bp插件。 captcha-killer-modified-jdk14.jar 具体使用我就…

游戏报错d3dcompiler_47.dll缺失怎么修复,总结多种修复方法

在使用这些软件和游戏的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是d3dcompiler_47.dll丢失的问题。这个问题可能会导致软件或游戏无法正常运行&#xff0c;给用户带来困扰。本文将详细介绍解决软件游戏d3dcompiler_47.dll丢失的方法&#xff0c;帮助您…

地推团队怎么接一手app拉新项目?这几个接单平台可以试试看

首推平台&#xff1a;“聚量推客” 有粉丝问我&#xff1a; 我在五线小城市做地推&#xff0c;有个10人的地推团队&#xff0c;怎么接到一手靠谱的单子&#xff1f; 其实不止一个粉丝在后台问我&#xff0c;做地推、充场的人都在找单子&#xff0c;做这个行业就没有不缺项目的…

【C++】基础语法(中)

C基础语法&#xff08;中&#xff09; 文章目录 C基础语法&#xff08;中&#xff09;01数组一维数组数组初始化注意访问练习1练习2练习3普通做法&#xff1a;优化reverse函数练习4 多维数组清空数组memsetmemcpy 数组的部分由上到下&#xff0c;按规律 蛇形矩阵技巧 02 字符串…

《QT从基础到进阶·二十九》QT,opencv源码调试

有时候我们在使用VS调试程序的bug&#xff0c;但发现程序崩溃的地方并不在我们写的程序中&#xff0c;我们通过调用堆栈发现程序崩溃的地方出现在QT或者opencv等源码中&#xff0c;那么我们怎么能把断点打到这些开源库中&#xff0c;下面提供一种办法&#xff1a; 解决方案–右…

C语言——写一个函数,每调用一次这个函数,就会将num的值增加1

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Add(int* p) {(*p); // 的优先级高于* } int main() {int num0;Add(&num);printf("第一次调用:num %d\n",num);Add(&num);printf("第二次调用:num %d\n",num);Add(&num);p…

【Spring】之注解存取Bean对象

在本系列的上一篇文章中&#xff0c;我们已经了解了Spring的一些核心概念&#xff0c;并且还学习了Spring存取。但是我们发现在存取的过程中还是比较复杂&#xff0c;接下来我们将学习更为简单的Spring存取&#xff0c;其中涉及到的主要内容就是注解。并且在Spring家族的学习过…

搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录

目录 一. 实验要求 二. 实验准备 三. 实验过程 1. 网关服务器新建网卡并改为仅主机模式 2. 修改新建网卡IP配置文件并重启服务 3. 搭建网关服务器的dhcp服务 4. 修改server2网卡配置文件重启服务并效验 5. 设置主机1的网络连接为仅主机模式 6. 给server2和网关服务器之…

开发者生态:共享知识,携手共进,共创技术辉煌

开发者生态&#xff1a;共享知识&#xff0c;携手共进&#xff0c;共创技术辉煌 在数字化时代&#xff0c;开发者是推动技术进步和创新的重要力量。他们创造着改变世界的软件和应用&#xff0c;推动着技术的边界不断向前。而在这个快速发展的时代&#xff0c;建立一个健康、活跃…

单链表相关面试题--7.链表的回文结构

/* 解题思路&#xff1a; 此题可以先找到中间节点&#xff0c;然后把后半部分逆置&#xff0c;最近前后两部分一一比对&#xff0c;如果节点的值全部相同&#xff0c;则即为回文。 */ class PalindromeList { public:bool chkPalindrome(ListNode* A) {if (A NULL || A->ne…

多媒体ffmpeg学习教程

多媒体ffmpeg 目前比较流行的音视频文件为:MP4 flv m3u8 ffmpeg ffmpeg ffplay ffprobe ffserverffmpeg -i INPUT -vf "split [main][tmp]; [tmp] cropiw:ih/2:0:0, vflip [flip];[main][flip] overlay0:H/2" OUTPUTffmpeg -i 2022.mp4 -vcodec mpeg4 -b:…

CSS---关于font文本属性设置样式总结

目录 1、color属性 2、font-size属性 3、font-weight属性 4、font-family属性 5、text-align属性 6、line-height属性 7、text-indent属性 8、letter-spacing属性 9、word-spacing属性 10、word-break属性 11、white-space属性 12、text-transform 12、writing-mo…

SchedulingConfigurer教程,怎么使用Spring自带的可扩展定时任务调度接口

简介&#xff1a; SchedulingConfigurer 是 Spring 框架中的一个接口&#xff0c;用于配置任务调度&#xff08;scheduling&#xff09;的相关设置。在 Spring 中&#xff0c;任务调度通常通过 Spring 的任务调度模块&#xff08;Task Scheduling&#xff09;来实现&#xff0c…

px、em、rem、百分比的区别

文章目录 1. 单位类型与相对基准2. 相对长度1.em2.rem3.%百分比4.vw 和 vh5.vmin 和 vmax6.vm7.ch8. ex 3. 总结 1. 单位类型与相对基准 单位名称单位类型 &#xff08;相对/绝对&#xff09;相对基准px相对屏幕像素缩放后的尺寸百分比相对font-size相对于继承&#xff0c;wid…

【Flask使用】全知识md文档,4大部分60页第3篇:状态cookie和session保持

本文的主要内容&#xff1a;flask视图&路由、虚拟环境安装、路由各种定义、状态保持、cookie、session、模板基本使用、过滤器&自定义过滤器、模板代码复用&#xff1a;宏、继承/包含、模板中特有变量和函数、Flask-WTF 表单、CSRF、数据库操作、ORM、Flask-SQLAlchemy…

互联网上门洗衣洗鞋小程序搭建

“闪站侠互联网洗护软件开发”围绕健康洗护、智能操作做出不断升级&#xff0c; 满足用户多样化的洗护需求&#xff0c;打造轻松洗衣洗鞋体验。 洗衣洗鞋专用软件&#xff0c;可以帮助洗衣店洗鞋店店主们省心高效的管理店铺&#xff0c;一次付款长期使用&#xff0e;功能基本涵…

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的方法和步骤。你要挑战的蓝桥杯&#xff0c;实际也是在设计算法解决问题。其实各种编程语言都只是工具&#xff0c;而程序的核心数据结构算法。犹如练武&#xff0c;数据结构和算…

深度学习乳腺癌分类 计算机竞赛

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…