Performance Redis性能调整

Performance Redis性能调整,performance,caching,web-applications,redis,Performance,Caching,Web Applications,Redis,我们正在运行一个web应用程序,并从memcached切换到redis(2.4)进行缓存。现在我们对redis的性能有些失望。Redis运行在同一台服务器上,我们只使用非常简单的GET和SET操作。在一些大量使用缓存值的请求中,我们最多有300个GET请求发送到redis,但这些请求最多需要150毫秒。我们有大约200000个活动密钥,每秒约1000个redis请求。磁盘io、ram或cpu没有问题。由于我们现有的代码,我们不能简单地将redis请求分组在一起。Memcached的速度快了大约4

我们正在运行一个web应用程序,并从memcached切换到redis(2.4)进行缓存。现在我们对redis的性能有些失望。Redis运行在同一台服务器上,我们只使用非常简单的GET和SET操作。在一些大量使用缓存值的请求中,我们最多有300个GET请求发送到redis,但这些请求最多需要150毫秒。我们有大约200000个活动密钥,每秒约1000个redis请求。磁盘io、ram或cpu没有问题。由于我们现有的代码,我们不能简单地将redis请求分组在一起。Memcached的速度快了大约4倍。 我们喜欢redis的地方在于,我们不需要任何缓存预热,将来可以使用更高级的数据存储功能。我们期望redis的性能与memcached类似。因此,也许我们在配置中遗漏了一些东西,这基本上是默认配置


您知道redis性能调整的最佳实践吗?首先,您可能需要阅读。它很好地总结了调优Redis时需要检查的要点

即使假设您不使用流水线,150毫秒内300次也不是那么有效。这意味着平均延迟为500 us。但是,它实际上取决于对象的大小。对象越大,延迟越长。在我非常旧的2GHz AMD盒上,我可以测量小对象(几个字节)的150 us延迟

要快速检查Redis实例的平均延迟,可以使用:

$ redis-cli --latency
确保使用最新的Redis版本(不是2.4)来获得此选项。 注意:2.4现在已经很老了,使用Redis2.6——如果需要,可以编译自己的Redis版本,这非常简单

要快速运行基准以研究延迟,您可以启动:

$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes
它使用唯一的连接运行,没有管道,因此可以从吞吐量中推断延迟。尝试将这些基准测试的结果与应用程序测量的数据进行比较

您可能需要检查以下几点:

  • 您使用哪个Redis客户端库?使用哪种开发语言?对于某些脚本语言,您需要安装hiredis模块以获得高效的客户端
  • 你的机器是虚拟机吗?在哪个操作系统上
  • 与Redis的连接是否持久?(即,不应在应用服务器的每个HTTP请求上连接/断开连接)

为什么使用memcached会更好?好的,单个memcached实例当然更具可伸缩性,并且可能比单个Redis实例更具响应性,因为它可能运行在多个线程上。Redis很快,但是是单线程的——所有命令的执行都是序列化的。因此,当一个命令正在进行连接时,所有其他客户端都必须等待—给定命令上的错误延迟也会影响所有挂起的命令。一般来说,在低吞吐量下,性能是可比的

在1000 q/s(Redis或memcached标准的低吞吐量)时,我想说,与Redis服务器本身相比,您的问题更可能出现在客户端(即选择客户端库、连接/断开连接等…)

最后,我要提到的是,如果您在HTTP请求中生成大量的ReDIS查询,请考虑您尽可能地向ReDIS发送的命令。开发高效的Redis应用程序确实是一个关键点


如果您的应用程序服务器与Redis位于同一个框中,您也可以使用unix域套接字而不是TCP环回来连接到Redis。它略微提高了性能(不使用流水线时,吞吐量可提高50%)

检查redis是否使用操作系统交换内存。如果是这样,则会增加延迟。 要查找,请在此处搜索“交换引起的延迟”:

如果您的服务器硬件支持NUMA,最好使用numactl启动redis服务器。
如果使用NUMA启动redis server,请不要忘记在sysctl中关闭区域回收模式(vm.zone\u reclain\u mode=0)。

尝试在Lua脚本中编写300 GET请求的脚本。它应该工作得更快,因为即使您的客户端代码在本地运行到Redis,您也可以节省接触TCP/IP堆栈的时间。

Redis与what运行在同一台服务器上?客户端,还是运行memcached的客户端?Redis请求的150毫秒听起来像是在使用交换/磁盘,而不是内存,还是说所有300个请求的150毫秒?这是一个每秒大约有100个apache请求的web应用程序。Redis与web应用程序本身和mysql数据库服务器运行在同一台主机上,但我们计划很快将apache迁移到3台loadbalanced服务器上。当前服务器有大约64GB的RAM,redis需要大约100MB。有足够的可用ram,cpu或io没有问题。服务器不交换到磁盘。是的,我的意思是300个请求需要150毫秒,但memcached在相同条件下只需要40毫秒。我唯一能想到的是,如果你对所有请求使用到Redis的共享连接,而不是每个web请求使用一个连接,那么Redis可能会有延迟问题,但每秒1000个请求时,你不应该看到那么糟糕的延迟。对不起,我今天的指导没有什么真正的帮助:)“所有命令的执行都是序列化的”:您能提供关于这条语句的更多细节吗?对我来说,这听起来像是你在说,当一个命令正在运行时,没有其他命令可以运行,即使在其他连接上也不能运行。这就是redis实现命令原子性的方式吗?没错。看见