Redis基准参数怎么查看

redis 自带了一个叫redis-benchmark的工具来模拟 n 个客户端同时发出 m 个请求。 (类似于 apacheab程序)。使用命令 redis-benchmark -h 可以查看基准测试参数。

以下参数被支持:    Usage: redis-benchmark [-h ] [-p ] [-c ] [-n  [-k ]     -h       Server hostname (default 127.0.0.1)     -p           Server port (default 6379)     -s         Server socket (overrides host and port)     -c        Number of parallel connections (default 50)     -n       Total number of requests (default 10000)     -d           Data size of SET/GET value in bytes (default 2)     -k        1=keep alive 0=reconnect (default 1)     -r    Use random keys for SET/GET/INCR, random values for SADD      Using this option the benchmark will get/set keys      in the form mykey_rand:000000012456 instead of constant      keys, the  argument determines the max      number of values for the random number. For instance      if set to 10 only rand:000000000000 - rand:000000000009      range will be allowed.     -P         Pipeline  requests. Default 1 (no pipeline).     -q                 Quiet. Just show query/sec values     --csv              Output in CSV format     -l                 Loop. Run the tests forever     -t          Only run the comma separated list of tests. The test                        names are the same as the ones produced as output.     -I                 Idle mode. Just open N idle connections and wait.

登录后复制

你需要在基准测试之前启动一个 Redis 实例。一般这样启动测试:

redis-benchmark -q -n 100000

登录后复制

这个工具使用起来非常方便,同时你可以使用自己的基准测试工具, 不过开始基准测试时候,我们需要注意一些细节。

只运行一些测试用例的子集

每次运行redis-benchmark时不必默认运行所有测试。你可以使用参数 “-t” 来指定需要运行的测试用例,例如以下示例:

$ redis-benchmark -t set,lpush -n 100000 -qSET: 74239.05 requests per secondLPUSH: 79239.30 requests per second

登录后复制

在上面的测试中,我们只运行了 SET 和 LPUSH 命令, 并且运行在安静模式中(使用-q参数)。

也可以直接指定命令来直接运行,比如下面的范例:

$ redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"script load redis.call('set','foo','bar'): 69881.20 requests per second

登录后复制

选择测试键的范围大小

默认情况下面,基准测试使用单一的 key。在一个基于内存的数据库里, 单一 key 测试和真实情况下面不会有巨大变化。当然,扩大密钥范围可以模拟真实情况下的缓存未命中。

这时候我们可以使用-r命令。例如,如果我们希望连续进行 100 万次 SET 操作,每次使用 10 万个随机 key,可以使用以下命令:

$ redis-cli flushallOK$ redis-benchmark -t set -r 100000 -n 1000000====== SET ======  1000000 requests completed in 13.86 seconds  50 parallel clients  3 bytes payload  keep alive: 199.76% `<=` 1 milliseconds99.98% `<=` 2 milliseconds100.00% `<=` 3 milliseconds100.00% `<=` 3 milliseconds72144.87 requests per second$ redis-cli dbsize(integer) 99993

登录后复制

使用 pipelining

默认情况下,每个客户端都是在一个请求完成之后才发送下一个请求 (benchmark 会模拟 50 个客户端除非使用-c指定特别的数量), 这意味着服务器几乎是按顺序读取每个客户端的命令。Also RTT is payed as well.

真实世界会更复杂,Redis 支持/topics/pipelining,使得可以一次性执行多条命令成为可能。使用Redis pipelining可以增加服务器的每秒事务处理率。

下面这个案例是在 Macbook air 11″ 上使用 pipelining 组织 16 条命令的测试范例:

$ redis-benchmark -n 1000000 -t set,get -P 16 -qSET: 403063.28 requests per secondGET: 508388.41 requests per second

登录后复制

记得在多条命令需要处理时候使用 pipelining。

陷阱和错误的认识

第一点是显而易见的:基准测试的黄金准则是使用相同的标准。进行 Redis 不同版本的测试时,可以采取同等任务量测试或使用相同参数进行测试。 如果把 Redis 和其他工具测试,那就需要小心功能细节差异。

Redis 是一个服务器:所有的命令都包含网络或 IPC 消耗。这意味着和它和 SQLite, Berkeley DB, Tokyo/Kyoto Cabinet 等比较起来无意义, 因为大部分的消耗都在网络协议上面。

Redis 的大部分常用命令都有确认返回。例如,MongoDB的写操作不会返回确认,而有些数据存储系统则会。把 Redis 和其他单向调用命令存储系统比较意义不大。

简单的循环操作 Redis 其实不是对 Redis 进行基准测试,而是测试你的网络(或者 IPC)延迟。想要真正测试 Redis,需要使用多个连接(比如 redis-benchmark), 或者使用 pipelining 来聚合多个命令,另外还可以采用多线程或多进程。

Redis 是一个内存数据库,同时提供一些可选的持久化功能。 如果你想和一个持久化服务器(MySQL, PostgreSQL 等等) 对比的话, 那你需要考虑启用 AOF 和适当的 fsync 策略。

Redis 是单线程服务。它并没有设计为多 CPU 进行优化。如果想要从多核获取好处, 那就考虑启用多个实例吧。将单实例 Redis 和多线程数据库对比是不公平的。

一个普遍的误解是 redis-benchmark 特意让基准测试看起来更好, 所表现出来的数据像是人造的,而不是真实产品下面的。

Redis-benchmark 工具能够迅速简便地计算出在特定硬件条件下机器的性能参数。 但是,通常情况下面这并不是 Redis 服务器可以达到的最大吞吐量。使用 pipelining 和更快的客户端(如 hiredis),能够实现更高的吞吐量。 redis-benchmark 默认情况下面仅仅使用并发来提高吞吐量(创建多条连接)。它没有采用pipelining或其他并发技术,只是使用了多个连接而非多线程。

如果想使用 pipelining 模式来进行基准测试(了达到更高吞吐量),可以使用-P参数。很多在生产环境中使用 Redis 的应用采用了这种方案以提高性能。

最后,基准测试需要使用相同的操作和数据来对比,如果这些不一样, 那么基准测试是无意义的。

例如,Redis和memcached可以在单线程模式下进行GET/SET操作的比较。 两者都是内存数据库,协议也基本相同,甚至把多个请求合并为一条请求的方式也类似 (pipelining)。在使用相同数量的连接后,这个对比是很有意义的。

下面这个很不错例子是在 Redis(antirez)和 memcached(dormando)测试的。

antirez 1 – On Redis, Memcached, Speed, Benchmarks and The Toilet

dormando – Redis VS Memcached (slightly better bench)

antirez 2 – An update on the Memcached/Redis benchmark

你可以发现相同条件下面最终结果是两者差别不大。请注意最终测试时候, 两者都经过了充分优化。

最后,当特别高性能的服务器在基准测试时候(比如 Redis、memcached 这类), 很难让服务器性能充分发挥,通常情况下,客户端回事瓶颈限制而不是服务器端。 在这种情况下面,客户端(比如 benchmark 程序自身)需要优化,或者使用多实例, 从而能达到最大的吞吐量。

影响 Redis 性能的因素

有几个因素直接决定 Redis 的性能。它们能够改变基准测试的结果, 所以我们必须注意到它们。通常情况下, Redis 的默认参数已经足够提供高效的性能,因此不需要进行调优。

网络带宽和延迟通常是最大短板。我建议在进行基准测试之前先使用 ping 命令对服务端和客户端之间的延迟进行检测。根据带宽,可以计算出最大吞吐量。 比如将 4 KB 的字符串塞入 Redis,吞吐量是 100000 q/s,那么实际需要 3.2 Gbits/s 的带宽,所以需要 10 GBits/s 网络连接, 1 Gbits/s 是不够的。在许多在线服务中,网络带宽往往比 CPU 更早地成为限制Redis吞吐量的因素。 为了达到高吞吐量突破 TCP/IP 限制,最后采用 10 Gbits/s 的网卡, 或者多个 1 Gbits/s 网卡。

CPU 是另外一个重要的影响因素,由于是单线程模型,Redis 更喜欢大缓存快速 CPU, 而不是多核。这种场景下面,比较推荐 Intel CPU。AMD CPU 可能只有 Intel CPU 的一半性能(通过对 Nehalem EP/Westmere EP/Sandy 平台的对比)。如果其他条件相同,那么CPU就是redis-benchmark的瓶颈。

在小对象存取时候,内存速度和带宽看上去不是很重要,但是对大对象(> 10 KB), 它就变得重要起来。一般来说,人们不会为了优化 Redis 购买更高性能的内存模块。

Redis 在 VM 上会变慢。虚拟化对普通操作会有额外的消耗,Redis 对系统调用和网络终端不会有太多的 overhead。特别关注延迟的情况下,建议将 Redis 部署在物理服务器上运行。在最先进的虚拟化设备(VMWare)上面,redis-benchmark 的测试结果比物理机器上慢了一倍,很多 CPU 时间被消费在系统调用和中断上面。

如果服务器和客户端都运行在同一个机器上面,那么 TCP/IP loopback 和 unix domain sockets 都可以使用。对 Linux 来说,使用 unix socket 可以比 TCP/IP loopback 快 50%。redis-benchmark 默认使用 TCP/IP 回环接口。

当使用大量 pipelining 时,Unix 域套接字的好处就变得不那么显著了。

当使用网络连接时,并且以太网网数据包在 1500 bytes 以下时, 将多条命令包装成 pipelining 可以大大提高效率。事实上,处理 10 bytes,100 bytes, 1000 bytes 的请求时候,吞吐量是差不多的,详细可以见下图。

Redis基准参数怎么查看

Redis 的性能在多核 CPU 服务器上还取决于 NUMA 配置和处理器绑定位置。Redis-benchmark的最显著的影响是它会随机地利用CPU核心。为了获得精准的结果, 需要使用固定处理器工具(在 Linux 上可以使用 taskset 或 numactl)。 最有效的办法是将客户端和服务端分离到两个不同的 CPU 来高校使用三级缓存。 这里有一些使用 4 KB 数据 SET 的基准测试,针对三种 CPU(AMD Istanbul, Intel Nehalem EX, 和 Intel Westmere)使用不同的配置。请注意, 这不是针对 CPU 的测试。

Redis基准参数怎么查看

在高配置下面,客户端的连接数也是一个重要的因素。Redis 的事件循环得益于 epoll/kqueue,因此具有很高的可扩展性。Redis 已经在超过 60000 连接下面基准测试过, 仍然可以维持 50000 q/s。一条经验法则是,30000 的连接数只有 100 连接的一半吞吐量。 下面有一个关于连接数和吞吐量的测试。

Redis基准参数怎么查看

在高配置下面,可以通过调优 NIC 来获得更高性能。最高性能在绑定 Rx/Tx 队列和 CPU 内核下面才能达到,还需要开启 RPS(网卡中断负载均衡)。更多信息可以在thread。Jumbo frames 还可以在大对象使用时候获得更高性能。

在不同平台下面,Redis 可以被编译成不同的内存分配方式(libc malloc, jemalloc, tcmalloc),他们在不同速度、连续和非连续片段下会有不一样的表现。若非编译自行进行的 Redis,可用 INFO 命令验证内存分配方式。 请注意,大部分基准测试不会长时间运行来感知不同分配模式下面的差异, 只能通过生产环境下面的 Redis 实例来查看。

其他需要注意的点

任何基准测试的一个重要目标是获得可重现的结果,这样才能将此和其他测试进行对比。

一个好的实践是尽可能在隔离的硬件上面测试。需要检查基准测试是否受到其他服务器活动的影响,如果无法实现的话。

有些配置(桌面环境和笔记本,有些服务器也会)会使用可变的 CPU 分配策略。 这种策略可以在 OS 层面配置。有些 CPU 型号相对其他能更好的调整 CPU 负载。 为了达到可重现的测试结果,最好在做基准测试时候设定 CPU 到最高使用限制。

一个重要因素是配置尽可能大内存,千万不要使用 SWAP。注意 32 位和 64 位 Redis 有不同的内存限制。

注意在执行基准测试时,如果使用了 RDB 或 AOF,请避免同时进行其他 I/O 操作。 避免将 RDB 或 AOF 文件放到 NAS 或 NFS 共享或其他依赖网络的存储设备上面(比如 Amazon EC2 上 的 EBS)。

将 Redis 日志级别设置到 warning 或者 notice。避免将日志放到远程文件系统。

避免使用检测工具,它们会影响基准测试结果。查看服务器状态可使用 INFO 命令,但使用 MONITOR 命令会严重影响测试准确性。

不同云主机和物理机器上的基准测试结果

这些测试模拟了 50 客户端和 200w 请求。

使用了 Redis 2.6.14。

使用了 loopback 网卡。

key 的范围是 100 w。

同时测试了 有 pipelining 和没有的情况(16 条命令使用 pipelining)。

Intel(R) Xeon(R) CPU E5520 @ 2.27GHz (with pipelining)

$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -P 16 -qSET: 552028.75 requests per secondGET: 707463.75 requests per secondLPUSH: 767459.75 requests per secondLPOP: 770119.38 requests per second

登录后复制

Intel(R) Xeon(R) CPU E5520 @ 2.27GHz (without pipelining)

$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -qSET: 122556.53 requests per secondGET: 123601.76 requests per secondLPUSH: 136752.14 requests per secondLPOP: 132424.03 requests per second

登录后复制

Linode 2048 instance (with pipelining)

$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -q -P 16SET: 195503.42 requests per secondGET: 250187.64 requests per secondLPUSH: 230547.55 requests per secondLPOP: 250815.16 requests per second

登录后复制

Linode 2048 instance (without pipelining)

$ ./redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop -qSET: 35001.75 requests per secondGET: 37481.26 requests per secondLPUSH: 36968.58 requests per secondLPOP: 35186.49 requests per second

登录后复制

更多使用 pipeline 的测试

$ redis-benchmark -n 100000====== SET ======  100007 requests completed in 0.88 seconds  50 parallel clients  3 bytes payload  keep alive: 158.50% <= 0 milliseconds99.17% <= 1 milliseconds99.58% <= 2 milliseconds99.85% <= 3 milliseconds99.90% <= 6 milliseconds100.00% <= 9 milliseconds114293.71 requests per second====== GET ======  100000 requests completed in 1.23 seconds  50 parallel clients  3 bytes payload  keep alive: 143.12% <= 0 milliseconds96.82% <= 1 milliseconds98.62% <= 2 milliseconds100.00% <= 3 milliseconds81234.77 requests per second====== INCR ======  100018 requests completed in 1.46 seconds  50 parallel clients  3 bytes payload  keep alive: 132.32% <= 0 milliseconds96.67% <= 1 milliseconds99.14% <= 2 milliseconds99.83% <= 3 milliseconds99.88% <= 4 milliseconds99.89% <= 5 milliseconds99.96% <= 9 milliseconds100.00% <= 18 milliseconds68458.59 requests per second====== LPUSH ======  100004 requests completed in 1.14 seconds  50 parallel clients  3 bytes payload  keep alive: 162.27% <= 0 milliseconds99.74% <= 1 milliseconds99.85% <= 2 milliseconds99.86% <= 3 milliseconds99.89% <= 5 milliseconds99.93% <= 7 milliseconds99.96% <= 9 milliseconds100.00% <= 22 milliseconds100.00% <= 208 milliseconds88109.25 requests per second====== LPOP ======  100001 requests completed in 1.39 seconds  50 parallel clients  3 bytes payload  keep alive: 154.83% <= 0 milliseconds97.34% <= 1 milliseconds99.95% <= 2 milliseconds99.96% <= 3 milliseconds99.96% <= 4 milliseconds100.00% <= 9 milliseconds100.00% <= 208 milliseconds71994.96 requests per second

登录后复制

注意:包大小从 256 到 1024 或者 4096 bytes 不会改变结果的量级 (但是到 1024 bytes 后,GETs 操作会变慢)。同样的,50 到 256 客户端的测试结果相同。当使用10个客户端时,总吞吐量无法达到最大吞吐量。

不同机器可以获的不一样的结果,下面是Intel T5500 1.66 GHz 在 Linux 2.6下面的结果:

$ ./redis-benchmark -q -n 100000SET: 53684.38 requests per secondGET: 45497.73 requests per secondINCR: 39370.47 requests per secondLPUSH: 34803.41 requests per secondLPOP: 37367.20 requests per second

登录后复制

另外一个是 64 位 Xeon L5420 2.5 GHz 的结果:

$ ./redis-benchmark -q -n 100000PING: 111731.84 requests per secondSET: 108114.59 requests per secondGET: 98717.67 requests per secondINCR: 95241.91 requests per secondLPUSH: 104712.05 requests per secondLPOP: 93722.59 requests per second

登录后复制

高性能硬件下面的基准测试

Redis2.4.2

默认连接数,数据包大小 256 bytes。

Linux 是SLES10 SP3 2.6.16.60-0.54.5-smp,CPU 是 2 xIntel X5670 @ 2.93 GHz。

固定 CPU,但是使用不同 CPU 内核。

使用 unix domain socket:

$ numactl -C 6 ./redis-benchmark -q -n 100000 -s /tmp/redis.sock -d 256PING (inline): 200803.22 requests per secondPING: 200803.22 requests per secondMSET (10 keys): 78064.01 requests per secondSET: 198412.69 requests per secondGET: 198019.80 requests per secondINCR: 200400.80 requests per secondLPUSH: 200000.00 requests per secondLPOP: 198019.80 requests per secondSADD: 203665.98 requests per secondSPOP: 200803.22 requests per secondLPUSH (again, in order to bench LRANGE): 200000.00 requests per secondLRANGE (first 100 elements): 42123.00 requests per secondLRANGE (first 300 elements): 15015.02 requests per secondLRANGE (first 450 elements): 10159.50 requests per secondLRANGE (first 600 elements): 7548.31 requests per second

登录后复制

使用 TCP loopback:

$ numactl -C 6 ./redis-benchmark -q -n 100000 -d 256PING (inline): 145137.88 requests per secondPING: 144717.80 requests per secondMSET (10 keys): 65487.89 requests per secondSET: 142653.36 requests per secondGET: 142450.14 requests per secondINCR: 143061.52 requests per secondLPUSH: 144092.22 requests per secondLPOP: 142247.52 requests per secondSADD: 144717.80 requests per secondSPOP: 143678.17 requests per secondLPUSH (again, in order to bench LRANGE): 143061.52 requests per secondLRANGE (first 100 elements): 29577.05 requests per secondLRANGE (first 300 elements): 10431.88 requests per secondLRANGE (first 450 elements): 7010.66 requests per secondLRANGE (first 600 elements): 5296.61 requests per second

登录后复制

以上就是Redis基准参数怎么查看的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2030526.html

(0)
上一篇 2025年2月23日 21:54:54
下一篇 2025年2月23日 21:55:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 宝塔中ThinkPHP框架使用Redis的方法是什么

    redis是一种常用的非关系型数据库,主要用作数据缓存,数据保存形式为key-value,键值相互映射。它的数据存储跟mysql不同,它数据存储在内存之中,所以数据读取相对而言很快,用来做高并发非常不错。 关于redis的安装,在服务器或者…

    2025年2月23日
    100
  • springboot连接不上redis怎么解决

    第一种 查看防火墙是否打开6379端口 查看防火墙状态 systemctl status firewalld 登录后复制 如果防火墙没有启动的话。可以选择直接看后面两种方法。 或者就是打开防火墙,然后继续下面的步骤: 开启端口 firewa…

    2025年2月23日
    100
  • redis延迟双删策略怎么使用

    通常情况下,我们会优先选择使用redis缓存来降低数据库访问负担。但是也会遇到以下这种情况:大量用户来访问我们系统,首先会去查询缓存, 如果缓存中没有数据,则去查询数据库,然后更新数据到缓存中,并且如果数据库中的数据发生了改变则需要同步到r…

    2025年2月23日
    100
  • Redis+SpringBoot案例分析

    一、项目环境 前端技术栈:vue-cli 前端软体:WebStorm 2020.3 前端样式: Bootstrap 后端技术栈:SpringBoot 后端软体:IntelliJ IEDA2019 JavaJDK:1.8 服务器:阿里云Cen…

    2025年2月23日 数据库
    100
  • SpringBoot整合Redis缓存如何实现

    SpringBoot支持的缓存组件 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.springframework.cache.Ca…

    2025年2月23日 数据库
    100
  • 怎么用Redis实现搜索接口

    对于后端开发人员来讲使用一条sql就可以实现列表查询的接口,如果查询条件很复杂,表库设计不合理,会导致查询很困难,这篇文章和大家分享一下用redis实现搜索接口。 下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口…

    2025年2月23日 数据库
    100
  • 如何使用Redis的streams

    起源 自从在 redis 4.0 引入模块后,用户开始思考如何解决这些问题。其中一个用户 timothy downs 通过 irc 和我说道: 我计划给这个模块增加一个事务日志式的数据类型 —— 这意味着大量的订阅者…

    数据库 2025年2月23日
    100
  • Redis持久化机制实现原理和流程是什么

    redis持久化机制实现原理是什么? 持久化:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现…

    数据库 2025年2月23日
    100
  • Redis主从技术的示例分析

    redis复制 在生产环境中,redis通过持久化功能(rdb和aof技术)保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题(生产环境中多次遇到),也会导致数据…

    2025年2月23日
    100
  • ubuntu安装redis报错怎么解决

    ubuntu系统安装redis排错和解决  $ wget http://download.redis.io/releases/redis-6.0.6.tar.gz  #wget命令下载redis安装文件,也可在官网下载压缩包 $ tar -…

    2025年2月23日
    100

发表回复

登录后才能评论