memtier_benchmark
是一种高吞吐量的性能基准测试工具,主要用于 Redis
和 Memcached
。它是 Redis 开发团队开发的,旨在生成各种流量模式,以便测试和优化这些数据库的性能。以下是 memtier_benchmark
的一些关键特点:
- 多协议支持:memtier_benchmark 支持 Redis 和 Memcached(包括二进制和文本协议),可以用于比较不同场景下的性能表现。
- 多线程与多客户端:该工具能够启动多个工作线程,每个线程可以驱动配置数量的客户端,从而更好地利用硬件资源,生成高负载流量。
- 可定制的测试选项:用户可以通过选项来控制 GET 和 SET 操作的比例、键的使用模式(随机或顺序)、键的过期时间范围等,以模拟不同的访问模式。
- 报告生成:memtier_benchmark 能够在多次测试迭代后自动生成最佳、最差和平均结果的报告,帮助用户深入了解系统性能。
- 开源:该工具的源代码在 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
)。其他支持的协议有resp2
、resp3
、memcache_text
和memcache_binary
。使用resp2
或resp3
时,将通过 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 协议版本,逗号分隔。使用组合TLSv1
、TLSv1.1
、TLSv1.2
和TLSv1.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的set
和get
操作比例进行测试,同时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 latency2 Threads
50 Connections per thread
10000 Requests per clientALL 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.07Request 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
命令 SETRANGE
和 GETRANGE
代替 SET
和 GET
的功能,这使您能够构建使用更大数据大小但网络流量显著减少的基准测试。
例如,您可以设置键值为 1MB,但只读写最后一个字节,使用以下参数进行调用测试:
memtier-benchmark --data-offset=1048575 --data-size=1 <additional parameters>