如何在Ubuntu18.04上对Redis服务器的性能进行基准测试

来自菜鸟教程
跳转至:导航、​搜索

介绍

在分析数据库服务器的整体性能时,基准测试是一项重要的实践。 它有助于识别瓶颈以及这些系统中的改进机会。

Redis 是一种内存数据存储,可用作数据库、缓存和消息代理。 它支持从简单到复杂的数据结构,包括哈希、字符串、排序集、位图、地理空间数据等类型。 在本指南中,我们将演示如何使用几种不同的工具和方法对在 Ubuntu 18.04 上运行的 Redis 服务器的性能进行基准测试。

先决条件

要遵循本指南,您需要:

  • 一台 Ubuntu 18.04 服务器,配置了非 root sudo 用户和基本防火墙。 要进行设置,您可以按照我们的 Ubuntu 18.04 初始服务器设置指南进行操作。
  • Redis 安装在您的服务器上,如我们在 如何在 Ubuntu 18.04 上安装和保护 Redis 的指南中所述。

注意: 本教程中演示的命令是在运行在 4GB DigitalOcean Droplet 上的专用 Redis 服务器上执行的。


使用附带的 redis-benchmark 工具

Redis 带有一个名为 redis-benchmark 的基准测试工具。 该程序可用于模拟任意数量的客户端同时连接并在服务器上执行操作,测量完成请求所需的时间。 结果数据将使您了解 Redis 服务器每秒能够处理的平均请求数。

以下列表详细介绍了 redis-benchmark 使用的一些常用命令选项:

  • -h:Redis 主机。 默认值为 127.0.0.1
  • -p:Redis 端口。 默认值为 6379
  • -a:如果您的服务器需要身份验证,您可以使用此选项提供密码。
  • -c:要模拟的客户端(并行连接)的数量。 默认值为 50。
  • -n:发出多少请求。 默认值为 100000。
  • -dSETGET 值的数据大小,以字节为单位。 默认值为 3。
  • -t:只运行一部分测试。 例如,您可以使用 -t get,setGETSET 命令的性能进行基准测试。
  • -P:使用流水线提高性能。
  • -q:安静模式,仅显示平均每秒请求信息。

例如,如果要检查本地 Redis 服务器每秒可以处理的平均请求数,可以使用:

redis-benchmark -q 

您将获得与此类似的输出,但数字不同:

OutputPING_INLINE: 85178.88 requests per second
PING_BULK: 83056.48 requests per second
SET: 72202.16 requests per second
GET: 94607.38 requests per second
INCR: 84961.77 requests per second
LPUSH: 78988.94 requests per second
RPUSH: 88652.48 requests per second
LPOP: 87950.75 requests per second
RPOP: 80971.66 requests per second
SADD: 80192.46 requests per second
HSET: 84317.03 requests per second
SPOP: 78125.00 requests per second
LPUSH (needed to benchmark LRANGE): 84175.09 requests per second
LRANGE_100 (first 100 elements): 52383.45 requests per second
LRANGE_300 (first 300 elements): 21547.08 requests per second
LRANGE_500 (first 450 elements): 14471.78 requests per second
LRANGE_600 (first 600 elements): 9383.50 requests per second
MSET (10 keys): 71225.07 requests per second

您还可以使用 -t 参数将测试限制为您选择的命令子集。 以下命令仅显示 GETSET 命令的平均值:

redis-benchmark -t set,get -q
OutputSET: 76687.12 requests per second
GET: 82576.38 requests per second

默认选项将使用 50 个并行连接向 Redis 服务器创建 100000 个请求。 如果您想增加并行连接的数量以模拟使用高峰,您可以使用 -c 选项:

redis-benchmark -t set,get -q -c 1000

因为这将使用 1000 个并发连接而不是默认的 50 个,所以您应该预期性能会下降:

OutputSET: 69444.45 requests per second
GET: 70821.53 requests per second

如果您想要输出中的详细信息,您可以删除 -q 选项。 以下命令将使用 100 个并行连接在服务器上运行 1000000 个 SET 请求:

redis-benchmark -t set -c 100 -n 1000000

你会得到类似这样的输出:

Output====== SET ======
  1000000 requests completed in 11.29 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

95.22% <= 1 milliseconds
98.97% <= 2 milliseconds
99.86% <= 3 milliseconds
99.95% <= 4 milliseconds
99.99% <= 5 milliseconds
99.99% <= 6 milliseconds
100.00% <= 7 milliseconds
100.00% <= 8 milliseconds
100.00% <= 8 milliseconds
88605.35 requests per second

默认设置使用 3 个字节作为键值。 您可以使用选项 -d 更改此设置。 以下命令将使用 1MB 键值对 GETSET 命令进行基准测试:

redis-benchmark -t set,get -d 1000000 -n 1000 -q

因为这次服务器正在使用更大的有效负载,所以预计性能会显着下降:

OutputSET: 1642.04 requests per second
GET: 822.37 requests per second

重要的是要意识到,尽管这些数字作为评估 Redis 实例性能的快速方法很有用,但它们并不代表 Redis 实例可以维持的最大吞吐量。 通过使用 流水线 ,应用程序可以一次发送多个命令,以提高服务器每秒可以处理的请求数。 使用 redis-benchmark,您可以使用 -P 选项来模拟使用此 Redis 功能的真实应用程序。

为了比较差异,首先使用默认值运行 redis-benchmark 命令,并且没有流水线,用于 GETSET 测试:

redis-benchmark -t get,set -q
OutputSET: 86281.27 requests per second
GET: 89847.26 requests per second

下一个命令将运行相同的测试,但会将 8 个命令连接在一起:

redis-benchmark -t get,set -q -P 8
OutputSET: 653594.81 requests per second
GET: 793650.75 requests per second

从输出中可以看出,使用流水线可以显着提高性能。

使用 redis-cli 检查延迟

如果您想简单测量请求接收响应所需的平均时间,可以使用 Redis 客户端检查平均服务器延迟。 在 Redis 的上下文中,延迟是衡量 ping 命令从服务器接收响应所需的时间。

以下命令将显示 Redis 服务器的实时延迟统计信息:

redis-cli --latency

您将获得与此类似的输出,显示越来越多的样本和可变的平均延迟:

Outputmin: 0, max: 1, avg: 0.18 (970 samples)

该命令将无限期地继续运行。 您可以使用 CTRL+C 停止它。

要监控特定时间段内的延迟,您可以使用:

redis-cli --latency-history

这将随着时间的推移跟踪延迟平均值,默认情况下设置为 15 秒的可配置间隔。 你会得到类似这样的输出:

Outputmin: 0, max: 1, avg: 0.18 (1449 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.16 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1444 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1446 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1449 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.16 (1444 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.17 (1445 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.16 (1445 samples) -- 15.01 seconds range
...

因为我们示例中的 Redis 服务器是空闲的,所以延迟样本之间没有太大的差异。 但是,如果您有一个使用高峰,这应该反映为结果中延迟的增加。

如果您只想测量 系统 延迟,您可以使用 --intrinsic-latency 。 内在延迟是环境固有的,取决于诸如硬件、内核、服务器邻居和其他不受 Redis 控制的因素等因素。

您可以将内在延迟视为 Redis 整体性能的基准。 以下命令将检查内在的系统延迟,运行 30 秒的测试:

redis-cli --intrinsic-latency 30

你应该得到类似这样的输出:

Output…

498723744 total runs (avg latency: 0.0602 microseconds / 60.15 nanoseconds per run).
Worst run took 22975x longer than the average latency.

比较这两种延迟测试有助于识别可能影响 Redis 服务器性能的硬件或系统瓶颈。 考虑到对我们示例服务器的请求的总延迟平均为 0.18 微秒才能完成,0.06 微秒的固有延迟意味着系统在不受 Redis 控制的进程中花费了总请求时间的三分之一。

使用 Memtier 基准测试工具

Memtier 是 Redis Labs 为 Redis 和 Memcached 打造的高吞吐量基准测试工具。 尽管在各个方面与 redis-benchmark 非常相似,但 Memtier 有几个配置选项可以调整以更好地模拟您可能期望在 Redis 服务器上的负载类型,此外还提供集群支持。

要在您的服务器上安装 Memtier,您需要从源代码编译软件。 首先,安装编译代码所需的依赖项:

sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev

接下来,转到您的主目录并从其 Github 存储库 中克隆 memtier_benchmark 项目:

cd
git clone https://github.com/RedisLabs/memtier_benchmark.git

导航到项目目录并运行 autoreconf 命令以生成应用程序配置脚本:

cd memtier_benchmark
autoreconf -ivf

运行 configure 脚本以生成编译所需的应用程序工件:

./configure

现在运行 make 来编译应用程序:

make

构建完成后,您可以使用以下命令测试可执行文件:

./memtier_benchmark --version

这将为您提供以下输出:

Outputmemtier_benchmark 1.2.17
Copyright (C) 2011-2017 Redis Labs Ltd.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

以下列表包含一些与 memtier_benchmark 命令一起使用的最常用选项:

  • -s:服务器主机。 默认为 localhost
  • -p:服务器端口。 默认值为 6379
  • -a:使用提供的密码验证请求。
  • -n:每个客户端的请求数(默认为 10000)。
  • -c:客户端数量(默认为 50)。
  • -t:线程数(默认为 4)。
  • --pipeline:启用流水线。
  • --ratioSETGET命令的比例,默认为1:10。
  • --hide-histogram:隐藏详细的输出信息。

这些选项中的大多数与 redis-benchmark 中的选项非常相似,但 Memtier 以不同的方式测试性能。 为了更好地模拟常见的真实环境,memtier_benchmark 执行的默认基准测试将仅测试 GETSET 请求,比率为 1 比 10。 测试中每个 SET 操作有 10 次 GET 操作,这种安排更能代表使用 Redis 作为数据库或缓存的常见 Web 应用程序。 您可以使用选项 --ratio 调整比率值。

以下命令使用默认设置运行 memtier_benchmark,同时仅提供高级输出信息:

./memtier_benchmark --hide-histogram

注意:如果您已将 Redis 服务器配置为需要身份验证,则应向 memtier_benchmark 命令提供 -a 选项以及您的 Redis 密码:

./memtier_benchmark --hide-histogram -a your_redis_password

您将看到与此类似的输出:

Output...

4         Threads
50        Connections per thread
10000     Requests per client


ALL STATS
=========================================================================
Type         Ops/sec     Hits/sec   Misses/sec      Latency       KB/sec 
-------------------------------------------------------------------------
Sets         8258.50          ---          ---      2.19800       636.05 
Gets        82494.28     41483.10     41011.18      2.19800      4590.88 
Waits           0.00          ---          ---      0.00000          --- 
Totals      90752.78     41483.10     41011.18      2.19800      5226.93 

根据 memtier_benchmark 的运行,我们的 Redis 服务器每秒可以执行大约 9 万次操作,比例为 1:10 SET/GET

需要注意的是,每个基准测试工具都有自己的用于性能测试和数据呈现的算法。 出于这个原因,即使使用相似的设置,在同一台服务器上的结果也会略有不同是正常的。

结论

在本指南中,我们演示了如何使用两种不同的工具在 Redis 服务器上执行基准测试:包含的 redis-benchmark 和由 Redis Labs 开发的 memtier_benchmark 工具。 我们还看到了如何使用 redis-cli 检查服务器延迟。 根据从这些测试中获得的数据,您将更好地了解 Redis 服务器在性能方面的期望,以及当前设置的瓶颈是什么。