Redis CPU 在排序集上的性能

pab*_*blo 4 performance sortedset redis

我们正在运行 Redis,每秒对排序集中的键进行数百次增量,同时每秒对排序集进行数千次读取。

这似乎运行良好,但在峰值负载期间,CPU 使用率变得相当高,为单核的 80%。排序集本身占用的内存很小,只有几千个键。

CPU 使用率的增加是否可能是由于每秒数百次增量或数千次读取造成的?了解两者对性能的影响,但哪个影响更大?

鉴于此,在我的生产实例上监控以检查这些瓶颈的最佳指标是什么?

Did*_*zia 5

需要检查的一点是排序集是否小到足以被 Redis 序列化。例如,“调试对象”可以应用于排序集的样本,以检查它们是否被编码为 ziplist。

ziplist 使用内存与 CPU 进行交换,尤其是当排序集的大小接近阈值时(配置文件中的 zset-max-ziplist-entries、zset-max-ziplist-value)。

假设排序集不是 ziplist 编码的,我认为 CPU 使用率可能是由于每秒数千次读取而不是每秒数百次更新。zset 的更新是一个 log(n) 操作。Redis 速度非常快,并且不存在与锁定相关的延迟。zset 项的读取是一个 O(n) 操作,可能会导致构建一个大缓冲区并将其返回给客户端。

可以肯定的是,您可能想要生成只读流量,检查 CPU,然后停止它,生成更新流量,再次检查 CPU 并进行比较。

zset 读取操作性能应该接近 Redis基准测试中的 LRANGE 性能。具有数千个项目的 zset 的数千 TPS 似乎符合典型的 Redis 性能。