【问题追查】记海外aws上redis-cluster单实例抖动问题追查

【背景】

公司在海外的业务没有自建机房,而是使用了aws的服务,型号是r4.4xlarge。

但是,部署在aws上的redis集群,经常遇到某个实例耗时抖动比其他实例厉害,但是cpu、mem、网络等指标都较低的情况。

于是开启了一场漫长的问题定位之路。

【现象】

  • 集群中某些redis实例有较明显的抖动现象

如上图所示,实例10.100.14.19、10.100.15.206、10.100.7.237有明显抖动。

  • 所有机器的cpu资源、内存资源都还有很大余量,网络丢包也没有

【追查】

  • 使用LATENCY工具对抖动的redis实例监控 => 无明确结论,第3条->可能有一个“扰人”的邻居

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px }
span.s1 { font: 12.0px ".PingFang SC" }

10.100.14.19:6870> LATENCY DOCTOR

Dave, I have observed latency spikes in this Redis instance. You don‘t mind talking about it, do you Dave?

1. fast-command: 2 latency spikes (average 1ms, mean deviation 0ms, period 184.50 sec). Worst all time event 1ms.

2. command: 10 latency spikes (average 8ms, mean deviation 10ms, period 77.70 sec). Worst all time event 39ms.

I have a few advices for you:

- Check your Slow Log to understand what are the commands you are running which are too slow to execute. Please check http://redis.io/commands/slowlog for more information.

- The system is slow to execute Redis code paths not containing system calls. This usually means the system does not provide Redis CPU time to run for long periods. You should try to:

1) Lower the system load.

2) Use a computer / VM just for Redis if you are running other softawre in the same system.

3) Check if you have a "noisy neighbour" problem.

4) Check with ‘redis-cli --intrinsic-latency 100‘ what is the intrinsic latency in your system.

5) Check if the problem is allocator-related by recompiling Redis with MALLOC=libc, if you are using Jemalloc. However this may create fragmentation problems.

- Deleting, expiring or evicting (because of maxmemory policy) large objects is a blocking operation. If you have very large objects that are often deleted, expired, or evicted, try to fragment those objects into multiple smaller objects.

  • 使用watchdog将超过20ms的命令打印日志 =>

155384:signal-handler (1515198055)
--- WATCHDOG TIMER EXPIRED ---
EIP:
/lib/x86_64-linux-gnu/libc.so.6(rename+0x7)[0x7fe53f018727]

Backtrace:
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](logStackTrace+0x34)[0x462d24]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](watchdogSignalHandler+0x1b)[0x462dcb]
/lib/x86_64-linux-gnu/libpthread.so.0(+0xf890)[0x7fe53f36b890]
/lib/x86_64-linux-gnu/libc.so.6(rename+0x7)[0x7fe53f018727]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](readSyncBulkPayload+0x1ed)[0x441bbd]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](aeProcessEvents+0x228)[0x426128]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](aeMain+0x2b)[0x4263bb]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster](main+0x405)[0x423125]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fe53efd2b45]
/opt/tiger/cache_manager/bin/redis-server-3.2 10.100.14.19:6870 [cluster][0x423395]
155384:signal-handler (1515198055) --------

  • 发现同一机器上有其他服务消耗cpu较多,迁移 => 有效果,但是一段时间后又有抖动

  • 发现同一机器上有其他服务不定时的把cpu跑满 => node_keeper.py的bug
  • 将整个集群的所有实例移到新的机器独立部署 => 抖动没有再发生

【初步结论】

同一机器上的其他服务影响了redis实例

  • 其他服务平时cpu消耗很低,通过监控看不出来抖动
  • 其他服务抖动的时候可能把cpu打满,如果cpu打满,redis所在的核繁忙,因为redis是单线程必然受到影响 => 产生抖动

redis是单线程+异步服务,很容易受到同机器其他服务的影响,且影响较大。

原文地址:https://www.cnblogs.com/taoxinrui/p/8231593.html

时间: 2024-10-08 01:40:37

【问题追查】记海外aws上redis-cluster单实例抖动问题追查的相关文章

定时关闭AWS上的EC2机器实例

最近一段时间在做一个产品从阿里云向亚马逊云中国区迁移的前期试验.亚马逊中国区并没有开放免费体验账号,使用的每一份资源都要实打实的掏钱.而为了实验我们使用时一般要启动好几台EC2实例.为了不浪费辛辛苦苦赚的钱,特写了一个脚本,在每天晚上6点将所有的EC2实例自动关闭.由于在亚马逊云中关闭的EC2实例是不收费的,只收取少量的存储费用,所以这样节省不少钱. 为了让一台机器可以值守这个任务,所以我们在AWS留一台机器用来定期执行关闭其它机器的命令.关闭EC2的命令主要是使用AWS提供了awscli来实现

全面剖析Redis Cluster原理和应用 (转)

1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cluster推出之前,可用性要靠Sentinel

全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在Cl

redis单机多实例_主从复制

上一篇讲到了redis单机单实例的安装http://my.oschina.net/xinxingegeya/blog/389155, 这一篇主要安装单机多实例,以及主从复制的配置.这就是一个redis的集群了. 单机多实例的配置 [[email protected] redis_7000]# pwd /opt/redis-2.8.19/redis_7000 [[email protected] redis_7000]# ./src/redis-cli -p 7000 127.0.0.1:7000

CENTOS6.6上搭建单实例ORACLE12C

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 自己在centos6.6上搭建的单实例oracle12c 由于搭建过程有些不好写,所以图片偏多 *由于截图不规则导致排版有点乱,已经安装过来了,有些截图不能回头截图了,见谅 oracle软件与linux 认证版本 检查硬件要求(Check Hardware Requirements) Check CPU grep "model name" /pro

输出redis cluster 主从的对应关系,如果同一个主从关系的master和slave在同一个node节点上,在输出的对应关系末尾输出提示

需求:输出redis cluster 主从的对应关系,如果同一个主从关系的master和slave在同一个node节点上,在输出的对应关系末尾输出提示. 为什么会有这样的需求呢?在重新搭建redis cluster的时候,创建集群期间,发现: redis-trib.rb create --replicas 1 \5.5.5.101:29001 5.5.5.102:29002 5.5.5.103:29003 \5.5.5.102:29001 5.5.5.103:29002 5.5.5.101:29

在Spring Boot 上配置Redis Cluster出现的异常

〇.背景 已在虚拟机的docker中搭建好了6个节点的redis 集群:Docker Redis 5.0集群搭建 现在在宿主机以Spring Boot环境连接集群 一.异常1:无法连接集群 1.配置: 1 #rediss 2 spring.redis.cluster.nodes=192.168.22.130:7001,192.168.22.130:7002,192.168.22.130:7003,192.168.22.130:7004,192.168.22.130:7005,192.168.22

高级开发不得不懂的Redis Cluster数据分片机制

Redis 集群简介 Redis Cluster 是 Redis 的分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 分布式方面的需求. Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点.三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点. 如上图所示,该集群中包含 6 个 Redis 节点,3主3从,分别为M1,M2,M3,S1,S2,S3.除了主从 Redis 节

Redis Cluster 的数据分片机制

上一篇<分布式数据缓存中的一致性哈希算法> 文章中讲述了一致性哈希算法的基本原理和实现,今天就以 Redis Cluster 为例,详细讲解一下分布式数据缓存中的数据分片,上线下线时数据迁移以及请求重定向等操作. Redis 集群简介 Redis Cluster 是 Redis 的分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 分布式方面的需求. Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节