我们正在运行一个web应用程序,并从memcached切换到redis (2.4)进行缓存。现在我们对redis的表现有些失望。Redis运行在同一台服务器上,我们只使用非常简单的GET和SET操作。对于一些大量使用缓存值的请求,我们有多达300个请求到redis,但是这些请求需要150 we。我们有大约200000个活动密钥,每秒大约有1000个redis请求。磁盘io、ram或cpu没有问题。由于我们现有的代码,我们不能简单地将redis请求分组在一起。Memcached的速度大约快了4倍。我们喜欢redis的地方是,我们不需要任何缓存升温,将来可能会使用更高级的数据存储功能。我们期望redis的表现类似于memcached。因此,也许我们忽略了配置中的一些内容,这基本上是默认配置。
您知道redis性能调优的最佳实践吗?
发布于 2013-05-30 19:18:42
首先,您可能需要阅读Redis基准页面。它提供了一个很好的总结要点,以检查调整Redis。
即使假设你不使用流水线,300得到150毫秒并不是那么有效。这意味着平均延迟是500 us。然而,它实际上取决于对象的大小。更大的对象,更多的延迟。在我非常老的2 GHz AMD盒上,我可以测量150个小对象的延迟时间(几个字节)。
要快速检查Redis实例的平均延迟,可以使用:
$ redis-cli --latency一定要使用最近的Redis版本(而不是2.4)来获得这个选项。注意: 2.4现在已经很老了,使用Redis 2.6 -如果需要编译您自己的Redis版本,这是非常简单的。
要快速运行基准测试来研究延迟,您可以启动:
$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes它以独特的连接运行,没有流水线,因此可以从吞吐量中推断延迟。尝试将这些基准测试的结果与应用程序测量的数字进行比较。
您可能需要检查以下几点:
为什么和memcached在一起更好?嗯,一个memcached实例肯定比单个Redis实例更具有可伸缩性,并且可能比单个Redis实例更有响应性,因为它可能运行在多个线程上。Redis是快速的,但单线程-所有命令的执行都是序列化的。因此,当命令正在进行连接时,所有其他客户端都必须等待--给定命令上的错误延迟也会影响所有挂起的命令。一般来说,在低吞吐量时,性能是可以比较的。
在1000 q/s ( Redis或memcached标准的低吞吐量)时,我要说,与Redis服务器本身相比,您的问题更可能发生在客户端(即选择客户端库、连接/断开等)。
最后,我要指出的是,如果您在每个HTTP请求中生成了大量的Redis查询,请考虑尽可能地将发送给Redis的命令流水线。开发高效的Redis应用程序确实是一个关键问题。
如果应用服务器与Redis位于同一个框中,则还可以使用unix域套接字代替TCP回送连接到Redis。它稍微提高了性能(在不使用流水线的情况下,吞吐量提高了50% )。
发布于 2014-05-18 07:56:10
检查redis是否正在使用OS交换内存。如果是这样的话,就会增加延迟。要找到答案,请在这里搜索“交换诱导的延迟”:http://redis.io/topics/latency
如果您的服务器硬件具有NUMA功能,最好使用numactl启动redis-server。不要忘记在sysctl中关闭区域回收模式(vm.zone_reclaim_mode=0),如果您使用NUMA开始使用redis-server。
发布于 2015-07-11 07:19:35
尝试在Lua脚本中编写300获取请求的脚本。它应该工作得更快,因为即使您的客户端代码在本地运行到Redis,在触摸TCP/IP堆栈时也节省了时间。
https://stackoverflow.com/questions/16841469
复制相似问题