CodisLabs / codis

Proxy based Redis cluster solution supporting pipeline and scaling dynamically
MIT License
13.13k stars 2.69k forks source link

关于后端Redis的Slowlog中大量出现Command,造成相应延迟的问题 #1578

Open KouenSoftWare opened 5 years ago

KouenSoftWare commented 5 years ago

背景介绍下, 我这边有两个Codis集群,一个是生产的负载高(30W/QPS),一个测试的负载低(2W/QPS)。 最近随着内存使用的上升,业务能明显察觉的Get/Set等指令的延迟上升(从原来2.x上升到3.x,4.x,5.x都有)。因为我的业务是对相应非常敏感的,响应时间上升一倍就意味着spark流处理的业务就很容易堵住。

在生产的集群里面,我观察到一个现象,所有的Redis的Slowlog里面或多或少都出现了‘Command’这条指令,而且这条指令的耗时在10ms~50ms之间波动,最近100条中大概占据50%~70%。

在测试集群里面,负载很低,redis的slowlog里面也没有'Command',而测试集群的命令响应平均都是2.x左右。

因为这个,我就大胆推测了目前生产集群的延迟问题就是因为大量出现'Command'指令导致的。

业务是通过java-jedis连接Codis的,我在jedis中没有看到使用Command命令的方法 在Codis的代码中,有看到OpFlag中,字典中有这个命令,但是本身好像没有看到会发送这个命令到后端的redis中。

我现在的疑问就是,这个command指令到底是从哪里来的?

  1. Codis 2. sentinel 3.Redis自身 4.同一个Group中的Redis
KouenSoftWare commented 5 years ago

针对这个问题,在进行一些补充:

  1. command的指令在所有命令的比例,大概是20W分之一,耗时大概是总耗时的0.14%
  2. 一个相同的group内的两个redis,实例A和实例B:两个实例的get耗时不一致,A是2.5,B是5.1

按道理,同一个Group内数据一致,那么get和set的耗时应该也差不多才对。 我使用redis-cli --latancy测试延迟都是0.09~0.11