
解锁百万每秒请求数:体验 Valkey 三倍速
计划于 2024 年 9 月发布的 Valkey 8.0 将通过多项改进带来重大的性能增强,其中包括全新的多线程架构。此次更新旨在显著提高吞吐量并降低各种硬件配置下的延迟。请继续阅读,了解更多关于创新型 I/O 线程实现及其对性能和效率的影响。本篇是系列文章中的第一部分。下一篇将深入探讨新的预取机制及其对性能的影响。
我们对性能和效率的承诺
在 AWS,我们拥有数十万使用 Amazon ElastiCache 和 Amazon MemoryDB 的客户。我们不断从最终用户那里听到的反馈是,他们需要更好的绝对性能,并希望从其集群中榨取更多性能。
为了满足这些性能和效率需求,我们致力于通过我们称之为增强型 I/O 和多路复用的功能,来改进 ElastiCache 和 MemoryDB 服务的 MT 性能。今天,我们很高兴能够深入探讨我们如何通过为 Valkey 项目贡献一项重大的性能改进来分享我们在此性能之旅中的经验。
高容量分片的好处
Valkey 提升性能和内存的常见方法是通过向集群添加更多分片来横向扩展。然而,更强大节点的可用性为应用程序设计提供了额外的灵活性。更高容量的分片可以增加集群容量,提高对请求激增的弹性,并降低高百分位下的延迟。这种方法对于那些工作负载不适合横向扩展的 Valkey 用户特别有利,例如热点键和无法有效分布到多个分片的大型集合。
横向扩展的另一个挑战来自多键操作,例如 MGET。这些多键操作要求所有涉及的键都驻留在同一个槽中,这通常导致用户只使用少量槽,从而严重限制了集群的可扩展性潜力。更大的分片可以通过在单个节点中容纳更多键和更大的集合来缓解这些限制。
尽管更大的分片提供了这些好处,但也伴随着权衡。对于非常大的实例进行完全同步可能存在风险,并且丢失一个大型分片可能比丢失一个小型分片影响更大。相反,管理一个拥有过多小型实例的集群可能会在操作上变得复杂。最佳配置取决于具体的工作负载,需要在横向扩展和使用更大分片之间取得仔细的平衡。
Valkey 性能重大升级
从版本 8 开始,Valkey 用户将受益于多线程性能的提升,这得益于新的多线程架构,该架构可以提高各种硬件类型的吞吐量并降低延迟。
数据表明,新的 I/O 线程方法带来了显著的性能提升。与 Valkey 7.2 相比,吞吐量增加了约 230%,从每秒 36 万请求增加到 119 万请求。所有百分位的延迟指标均有所改善,平均延迟从 1.792 毫秒降低了 69.8% 至 0.542 毫秒。
使用 8 个 I/O 线程、300 万键数据库大小、512 字节值大小,以及 650 个客户端使用 AWS EC2 C7g.16xlarge 实例运行顺序 SET 命令进行测试。请注意,这些数字包含了将在下一篇博客文章中描述的预取(Prefetch)更改。
性能不失简洁
Valkey 致力于通过尽可能在单个线程中执行代码来保持简洁。这确保了 API 可以持续发展,而无需使用复杂的同步机制并避免竞态条件。我们新的多线程方法是基于这一长期存在的架构原则设计的,我们认为这是 Valkey 的正确架构。它利用最少的同步机制,并使 Valkey 命令执行保持单线程、简单,并为未来的增强做好了准备。
高层设计
上图描绘了 Valkey 8 中 I/O 线程的高层设计。I/O 线程是工作线程,它们从主线程接收要执行的任务。一个任务可能包括从客户端读取和解析命令、将响应写回客户端、轮询 TCP 连接上的 I/O 事件,或释放内存。当 I/O 线程忙于处理 I/O 时,主线程能够有更多时间执行命令。
主线程协调所有分配给 I/O 线程的任务,确保不发生竞态条件。主线程可以根据当前负载调整活跃 I/O 线程的数量,以确保底层硬件的有效利用。尽管 I/O 线程具有动态性,但主线程仍保持线程亲和性,确保在可能的情况下,相同的 I/O 线程处理同一客户端的 I/O,以提高内存访问局部性。
套接字轮询系统调用,例如 epoll_wait
,是开销很大的过程。当仅由主线程执行时,epoll_wait
会消耗超过 20% 的时间。因此,我们决定通过以下方式将 epoll_wait
的执行卸载到 I/O 线程:为避免竞态条件,在任何给定时间,最多只有一个线程(无论是 I/O 线程还是主线程)执行 epoll_wait
。I/O 线程从不在 epoll
上休眠,并且每当有待处理的 I/O 操作或要执行的命令时,epoll_wait
调用都会由主线程调度到 I/O 线程。在所有其他情况下,主线程会以原始 Valkey 实现中的等待时间执行 epoll_wait
。
此外,在执行命令之前,主线程会执行一个新的过程,即预取命令键(prefetch-commands-keys),旨在减少在主字典上执行命令时所需的外部内存访问次数。该过程中使用的技术将在我们的下一篇博客文章中详细解释。
测试与可用性
增强的性能将在 Valkey 的首个发布候选版本中提供测试,该版本今天即可获取。