我们正在部署一个只使用redis作为数据存储的大型web应用程序。我注意到我们的redis主机在EC2上的基准测试大约是每秒8000个事务,远远低于专用硬件上的基准测试。
我知道在像EC2这样的虚拟机上运行redis会有性能上的损失,但我希望在EC2的生产环境中部署Redis的人能给出一些你认为最有效的EC2设置来让Redis发挥更大的作用。
谢谢。
发布于 2013-05-07 02:55:26
EC2可能不是在虚拟化硬件上运行Redis的最佳环境,但它是一个流行的环境,要在这个平台上从Redis获得最好的性能,有许多要点需要了解。
我是http://redis.io/topics/benchmarks和http://redis.io/topics/latency的作者之一,这两本书涵盖了下面介绍的大部分主题。这只是主要观点的总结。
虚拟化收费
它不是特定于EC2的,但是在VM上运行时,Redis的速度要慢得多(就支持的最大吞吐量而言)。这是因为对于基本操作,Redis不会给处理客户端连接(如memcached或其他高效的键/值存储)所需的epoll/读/写系统调用增加太多开销。在VM上,系统调用通常更昂贵,并且它们代表了Redis活动的重要部分(尤其是在基准测试中)。在这种情况下,与裸机相比,最大吞吐量下降50%并不少见。
当然,这还取决于虚拟机管理程序的质量。对于EC2,使用Xen。
状态良好的基准测试
基准测试可能很棘手,特别是在EC2这样的平台上。经常忘记的一点是确保基准客户端和服务器的正确配置。例如,当目标是Redis服务器时,不要在CPU耗尽的微实例上运行redis-benchmark (这很可能会被Amazon限制)。为了获得良好的最大吞吐量,这两台机器同样重要。
实际上,要评估Redis的性能,您需要:
假设您有多个vCPU核心,
相同的计算机上远程(从不同的VM)运行redis-benchmark
因此,您可以评估和比较机器和网络的性能。
在EC2上,您将使用第二代M3实例(或高内存或集群计算实例)获得最佳结果,因此您可以受益于HVM (硬件虚拟化),而不是依赖于速度较慢的半虚拟化。
fork issue
这并不是EC2所特有的,而是Xen所特有的:在Xen上派生大型进程会非常慢(使用kvm看起来会更好)。对于Redis来说,如果您计划使用持久性,这将是一个大问题:两种持久性选项(RDB或AOF)都需要主线程来派生和启动后台保存或重写进程。
在某些情况下,fork延迟可能会冻结Redis事件循环几秒钟。Redis实例管理的内存越多,延迟越大。
在EC2上,请确保使用启用了HVM的实例(M3、高内存、集群),这将缓解该问题。
然后,如果您有很大的内存需求,并且您的应用程序可以容忍,那么可以考虑在同一台机器上运行几个较小的Redis实例,并对您的数据进行分片。它可以将由于fork操作而导致的延迟降低到可接受的水平。
持久性配置
这是从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是远程存储:它可能会占用分配给虚拟机的标准网络带宽,并影响Redis的最大吞吐量。如果您计划使用EBS,请考虑选择EBS优化选项,以便在标准网络和存储链路之间建立QoS。
最后,对于使用EC2的高性能实例,一种非常常见的设置是在主实例上停用持久性,并仅在从实例上激活它。它对数据的安全性可能较低,但它可以防止主服务器上的许多潜在延迟问题。
https://stackoverflow.com/questions/11765502
复制相似问题