memtier_benchmark 是一种高吞吐量的性能基准测试工具,主要用于 Redis Memcached。它是 Redis 开发团队开发的,旨在生成各种流量模式,以便测试和优化这些数据库的性能。以下是 memtier_benchmark 的一些关键特点:

  1. 多协议支持:memtier_benchmark 支持 Redis 和 Memcached(包括二进制和文本协议),可以用于比较不同场景下的性能表现。
  2. 多线程与多客户端:该工具能够启动多个工作线程,每个线程可以驱动配置数量的客户端,从而更好地利用硬件资源,生成高负载流量。
  3. 可定制的测试选项:用户可以通过选项来控制 GET 和 SET 操作的比例、键的使用模式(随机或顺序)、键的过期时间范围等,以模拟不同的访问模式。
  4. 报告生成:memtier_benchmark 能够在多次测试迭代后自动生成最佳、最差和平均结果的报告,帮助用户深入了解系统性能。
  5. 开源:该工具的源代码在 GitHub 上开源,用户可以自由下载和使用。

1. 工具安装

1.1 ubuntu镜像源安装memtier-benchmark

镜像源安装:

sudo apt install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install memtier-benchmark
1.2 源码安装

Centos/RHEL系统没有找到镜像源,可以使用源码方式进行安装。

CentOS/Red Hat Linux 7 or newer

安装依赖:

$ sudo yum install autoconf automake make gcc-c++ \
    pcre-devel zlib-devel libmemcached-devel libevent-devel openssl-devel
Ubuntu/Debian

安装依赖:

$ sudo apt-get install build-essential autoconf automake libpcre3-dev \
    libevent-dev pkg-config zlib1g-dev libssl-dev
macOS

安装依赖:

$ brew install autoconf automake libtool libevent pkg-config openssl@3.0

当运行./configure时,如果找不到libssl,可能需要调整PKG_CONFIG_PATH环境变量:

PKG_CONFIG_PATH=`brew --prefix openssl@3.0`/lib/pkgconfig ./configure

编译安装

使用git下载源码,git clone https://github.com/RedisLabs/memtier_benchmark.git, 使用如下命令编译安装:

$ autoreconf -ivf
$ ./configure
$ make
$ sudo make install

2. memtier_benchmark 参数详解

下面是 memtier_benchmark 参数的详细说明:

连接和通用选项
  • -h, --host=ADDR: 服务器地址(默认值:localhost)。
  • -s, --server=ADDR: 同 --host
  • -p, --port=PORT: 服务器端口(默认值:6379)。
  • -S, --unix-socket=SOCKET: UNIX 域套接字名称(默认值:无)。
  • -4, --ipv4: 强制使用 IPv4 地址解析。
  • -6, --ipv6: 强制使用 IPv6 地址解析。
  • -P, --protocol=PROTOCOL: 使用的协议(默认值:redis)。其他支持的协议有 resp2resp3memcache_textmemcache_binary。使用 resp2resp3 时,将通过 HELLO 命令设置 Redis 协议版本。
  • -a, --authenticate=CREDENTIALS: 使用指定的凭据进行身份验证。对于 memcache_text 和 Redis <= 5.x,使用简单密码。对于 memcache_binary 或 Redis 6.x 及更新版本,支持 ACL 用户,格式为 <USER>:<PASSWORD>
  • --tls: 启用 SSL/TLS 传输安全。
  • --cert=FILE: 使用指定的客户端证书进行 TLS。
  • --key=FILE: 使用指定的私钥进行 TLS。
  • --cacert=FILE: 使用指定的 CA 证书包进行 TLS。
  • --tls-skip-verify: 跳过服务器证书验证。
  • --tls-protocols: 指定使用的 TLS 协议版本,逗号分隔。使用组合 TLSv1TLSv1.1TLSv1.2TLSv1.3
  • --sni=STRING: 添加 SNI 头。
  • -x, --run-count=NUMBER: 执行的完整测试迭代次数。
  • -D, --debug: 打印调试输出。
  • --client-stats=FILE: 生成每个客户端的统计文件。
  • -o, --out-file=FILE: 输出文件名称(默认:stdout)。
  • --json-out-file=FILE: JSON 输出文件名称,如果未设置,则不会输出 JSON。
  • --hdr-file-prefix=FILE: HDR 延迟直方图输出文件的前缀,如果未设置,则不会保存延迟直方图文件。
  • --show-config: 在运行前打印详细配置。
  • --hide-histogram: 不打印详细的延迟直方图。
  • --print-percentiles: 指定在结果表中打印的百分位数信息(默认打印百分位数:50、99、99.9)。
  • --cluster-mode: 在集群模式下运行客户端。
  • -h, --help: 显示帮助信息。
  • -v, --version: 显示版本信息。
测试选项
  • -n, --requests=NUMBER: 每个客户端的总请求数(默认值:10000)。使用 allkeys 在整个键范围内运行。
  • --rate-limiting=NUMBER: 每个连接每秒最大请求数(默认无限制)。如果使用 --rate-limiting 且输入非常大的速率但无法满足,memtier 将尽可能每秒执行尽可能多的请求。
  • -c, --clients=NUMBER: 每个线程的客户端数(默认值:50)。
  • -t, --threads=NUMBER: 线程数(默认值:4)。
  • --test-time=SECS: 测试运行的秒数。
  • --ratio=RATIO: Set:Get 比例(默认值:1:10)。
  • --pipeline=NUMBER: 并发流水线请求数(默认值:1)。
  • --reconnect-interval=NUM: 执行多少请求后重新连接。
  • --multi-key-get=NUM: 启用多键获取命令,最多获取 NUM 键(默认值:0)。
  • --select-db=DB: 选择数据库编号(测试 Redis 服务器时)。
  • --distinct-client-seed: 为每个客户端使用不同的随机种子。
  • --randomize: 基于时间戳的随机种子(默认值为固定值)。
任意命令
  • --command=COMMAND: 指定要发送的命令,用引号括起来。指定的每个命令都根据其比例和键模式选项运行。例如:--command="set __key__ 5" --command-ratio=2 --command-key-pattern=G。使用生成的键或对象时,输入:
  • __key__: 使用键选项生成的键。
  • __data__: 使用对象选项生成的数据。
  • --command-ratio: 命令按序列发送的次数(默认值:1)。
  • --command-key-pattern: 命令的键模式(默认值:R)。支持以下模式:
  • G:高斯分布。
  • R:均匀随机。
  • S:顺序。
  • P:并行(每个客户端都有键范围的子集)。
对象选项
  • -d --data-size=SIZE: 对象数据大小(字节),默认值为 32
  • --data-offset=OFFSET: 实际值大小为 data-size + data-offset。将使用 SETRANGE / GETRANGE命令(默认值:0)。
  • -R --random-data: 表示数据应随机化。
  • --data-size-range=RANGE: 使用指定范围内随机大小的项目(最小-最大)。
  • --data-size-list=LIST: 从权重列表中使用大小(size1:weight1,..sizeN:weightN)。
  • --data-size-pattern=R|S: 与 data-size-range 一起使用时,当设置为 R 时,将使用定义的数据大小的随机大小;当设置为 S 时,定义的数据大小将在键范围内均匀分布,参见 --key-maximum(默认值 R)。
  • --expiry-range=RANGE: 使用指定范围内的随机过期值。
导入数据选项
  • --data-import=FILE: 从文件读取对象数据。
  • --data-verify: 启用测试完成后的数据验证。
  • --verify-only: 仅执行 --data-verify,不执行其他测试。
  • --generate-keys: 为导入的对象生成键。
  • --no-expiry: 忽略导入数据中的过期信息。
键选项
  • --key-prefix=PREFIX: 键的前缀(默认值:"memtier-")。
  • --key-minimum=NUMBER: 键 ID 最小值(默认值:0)。
  • --key-maximum=NUMBER: 键 ID 最大值(默认值:10000000)。
  • --key-pattern=PATTERN: Set:Get 模式(默认值:R:R)。支持以下模式:
  • G:高斯分布。
  • R:均匀随机。
  • S:顺序。
  • P:并行(每个客户端都有键范围的子集)。
  • --key-stddev: 高斯分布中使用的标准偏差(默认值为键范围 / 6)。
  • --key-median: 高斯分布中使用的中值点(默认值为键范围的中心)。
等待选项
  • --wait-ratio=RATIO: Set:Wait 比例(默认无 WAIT 命令 - 1:0)。
  • --num-slaves=RANGE: 在指定范围内等待随机数量的从属服务器。
  • --wait-timeout=RANGE: 在指定范围内等待随机数量的毫秒数(正态分布,中心在范围中

3. 运行测试

3.1 基本的 Redis 性能测试

下面是一个基本的 memtier_benchmark 测试命令示例,该命令将在本地 Redis 实例上执行。4线程,每个线程50个客户端,每个请求256字节数据,按照1:1的setget操作比例进行测试,同时redis开启了密码认证,加上-a password,password为密码。

memtier_benchmark -s 127.0.0.1 -p 6379 -a password -t 2 -c 50 -d 256 --ratio=1:1
Writing results to stdout
[RUN #1] Preparing benchmark client...
[RUN #1] Launching threads now...
[RUN #1 100%,   4 secs]  0 threads:     1000000 ops,  208253 (avg:  204726) ops/sec, 34.16MB/sec (avg: 33.58MB/sec),  0.48 (avg:  0.49) msec latency

2         Threads
50        Connections per thread
10000     Requests per client


ALL STATS
============================================================================================================================
Type         Ops/sec     Hits/sec   Misses/sec    Avg. Latency     p50 Latency     p99 Latency   p99.9 Latency       KB/sec
----------------------------------------------------------------------------------------------------------------------------
Sets       102789.78          ---          ---         0.48844         0.44700         1.11900         1.76700     30504.23
Gets       102789.78        82.23    102707.54         0.48814         0.44700         1.12700         1.79900      4024.84
Waits           0.00          ---          ---             ---             ---             ---             ---          ---
Totals     205579.55        82.23    102707.54         0.48829         0.44700         1.12700         1.78300     34529.07


Request Latency Distribution
Type     <= msec         Percent
------------------------------------------------------------------------
SET       0.047        0.000
SET       0.351        5.000
...

执行命令后,memtier_benchmark 会输出详细的性能测试结果,包括每秒请求数(Requests per second),延迟(Latency),和其他统计数据。

3.2 使用 memtier_benchmark 进行高级性能测试

在进行 Redis 性能测试时,除了基础的测试参数,您还可以利用一些高级功能来生成更复杂的测试场景。这些功能包括伪随机数据、高斯访问模式和范围操作。以下是这些功能的详细说明和示例。

伪随机数据

根据已知大小范围生成随机数据。这是通过将新的 --data-size-pattern 选项设置为值 'S'(顺序)并使用 --data-size-range 选项指定其范围。以下示例将生成一个基准键空间,其值均匀分布在 4 到 204 字节之间:

memtier-benchmark --random-data --data-size-range=4-204 --data-size-pattern=S --key-minimum=200 --key-maximum=400 <additional parameters>

在上面的例子中,我们使用了 --random-data 开关来生成随机数据,同时使用 --key-minimum 和 --key-maximum 开关来控制键名 ID 的范围,生成了总共 200 个键。第一个键 memtier-200 将存储 4 字节的数据,接下来的键将依次增加,每个键的数据大小比前一个增加 1 字节,直到最后一个键 memtier-400,它将存储 204 字节的数据。

高斯访问模式

memtier_benchmark基准测试工具能够使用高斯分布(也叫做正态分布)来访问测试数据。在进行此更改之前,您可以为基准测试的访问模式指定均匀随机或顺序分布。但为了更好地模拟现实生活中的用例,这个新选项允许您将 memtier_benchmark 键访问模式符合熟悉的高斯分布的钟形曲线。使用此选项时,您还可以控制和设置分布所遵循的标准差和中位数。例如,使用以下参数调用该工具:

memtier-benchmark --random-data --data-size-range=4-204 --data-size-pattern=S --key-minimum=200 --key-maximum=400 --key-pattern=G:G --key-stddev=10 --key-median=300 <additional parameters>

上述命令将导致大多数读/写访问集中在第100个键(memtier-300)上。

范围操作

新功能支持使用 Redis 命令 SETRANGEGETRANGE 代替 SET GET 的功能,这使您能够构建使用更大数据大小但网络流量显著减少的基准测试。

例如,您可以设置键值为 1MB,但只读写最后一个字节,使用以下参数进行调用测试:

memtier-benchmark --data-offset=1048575 --data-size=1 <additional parameters>