19

我们正在部署一个仅使用 redis 作为数据存储的大型 Web 应用程序。我注意到我们的 redis master 在 EC2 上的基准是每秒大约 8000 个事务,远远低于专用硬件上的基准。

我知道在 EC2 等虚拟机上运行 Redis 会降低性能,但我希望在 EC2 上的生产环境中部署 Redis 的人提供一些关于您发现哪种 EC2 设置最有效地从 Redis 中获得更多收益的建议.

谢谢。

4

1 回答 1

42

EC2 可能不是在虚拟化硬件上运行 Redis 的最佳环境,但它是一种流行的环境,要在该平台上充分利用 Redis,需要了解许多要点。

我是http://redis.io/topics/benchmarkshttp://redis.io/topics/latency的作者之一,它们涵盖了我在下面介绍的大部分主题。这只是对要点的总结。

虚拟化收费

它并不特定于 EC2,但在 VM 上运行时 Redis 的速度要慢得多(就支持的最大吞吐量而言)。这是因为对于基本操作,Redis 不会为处理客户端连接所需的 epoll/read/write 系统调用(如 memcached 或其他高效的键/值存储)增加太多开销。系统调用在 VM 上通常更昂贵,它们代表了 Redis 活动的重要部分(尤其是在基准测试中)。在这种情况下,与裸机相比,最大吞吐量下降 50% 并不少见。

当然,这也取决于管理程序的质量。对于 EC2,使用 Xen。

在良好条件下进行基准测试

基准测试可能很棘手,尤其是在 EC2 这样的平台上。经常忘记的一点是确保基准客户端和服务器的正确配置。例如,在针对您的 Redis 服务器时,不要在 CPU 匮乏的微实例(可能会被亚马逊限制)上运行 redis-benchmark。两台机器对于获得良好的最大吞吐量同样重要。

实际上,要评估 Redis 的性能,您需要:

  • 假设您有多个 vCPU 内核,在本地运行 redis-benchmark(与服务器在同一台机器上)。

  • 在 QoS 配置等同于服务器机器的机器上远程运行 redis-benchmark(从不同的 VM)

因此,您可以评估和比较机器和网络的性能。

在 EC2 上,您将使用第二代 M3 实例(或高内存或集群计算实例)获得最佳结果,因此您可以受益于 HVM(硬件虚拟化),而不是依赖较慢的半虚拟化。

分叉问题

这不是 EC2 特有的,而是 Xen 特有的:在 Xen 上分叉一个大型进程可能真的很慢(使用 kvm 看起来更好)。对于 Redis,如果您打算使用持久性,这是一个大问题:两种持久性选项(RDB 或 AOF)都需要主线程分叉并启动后台保存或重写进程。

在某些情况下,fork 延迟可能会使 Redis 事件循环冻结几秒钟。Redis 实例管理的内存越多,延迟就越多。

在 EC2 上,请务必使用启用 HVM 的实例(M3、高内存、集群),它将缓解该问题。

然后,如果您有大量内存需求,并且您的应用程序可以容忍它,请考虑在同一台机器上运行几个较小的 Redis 实例,并对您的数据进行分片。它可以将由于分叉操作导致的延迟降低到可接受的水平。

持久化配置

这是从 Redis(在 VM 和裸机上)获得良好性能的关键点。所以请花时间仔细阅读http://redis.io/topics/persistence

如果您使用 RDB,请记住,一旦保存后台进程被分叉,内存写入时复制机制将开始复制页面。所以你需要保证 Redis 本身有足够的内存,加上一些余量来应付 COW。额外内存的数量取决于您的工作量。您在实例中写入的越多,您需要的额外内存就越多。

请注意,写入文件也可能会消耗一些内存(因为文件系统缓存),因此在 Redis 后台保存期间,您需要考虑 Redis 内存、COW 开销和转储文件的大小。

运行 Redis 服务器的机器绝不能交换。如果是这样,结果将是灾难性的。与其他一些商店相反,Redis 对虚拟内存不友好。

在 Linux 中,一定要设置合理的系统参数:vm.overcommit_memory=1 和 vm.swappiness=0(或者一个非常低的值)。不要使用旧的内核版本:它们在执行低交换性方面非常糟糕(导致在写入大文件时进行交换)。

如果您使用 AOF,请查看 fsync 选项。这是原始性能和写入操作的持久性之间的权衡。您需要做出选择并定义策略。

您还需要熟悉 EC2 存储选项。在某些 VM 上,您可以在临时存储和 EBS 之间进行选择。在其他一些上,您只有 EBS。

临时存储通常更快,并且您可能会遇到比 EBS 更少的问题,但是在磁盘故障或主机重启等情况下您可以轻松丢失数据......您可以想象将 RDB 快照放在临时存储上,并且然后将生成的文件复制到 EBS 目录,作为性能和稳健性之间的权衡。

EBS 是远程存储:它可能会占用分配给 VM 的标准网络带宽,并影响 Redis 的最大吞吐量。如果您计划使用 EBS,请考虑选择“EBS 优化”选项以在标准网络和存储链路之间建立 QoS。

最后,对于使用 EC2 的性能要求高的实例,一个非常常见的设置是停用主实例上的持久性,并且仅在从属实例上激活它。数据可能不太安全,但它可以防止主服务器上的许多潜在延迟问题。

于 2013-05-06T18:55:26.323 回答