Redis集群性能——低负载超时率高
Redis cluster performance - high timeout rate on low load
看到 redis 集群的奇怪行为,它在大负载下工作得很好,在低负载下开始 运行 50% 的超时率和不稳定的响应时间。
我们每天在低负载时段都有相同的模式。
有什么想法会导致这种奇怪的模式吗?也许这个 RedisCluster 在低负载时间开始做一些维护工作?就像插槽重新平衡一样。请推荐任何设置或要检查的方面。
版本:Redis 2.0.7、Jedis 2.8.1
配置:3 个物理节点,9 个主进程和 18 个从属进程。
JedisCluster 超时 = 5 毫秒。
负载是 100% 使用 setex 写入。
此图表是针对 JedisCluster 响应时间,而不是实际的 RedisCluster 时间。
"Sets" 这里的行实际上是成功的集合,而不是总数。
最后我发现它看起来像网络问题。
redis08(10.201.12.214) ~ $ redis-benchmark -h 10.201.12.215 -p 9006
====== PING_INLINE ======
100000 requests completed in 91.42 seconds
50 parallel clients
3 bytes payload
keep alive: 1
0.00% <= 11 milliseconds
redis09(10.201.12.215) ~ $ redis-benchmark -h 10.201.12.215 -p 9006
====== PING_INLINE ======
100000 requests completed in 1.41 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.46% <= 1 milliseconds
redis08 ~ $ ping lga-redis09
PING redis09 (10.201.12.215) 56(84) bytes of data.
64 bytes from redis09 (10.201.12.215): icmp_seq=1 ttl=64 time=10.7 ms
查看 collectd 的 "if_octets" 我们在这次低写入 activity 的网络接口上有巨大的网络 activity。夜间负载是白天负载的 10 倍。
这是由于redis节点在这个低负载时期开始主动交换信息造成的。
Iptraf top 连接输出:
而在这个 iptraf 报告的白天顶部完全属于具有良好写入负载的实际 redis 客户端。
终于发现我们的复制有问题。有时缓冲区不够,从站开始完全重新同步。看起来像这个夜间负载 - 完全重新同步尝试 + 低 repl-timeout 值 - 结果是无休止的复制尝试。为什么这种复制会如此显着地影响低夜间负载而不会影响白天时间 - 我不知道,看不到让 redis 在夜间或类似情况下更频繁地尝试的选项。
如果这很有趣,我们通过增加明显的设置来修复永无止境的复制:
repl-backlog-size
repl-timeout
看到 redis 集群的奇怪行为,它在大负载下工作得很好,在低负载下开始 运行 50% 的超时率和不稳定的响应时间。
我们每天在低负载时段都有相同的模式。
有什么想法会导致这种奇怪的模式吗?也许这个 RedisCluster 在低负载时间开始做一些维护工作?就像插槽重新平衡一样。请推荐任何设置或要检查的方面。
版本:Redis 2.0.7、Jedis 2.8.1
配置:3 个物理节点,9 个主进程和 18 个从属进程。
JedisCluster 超时 = 5 毫秒。
负载是 100% 使用 setex 写入。
此图表是针对 JedisCluster 响应时间,而不是实际的 RedisCluster 时间。 "Sets" 这里的行实际上是成功的集合,而不是总数。
最后我发现它看起来像网络问题。
redis08(10.201.12.214) ~ $ redis-benchmark -h 10.201.12.215 -p 9006
====== PING_INLINE ======
100000 requests completed in 91.42 seconds
50 parallel clients
3 bytes payload
keep alive: 1
0.00% <= 11 milliseconds
redis09(10.201.12.215) ~ $ redis-benchmark -h 10.201.12.215 -p 9006
====== PING_INLINE ======
100000 requests completed in 1.41 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.46% <= 1 milliseconds
redis08 ~ $ ping lga-redis09
PING redis09 (10.201.12.215) 56(84) bytes of data.
64 bytes from redis09 (10.201.12.215): icmp_seq=1 ttl=64 time=10.7 ms
查看 collectd 的 "if_octets" 我们在这次低写入 activity 的网络接口上有巨大的网络 activity。夜间负载是白天负载的 10 倍。
这是由于redis节点在这个低负载时期开始主动交换信息造成的。
Iptraf top 连接输出:
终于发现我们的复制有问题。有时缓冲区不够,从站开始完全重新同步。看起来像这个夜间负载 - 完全重新同步尝试 + 低 repl-timeout 值 - 结果是无休止的复制尝试。为什么这种复制会如此显着地影响低夜间负载而不会影响白天时间 - 我不知道,看不到让 redis 在夜间或类似情况下更频繁地尝试的选项。 如果这很有趣,我们通过增加明显的设置来修复永无止境的复制:
repl-backlog-size
repl-timeout