那么问题来了,redis速度快的flag是直接写官网的公屏上,那我们不妨来推演一下,redis变慢的原因,知其然而知其所以然。 redis为何会变慢 随着时间的堆积,数据的累增,系统很直观的会感觉的变慢的现象,对于大型程序来说,主要是内存碎片啊、堆栈溢出啊等等这些关于垃圾回收机制导致的,另外的还是跟其他组件在配合中,网络开销导致的现象 找到你认为可能变慢的 Redis 实例,测试这个实例的基准性能 如果你观察到,这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上,即可认为这个 Redis 实例确实变慢了 发现问题 业务服务器到 Redis 服务器之间的网络存在问题,例如网络线路质量不佳,网络数据包在传输时存在延迟、丢包等情况 Redis 本身存在问题,需要进一步排查是什么原因导致 Redis 变慢 分析问题 分析问题的三把斧 = yes),在执行 DEL 命令时,释放内存也会放到后台线程中执行 集中过期,redis雪崩的现象 变慢的时间点很有规律,例如某个整点,或者每间隔多久就会发生一波延迟 参考资料 https://redis.io
比如在客户端做聚合运算 使用渐进式遍历代替全量查询命令,scan/sscan/zscan/hscan Bigkey bigkey的操作导致阻塞 分析 slowlog出现一些key的set/delete操作变慢 (bigkey 分配/释放内存缓慢) redis-cli --bigkeys扫描出很多bigkey 解决 优化业务,避免bigkey Redis 4.0+可开启lazy-free机制 大量key集中过期 Redis info中的expired_keys指标短期突增 业务使用EXPIREAT/PEXPIREAT命令 解决 优化业务,key的过期时间加上随机值进行打散,减小redis释放过期键的压力 内存达到 监控latest_fork_usec耗时是否变长 AOF使用awalys机制 awalys 会造成主线程堵塞 解决: everysecond机制 数据丢失不敏感则关闭aof 使用了swap 所有请求都变慢 不合理 Redis进程只绑定一个CPU逻辑核 NUMA架构下,网络中断处理程序和Redis进程没有绑定在同一个Socket下 解决: Redis进程绑定多个CPU逻辑核,比如2个逻辑核在1个物理核下 网络中断处理程序和
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。 当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。 导致变慢的原因是,当Redis内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。 网卡负载过高 如果以上产生性能问题的场景,你都规避掉了,而且Redis也稳定运行了很长时间,但在某个时间点之后开始,访问Redis开始变慢了,而且一直持续到现在,这种情况是什么原因导致的? 之前我们就遇到这种问题,特点就是从某个时间点之后就开始变慢,并且一直持续。这时你需要检查一下机器的网卡流量,是否存在网卡流量被跑满的情况。
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。 当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。 导致变慢的原因是,当Redis内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。 网卡负载过高 如果以上产生性能问题的场景,你都规避掉了,而且Redis也稳定运行了很长时间,但在某个时间点之后开始,访问Redis开始变慢了,而且一直持续到现在,这种情况是什么原因导致的? 之前我们就遇到这种问题,特点就是从某个时间点之后就开始变慢,并且一直持续。这时你需要检查一下机器的网卡流量,是否存在网卡流量被跑满的情况。
来源 | http://kaito-kidd.com/2020/07/03/redis-latency-analysis/ Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右 当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。 导致变慢的原因是,当Redis内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。 网卡负载过高 如果以上产生性能问题的场景,你都规避掉了,而且Redis也稳定运行了很长时间,但在某个时间点之后开始,访问Redis开始变慢了,而且一直持续到现在,这种情况是什么原因导致的? 裸辞1天 vs 裸辞10天 vs 裸辞一个月 还剩10天,赶紧登下百度网盘,拯救你的2T存储空间吧!
图片一、Redis访问架构链路分析首先,在深入分析Redis服务前,需要弄清楚是不是真的Redis访问变慢了。 对于第一点从应用到Redis这条链路变慢的原因可能有如下两个:应用到Redis服务之间的链路出现问题了,比如Redis所在服务器网络负载过高丢包、交换机问题、Proxy变慢等;Redis本身确实因为一些原因变慢了 服务器配置比较低时延迟为 10ms 时,才认为 Redis响应变慢了,但是如果配置比较高,那么可能延迟是 1ms 时就可以认为 Redis 变慢了。 4 milliseconds100.00% <= 4 milliseconds97656.24 requests per second该命令对set和get命令的操作响应时间进行测评,并发500个执行10w ,就可以认为这个 Redis 服务确实响应变慢了如果确认是 Redis服务变慢了,那如何排查是哪里发生了问题呢?
00、Redis变慢了,到底慢在哪儿? 昨天的内容中,我们说了Redis变慢有可能存在的2个方面原因: 1、Redis内部的阻塞式操作或者命令 2、CPU核心以及NUMA架构 对于第一部分,主要是Redis自身的实现原理导致的,我们暂时不去做过多讨论 第二部分是在多核心CPU场景下,多核心之间的频繁上下文调度会导致Redis变慢,今天我们更近一步的分析一下多核心CPU场景以及NUMA架构下的Redis运行机制。 1 redis-server 绑定CPU物理核心,消除了Redis在CPU内核之间频繁切换带来的消耗,因而能够降低Redis的延迟,提升Redis的吞吐率,提升Redis的性能。 资源竞争,当后台子进程或者后台线程占用了CPU的资源时候,Redis的主线程响应就会被阻塞,从而变慢。
当 Redis 出现性能波动的时候,比如达到几秒到十几秒,这个很明显我们可以认定 Redis 性能变慢了。 有的硬件配置比较高,当延迟 0.6ms,我们可能就认定变慢了。 ❝那我们该如何定义 Redis 真的变慢了呢? 所以,我们需要对当前环境的 Redis 基线性能做测量,也就是在一个系统在低压力、无干扰情况下的基本性能。 当你发现 Redis 运行时时的延迟是基线性能的 2 倍以上,就可以判定 Redis 性能变慢了。 慢日志功能 Redis 中的 slowlog 命令可以让我们快速定位到那些超出指定执行时间的慢命令,默认情况下命令若是执行时间超过 10ms 就会被记录到日志。 总结 如下检查清单,帮助你在遇到 Redis 性能变慢的时候能高效解决问题。
大家都是知道Redis纯内存数据库,处理速度很快,CPU架构,也会影响到 Redis 的性能 本文主要解决的一个问题在 Redis 为什么变慢,如何解决的? , 11 BGSAVE 子进程 bgsave_cpulist 1,10-11 保存内存快照到磁盘(RDB 文件) 1, 10, 11 下面是分析过程 大纲如下 你会疑问:Redis大家都说它快,什么情况变慢 Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右 Redis 事件循环基于 epoll/kqueue, 具有相当强的可扩展性。 Redis 已在超过 60,000 个连接的情况下进行了基准测试, 并且仍然能够维持 50,000 q/s 的吞吐量。 怎么会变慢呢? 一、确定Redis是否真的变慢了 1. 运行时延迟是其基线性能的 2 倍及以上,就可以认定 Redis 变慢了 2.
00、Redis变慢了,到底慢在哪儿? 最近由于工作需要,在维护线上的Redis,Redis相关的原理部分看的比较多,Redis最常见的业务问题就是响应慢,今天我们来看看Redis慢在哪里? 首先来看有可能引起Redis变慢的那些情况。其实,Redis变慢的主要因素是各种类型的阻塞,可以这么说:阻塞是Redis的噩梦。 总体上来说,Redis的阻塞存在很多可能,今天重点说以下2个方面: 1、Redis内部的阻塞式操作或者命令 2、CPU核心以及NUMA架构 01、Redis内部的阻塞式操作或命令 假设你的Redis 1、阻塞式命令会影响Redis的性能。 在目前主流服务器上,一般都拥有多个CPU处理器,而一个CPU处理器,会拥有10~20个物理核心。
微信公众号:DBA随笔 01、如何判断Redis变慢了? 线上的Redis服务经经常有业务反馈响应慢的问题,针对这类问题,最好的分析方法是确定一个Redis的基准性能,然后去分析究竟什么原因导致的Redis变慢。 Redis内置了‒intrinsic-latency的选项来测试基线性能,如下: [root@ ~]# redis-cli --intrinsic-latency 10 Max latency so 命令中的10代表测试10s,一般取最大值作为基线性能,如图为10053微妙,也就是大概10毫秒。一旦超过这个值,那我们就可以认为Redis变慢了。 AOF刷盘层面 除了命令级别的Redis变慢之外,还有其他层面的Redis变慢问题,我们来看AOF刷盘时候可能导致Redis变慢的一个瓶颈点。
Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。 当实例的内存达到了maxmemory后,你会发现之后的每次写入新的数据,有可能变慢了。 导致变慢的原因是,当Redis内存达到maxmemory后,每次写入新的数据之前,必须先踢出一部分数据,让内存维持在maxmemory之下。 网卡负载过高 如果以上产生性能问题的场景,你都规避掉了,而且Redis也稳定运行了很长时间,但在某个时间点之后开始,访问Redis开始变慢了,而且一直持续到现在,这种情况是什么原因导致的? 之前我们就遇到这种问题,特点就是从某个时间点之后就开始变慢,并且一直持续。这时你需要检查一下机器的网卡流量,是否存在网卡流量被跑满的情况。
前言Redis变慢排查的上一篇,我们是基于Redis命令为入口,比如命令使用不得当,bigkey问题,以及集中过期问题来看现象和如何进行优化处理的,认真读过的同学想必大家对这些现象和处理方式有了比较深的印象 方案没有最完美的,everysec同步机制同样存在导致Redis延迟变慢的情况。AOF耗时的刷盘操作不是已经创建了一个后台线程去处理吗,怎么还会影响Redis主进程呢? 可以通过以下方式来查看 Redis 进程是否使用到了 Swap:# 获取Redis 的进程 ID[root@VM-12-10-opencloudos ~]# redis-cli info | grep process_idprocess_id:2600003# 查看 Redis Swap 使用情况[root@VM-12-10-opencloudos ~]# cat /proc/260003/smaps ,这里也不做深入说明,我也没具体深入了解过了总结到这里,关于影响Redis性能的因素下篇就分享完了相信如果能耐心地看到这里的同学,想必你肯定已经对 Redis 的变慢该如何处理有了很大的收获,同样对Redis
今天就可能引起Redis变慢的原因一一分析,上篇看完后你将会形成一个比较完整的排查思路方案!Redis真的变慢了吗? 因此需要确定是不是访问Redis服务变慢进而拖慢了整个服务的响应变慢,那就是先自查! 那该以什么标准来认定Redis变慢呢? 一般来说,如果你观察到的 Redis 运行时延迟是其基线性能的 2 倍及以上,就可以认定 Redis 变慢了比如:执行以下命令,就可以测试出这个实例 60 秒内的最大响应延迟[root@VM-12-10 ok,关于Redis变慢问题的上半部分就分享到这里了,下期讲继续更新其他可能导致Redis变慢的情况,朋友,点个关注不迷路!参考:Redis变慢?
要想重启后依然生效,得修改配置文件[root@m2 tmp]# grep slave-read-only redisnew.confslave-read-only no[root@m2 tmp]# ----连接认证redis requirepass 配置一下简单的认证127.0.0.1:6379> CONFIG GET requ*1) "requirepass"2) ""127.0.0.1:6379> exit[root@m1 ~]# redis-cli
redis 慢查询 什么是慢查询 MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里。 redis 的生命周期 客户端向Redis服务器发送命令 命令请求在请求队列中排队等待处理 执行命令 返回命令结果 ? redis 慢查询 慢查询发生在生命周期的第三阶段,是指仅仅执行命令阶段比较慢被称为慢查询。 客户端超时不一定是慢查询,但是慢查询时是客户端超时的一个可能因素。 redis 慢查询相关配置 1. slowlog-max-len 它决定了慢查询日志最多能保存多少条日志,slow log本身是一个内存中的FIFO队列,当队列大小超过slowlog-max-len时, 获取慢查询列表中的慢查询信息 2. slowlog len 含义:获取慢查询队列长度 slowlog reset 含义:清空慢查询队列 慢查询运维经验 slowlog-max-len 不要设置过大,默认10ms
为了实现重启后数据不丢失,Redis提供了两种持久化的方案,一种是RDB快照(RedisDataBase),一种是AOF(AppendOnlyFile)。 RDB RDB是Redis默认的持久化方案。 save 900 1 // 900秒内至少有一个key被修改(包括添加) save 300 10 //400秒内至少有10个key被修改 save 60 10000 //60秒内至少有10000个key Redis提供了两条命令: 命令 说明 save save在生成快照的时候会阻塞当前Redis服务器,Redis不能处理其他命令。如果内存中的数据比较多,会造成Redis长时间的阻塞。 为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为yes。 AOF数据恢复 重启Redis之后就会进行AOF文件的恢复。
体验过众多Netty的demo以后,在跟朋友分享后实现了页面昵称输入,消息可回车发送,页面保持输入框在底部,消息页面支持滚动,但是为什么当多客户端接入,消息会延迟,并注册变慢呢? 为什么会变慢呢? 接受到的数据:[服务器在]2020-01-10T10:16:14.943接受到消息, 消息为:1002-------KK-------{'code':10086,'mess':'测试'} 2020-01 -01-10T10:16:43.902接受到消息, 消息为:1001-------kk-------{'code':10086,'mess':'1'} 接受到的数据:[服务器在]2020-01-10T10 1核啊,不管是cpu密集型,还是io密集型4个线程就够服务器响应的了,而且每个客户端为了保持长连接,还不会断开,所以当客户端多了,消息多了以后就会变慢,这严重违背了Nio的思想。
Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。 也就是从 Redis 角度来排查,是否存在导致变慢的场景,以及都有哪些因素会导致 Redis 的延迟增加,然后针对性地进行优化。 排除网络原因,如何确认你的 Redis 是否真的变慢了? 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。 如果你观察到,这个实例的运行延迟是正常 Redis 基准性能的 2 倍以上,即可认为这个 Redis 实例确实变慢了 确认是 Redis 变慢了,那如何排查是哪里发生了问题呢? 我们继续分析还有什么场景会导致 Redis 变慢。
redis是NOSQL数据库,所以也存在事务,只是此事务和关系型数据库的事务是有区别的。 事务实例 Redis中事务的使用其实非常简单,通过MULTI命令即可。 如下 127.0.0.1:6379> exec 1) OK 2) OK 3) OK 4) OK 5) "bbb" 事务异常 事务中的异常有两种情况: 进入队列之前发生错误 比较常见的命令错误,此类异常redis (error) ERR syntax error # 执行命令的时候错误提示 4) OK 127.0.0.1:6379> keys kk* 1) "kk1" 2) "kk2" 3) "kk4" 注意 redis 执行exec命令后发生的异常 对于这种情况,redis中也不会做特别的处理。 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速 Watch watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。