2012-08-01 64 views
17

我们正在部署一个仅使用redis作为数据存储的大型Web应用程序。我注意到我们的redis master的基准测试在EC2上每秒大约8000次交易,远远低于专用硬件上的基准测试。Redis服务器的最佳EC2设置

我知道在像EC2这样的虚拟机上运行Redis会有性能损失,但我会喜欢在EC2上的生产环境中部署Redis的人的一些指示,指出EC2设置对于哪些EC2设置最有效更多来自redis。

谢谢。

+0

什么是基准测试的EC2实例类型?基准测试的机器是什么?它位于哪里?性能(CPU,负载平均,内存利用率,网络流量)与服务器(redis和运行基准测试)一样吗?最后,redis服务器上的磁盘IO速率是多少? – 2013-04-30 08:05:29

+0

可能想看看这个:http://redis.io/topics/latency本文还讨论了虚拟化环境,XEN管理程序和EC2 – 2013-05-01 08:18:12

+0

考虑对托管的redis使用elasticache:https://aws.amazon。 com/elasticache/ – JDiMatteo 2017-07-20 04:04:34

回答

37

EC2可能不是在虚拟化硬件上运行Redis的最佳环境,但它非常受欢迎,并且在此平台上有许多关于从Redis获得最佳性能的知识点。

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

虚拟化收费

它不是具体到EC2,但在虚拟机上运行(在最大支持吞吐量项)时的Redis是显著慢。这是由于基本操作的事实,Redis不会为处理客户端连接(如memcached或其他高效的键/值存储)所需的epoll/read/write系统调用增加很多开销。系统调用通常在虚拟机上更昂贵,并且它们是Redis活动的重要组成部分(特别是在基准测试中)。在这种情况下,与裸机相比,最大吞吐量下降50%并不罕见。

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

标杆状况良好

基准可能会非常棘手,尤其是在像EC2的平台。经常被遗忘的一点是确保基准客户端和服务器的适当配置。例如,不要在CPU不足的微型实例(可能会被亚马逊限制)上运行redis-benchmark,而针对Redis服务器。两台机器对于获得最佳的最大吞吐量同样重要。

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

  • 运行Redis的基准测试本地(同一台机器不是在服务器上),假设你有一个以上的虚拟CPU核心。

  • 运行Redis的基准测试远程(从不同的虚拟机),一台机器,其QoS配置等同于服务器机器

所以,你可以评估和比较的机器和网络的性能上。

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

叉问题

这不是具体到EC2,但Xen的:分叉大的过程可以在Xen上很慢(它看起来更好地与KVM)。对于Redis来说,如果您打算使用持久性,这是一个大问题:两个持久性选项(RDB或AOF)都要求主线程分叉并启动背景保存或重写过程。

在某些情况下,分叉延迟可以将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(或者非常低的值)。不要使用旧的内核版本:它们在执行低swappiness时非常糟糕(导致在写入大文件时交换)。

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

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

临时存储速度通常更快,您可能会比使用EBS时遇到的问题更少,但在磁盘故障或主机重新启动等情况下,您可以轻松地丢失数据...您可以想象将RDB快照置于临时存储,然后将结果文件复制到EBS目录,作为性能和稳健性之间的折衷。

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

最后,对于性能要求较高的EC2实例,非常常见的设置是取消激活主设备上的持久性,并且仅在从设备实例上激活它。数据可能不太安全,但可以防止主服务器上出现很多潜在的延迟问题。

+0

Redis实验室在这里也有一些关于此的说法:http://redislabs.com/blog/5-tips-for-running-redis-over-aws – Mulkave 2014-09-05 14:58:15

相关问题