如何在Ubuntu 18.04上对Redis服务器的性能进行基准测试

基准测试是分析服务器整体性能,识别瓶颈以及在这些系统中改进机会的重要实践。在本指南中,我们将演示如何使用一些不同的工具和方法对运行在Ubuntu 18.04上的Redis服务器的性能进行基准测试。

介绍

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

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,set为对GETSET命令的性能进行基准测试。
  • -P :使用流水线技术来提高性能。
  • -q :安静模式,仅显示每秒平均请求数

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

redis-benchmark -q 

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

PING_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
SET: 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,所以应该会降低性能:

SET: 69444.45 requests per second
GET: 70821.53 requests per second

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

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

您将获得类似于此的输出:

====== 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

由于此次服务器正在使用更大的有效负载,因此预计会显着降低性能:

SET: 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
SET: 86281.27 requests per second
GET: 89847.26 requests per second

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

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

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

使用redis-cli检查延迟

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

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

redis-cli --latency

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

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

此命令将无限期地继续运行。 你可以用CTRL+C来阻止它。

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

redis-cli --latency-history

这将跟踪一段时间内的延迟平均值,默认情况下可配置的时间间隔设置为15秒。 您将获得类似于此的输出:

min: 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

您应该获得类似于此的输出:

…

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

这将为您提供以下输出:

memtier_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服务器配置为要求身份验证,则应将-a选项与Redis密码一起提供给memtier_benchmark命令:

./memtier_benchmark --hide-histogram -a your_redis_password

你会看到与此类似的输出:

...

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服务器可以每秒1:10的SET / GET比率执行大约9万次操作。

值得注意的是,每个基准测试工具都有自己的性能测试和数据表示算法。 因此,即使使用类似的设置,在同一台服务器上的结果也略有不同是正常的。

结论

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