【运维篇】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.58
   Tasks: 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 st
   KiB Mem : 16337836 total,   812508 free,  8736168 used,  6715160 buff/cache
   KiB Swap:  2097148 total,  2097148 free,        0 used.  7106764 avail Mem 

     PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   12345 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 6379
   tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN     
   tcp6       0      0 ::1:6379                :::*                    LISTEN     

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

3. 检查系统情况

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

   vmstat 1 5
   procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
    r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
    2  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 replication
   INFO 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 GET
   SLOWLOG LEN
   SLOWLOG RESET

4. 检查连接数

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

   redis-cli info | grep connected_clients
   connected_clients:10

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

5. 检查持久化 :

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

   redis-cli info | grep rdb_last_bgsave_status
   rdb_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 monitor
   1614092587.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字段表示该命令每次执行的平均时间,以微秒为单位。

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

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

相关文章

【代码随想录】算法训练计划27

回溯 1、39. 组合总和 题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的…

力扣C++学习笔记——C++ assign全面解析

cassign是一个C20标准中新增的头文件&#xff0c;主要提供了assign函数&#xff0c;用于将一个容器内的元素按照特定规则赋值到另一个容器中。它是STL容器操作的重要一环&#xff0c;具有高效、简洁、易用的特点。 assign函数有多个版本&#xff0c;一般使用的是容器类型相同或…

CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)

版本说明 当前版本号[20231120]。 版本修改说明20231120初版 目录 文章目录 版本说明目录N皇后 II题目解题思路代码思路参考代码 买卖股票的最佳时机 II题目解题思路代码思路参考代码 编程通过键盘输入每一位运动员题目解题思路代码思路参考代码 N皇后 II 题目 n 皇后问题…

uvm环境获取系统时间的方法和使用案例

背景&#xff1a; 有时候我们想统计一下验证环境中某个步骤总共花费了多少时间&#xff0c;有什么比较方便的方法呢&#xff0c;利用$realtime理论上也是能做到的&#xff0c;不过这个和timescale绑定起来了&#xff0c;需要手动换算成单位是秒的数&#xff0c;现在提供一种利用…

最强英文开源模型Llama2架构与技术细节探秘

prerequisite: 最强英文开源模型LLaMA架构探秘&#xff0c;从原理到源码 Llama2 Meta AI于2023年7月19日宣布开源LLaMA模型的二代版本Llama2&#xff0c;并在原来基础上允许免费用于研究和商用。 作为LLaMA的延续和升级&#xff0c;Llama2的训练数据扩充了40%&#xff0c;达到…

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…

Python如何实现原型设计模式?什么是原型设计模式?Python 原型设计模式示例代码

什么是原型&#xff08;ProtoType&#xff09;设计模式&#xff1f; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而无需通过标准的构造方式。它允许我们基于现有对象创建新对象&#xf…

数电实验-----实现74LS153芯片扩展为8选1时间选择器以及应用(Quartus II )

目录 一、74LS153芯片介绍 管脚图 功能表 二、4选1选择器扩展为8选1选择器 1.扩展原理 2.电路图连接&#xff08;Quartus II &#xff09; 3.仿真结果 三、8选1选择器的应用 1.三变量表决器 2.奇偶校验电路 一、74LS153芯片介绍 74ls153芯片是属于四选一选择器的芯片。…

你听说过“消费多少返利多少的”模式吗?

今天分享一个新的销售套路&#xff0c;看懂套路奋斗节约3年&#xff0c;你听说过“消费多少返利多少的”模式吗&#xff1f; 消费报销模式就是消费者在平台的消费&#xff0c;根据贡献度和活跃度平台去把之前消费的模式&#xff0c;给你返本了甚至还额外给你补贴奖励&#xff…

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

1.索引的本质

索引是帮组MYSQL高效获取数据的排好序的数据结构 二叉树 二叉树是树节点的度不大于2的有序树。它是一种最简单最重要的树。 二叉树的左节点始终小于父节点。二叉树的有节点始终大于等于父节点 对于单边递增的数据&#xff0c;二叉树会变成链表的形式。这个时候查询不会减少次数…

使用cli批量下载GitHub仓库中所有的release

文章目录 1\. 引言2\. 工具官网3\. 官方教程4\. 测试用的网址5\. 安装5.1. 使用winget安装5.2. 查看gh是否安装成功了 6\. 使用6.1. 进行GitHub授权6.1.1. 授权6.1.2. 授权成功6.2 查看指定仓库中的所有版本的release6.2.1. 默认的30个版本6.2.2. 自定义的100个版本6.3 下载特定…

IDEA前端thymeleaf只显示部分数据库问题

只显示int类型的number&#xff0c;不显示string类型的price和weight 先看一下apple.html <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>User List</title> </…

【ROS】RViz2源码分析(三):核心类VisualizerApp

【ROS】郭老二博文之:ROS目录 1、简述 VisualizerApp包含了三个主要的功能: QApplication:程序中主要调用app_->processEvents()来处理刷新界面,处理闪屏VisualizationFrame:窗口类都在此;RosClientAbstractionIface包含rclcpp::Node:代表ROS节点2、VisualizationF…

使用 VPN ,一定要知道的几个真相!

你们好&#xff0c;我的网工朋友。 今天想和你聊聊VPN。在VPN出现之前&#xff0c;企业分支之间的数据传输只能依靠现有物理网络&#xff08;例如Internet&#xff09;。 但由于Internet中存在多种不安全因素&#xff0c;报文容易被网络中的黑客窃取或篡改&#xff0c;最终造…

FPGA实现双向电平转换

网上搜了一圈&#xff0c;好像没看到的类似的中文资料&#xff0c;不过MicroSemi有个文档AC349上给出了完整的解决方案&#xff0c;还有参考代码。 话不多说&#xff0c;看图&#xff1a; 欲知详情的朋友&#xff0c;请参考 AC349

一起Talk Android吧(第五百五十五回:Retrofit中的注解)

文章目录 1. 概念介绍2. 注解的分类与功能2.1 方法类注解2.2 参数类注解3. 内容总结各位看官们大家好,上一回中分享了一个Retrofit使用错误的案例,本章回中将 介绍Retrofit请求中的注解。闲话休提,言归正转,让我们一起Talk Android吧! 1. 概念介绍 我们在前面章回中介绍R…

YOLO改进系列之注意力机制(GAM Attention模型介绍)

模型结构 为了提高计算机视觉任务的性能&#xff0c;人们研究了各种注意力机制。然而以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;liu提出了一种通过减少信息弥散和放大全局交互表示来提高深度神经网络性能的全局注意力机制。作者的目…

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

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

算法学习 day26

第二十六天 最大子数组和 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 动态规划问题 class Solution {public int maxSubArray(int[] nums) {int len nums.length;int[] dp new int[len];dp[0] nums[0];int res dp[0];for(int i 1; i < len; i){dp[i] …