【问题标题】:How does Redis perform at peak load?Redis 在峰值负载下表现如何?
【发布时间】:2023-01-10 06:20:49
【问题描述】:

似乎无法找到答案,基准测试真的很讲故事。

Redis 在峰值负载/使用期间如何处理自身?

问题来自于知道 CPU 使用率可能达到其逻辑核心的 100%,或者内存可能被过度使用。

在这些情况下会发生什么?

【问题讨论】:

  • 这导致,如果我想要一个 Redis 实例来处理 10K 用户并且这会使机器超载,我可以处理 20K 用户并增加延迟并保持并行处理。
  • 我对此也很感兴趣,但如果你想从服务器中获得更多 I/O,你应该了解 redis 集群。

标签: redis


【解决方案1】:

通常,Redis 的 CPU 负载不高,当 CPU 使用率很高时,它会像其他任何应用程序一样运行,但这在很大程度上取决于您的 Redis 版本。

在 Redis 4.0 之前,它完全是单线程的,长时间运行的操作会阻塞(如后台保存、大对象的 DEL 等)。从 4.0 开始,大多数此类操作都被推送到后台。使用 bgsave 命令保存到磁盘后,Redis 现在会分叉自身并在子项中进行保存,让父项保持打开状态以接受更改。 6.0 更改了一些内容,例如 del 命令现在充当 unlink,并将实际删除推送到线程。有一些计划向 Redis 7.0 版添加更多多线程,但似乎已被推到 7.2 版。

然而,最大的问题是达到最大系统内存,或者 Redis 配置中的 maxmemory 指令。发生这种情况时,Redis 的驱逐政策开始发挥作用(由 maxmemory-policy 指令设置)。

以下是可用的驱逐政策及其作用:

  • noeviction:达到内存限制时不保存新值。当数据库使用复制时,这适用于主数据库
  • allkeys-lru:保留最近使用的密钥;删除最近最少使用 (LRU) 键
  • allkeys-lfu:保留常用键;删除最不常用 (LFU) 键
  • volatile-lru:删除过期字段设置为 true 的最近最少使用的密钥。
  • volatile-lfu:删除过期字段设置为 true 的最不常用键。
  • allkeys-random:随机删除密钥以为添加的新数据腾出空间。
  • volatile-random:随机删除过期字段设置为 true 的密钥。
  • volatile-ttl:删除过期字段设置为 true 且剩余生存时间 (TTL) 值最短的最不常用键。

从 Redis 版本 3.0 到 7.0,默认的 maxmemory-policynoeviction。在 2.8 及更早版本中,默认值为 volatile-lru

你可以阅读Key Eviction docs了解更多。

【讨论】:

  • 我认为@BGPHiJACK 是在询问 redis 如何处理 CPU 峰值负载。我也很感兴趣,你能开发你说“当 CPU 使用率很高时,Redis [...] 将像任何其他应用程序一样运行”的部分吗?我的意思是,最大内存是一回事,有很好的记录,但 CPU 没那么多
  • 假设 CPU 处于 100% 并且我有 20K 个请求 <1 秒。在这些负载下,40K 请求是否等于 >1 秒(只是需要更长的时间才能完成)。这肯定会回答我所有的问题,内存策略是一个很好的接触! (只是总体上想知道最大负载如何影响环境可能的场景)
  • 刚刚编辑了我的答案,添加了一些关于 4.0 中单线程 Redis 的历史记录,以及它们在 7.0 和即将到来的 7.2 中所做的更改。然而,一般来说,如果您因 Redis 而遇到高 CPU,您可以查看 Redis 集群,它将对您的数据集进行分片,以便集群中的每个主节点只负责整个数据的一个子集,从而可能减少 CPU 和内存使用情况。
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2023-03-16
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多