@@ -48,3 +48,144 @@ redis-cli
4848预期的结果应该如下所示:
4949
5050![ redis-example] ( ../images/lab6/redis-example.png )
51+
52+ # 4 redis-benchmark 压测
53+ 由于我们已经实现了支持` Resp ` 的服务器, 其提供类似官方的` redis-server ` 的服务。同时, ` redis ` 官方提供了压测工具` redis-benchmark ` , 我们可以利用其进行压测。
54+
55+ ## 4.1 redis-benchmark 安装
56+ ` redis-benchmark ` 是一个官方的压测工具,无论你是从` apt/yum ` 等源安装的` redis ` ,还是从源码编译的,其默认安装选项中都提供了` redis-benchmark ` 。
57+
58+ ## 4.2 redis-benchmark 使用
59+ ` redis-benchmark ` 的使用非常简单,只需要指定` -h ` 参数,指定redis服务器的ip地址,然后就可以进行压测了。
60+
61+ ` redis-benchmark ` 是 Redis 官方自带的性能测试工具,用于模拟多个客户端同时向 Redis 服务器发送命令,并评估其性能表现。它可以帮助你了解 Redis 在不同负载下的吞吐量和延迟情况。
62+
63+ 基本的命令格式如下:
64+
65+ ``` bash
66+ redis-benchmark [选项] [测试]
67+ ```
68+
69+ 如果不带任何选项,` redis-benchmark ` 会使用默认设置连接到本地 (127.0.0.1) 的 6379 端口,并执行一组预定义的测试。
70+
71+ ---
72+ ### 常用选项
73+
74+ 以下是一些常用的 ` redis-benchmark ` 选项:
75+
76+ * ** 主机和端口:**
77+ * ` -h <hostname> ` : 指定要连接的 Redis 服务器的主机名或 IP 地址 (默认为 ` 127.0.0.1 ` )。
78+ * ` -p <port> ` : 指定 Redis 服务器的端口号 (默认为 ` 6379 ` )。
79+ * ` -a <password> ` : 如果 Redis 服务器设置了密码,使用此选项进行身份验证。
80+ * ` --tls ` : 如果 Redis 服务器启用了 TLS/SSL 加密,使用此选项。
81+
82+ * ** 并发和请求数:**
83+ * ` -c <clients> ` : 指定并发客户端的数量 (默认为 ` 50 ` )。这模拟了同时有多少个连接在向 Redis 发送请求。
84+ * ` -n <requests> ` : 指定总的请求数量 (默认为 ` 100000 ` )。
85+
86+ * ** 数据大小:**
87+ * ` -d <size> ` : 指定 SET/GET 命令操作的数据大小,单位是字节 (默认为 ` 3 ` )。
88+
89+ * ** 测试命令:**
90+ * ` -t <tests> ` : 指定要执行的测试命令列表,用逗号分隔。例如 ` -t SET,GET,LPUSH ` 。如果不指定,则执行默认的测试集 (PING_INLINE, PING_BULK, SET, GET, INCR, LPUSH, RPUSH, LPOP, RPOP, SADD, HSET, SPOP, LRANGE_100, LRANGE_300, LRANGE_500, LRANGE_600, MSET)。
91+
92+ * ** Pipeline:**
93+ * ` -P <numreq> ` : 指定每个连接 pipeline 的请求数量 (默认为 ` 1 ` )。Pipeline 可以显著提高吞吐量,因为它允许客户端在等待前一个命令的响应之前发送多个命令。
94+
95+ * ** 随机性:**
96+ * ` -r <keyspacelen> ` : 对 SET/GET/INCR 等命令使用随机的 key,对 SADD 等命令使用随机的 value。` <keyspacelen> ` 定义了随机 key 的范围后缀。例如,` -r 100000 ` 会生成类似 ` mykey_rand:000000000000 ` 到 ` mykey_rand:000000099999 ` 这样的 key。这有助于模拟更真实的缓存场景,避免总是命中同一个 key。
97+
98+ * ** 安静模式:**
99+ * ` -q ` : 安静模式,只输出 QPS (每秒查询数) 结果。
100+
101+ * ** 线程 (较新版本):**
102+ * ` --threads <num> ` : 指定使用的线程数 (默认为 ` 1 ` )。对于多核 CPU,使用多线程可以更好地压测 Redis。
103+
104+ * ** 集群模式:**
105+ * ` --cluster ` : 如果测试的是 Redis 集群,需要添加此参数。
106+
107+ ---
108+ ### 输出结果解析
109+
110+ ` redis-benchmark ` 会为每个测试的命令输出类似以下的信息:
111+
112+ ```
113+ ====== SET ======
114+ 100000 requests completed in 1.23 seconds
115+ 50 parallel clients
116+ 3 bytes payload
117+ keep alive: 1
118+
119+ 99.76% <= 1 milliseconds
120+ 100.00% <= 1 milliseconds
121+ 81300.81 requests per second
122+ ```
123+
124+ 关键指标包括:
125+
126+ * ** requests completed in ... seconds** : 完成指定请求数所花费的时间。
127+ * ** parallel clients** : 并发客户端数量。
128+ * ** bytes payload** : 数据负载大小。
129+ * ** ...% <= ... milliseconds** : 不同百分位的请求延迟。例如,` 99.76% <= 1 milliseconds ` 表示 99.76% 的请求在 1 毫秒内完成。这有助于了解延迟的分布情况。
130+ * ** requests per second (QPS)** : 每秒处理的请求数。这是衡量 Redis 吞吐量的主要指标。
131+
132+ ### 示例
133+
134+ * ** 测试本地 Redis 默认端口,执行默认测试集:**
135+ ``` bash
136+ redis-benchmark
137+ ```
138+
139+ * ** 测试特定主机和端口,使用 100 个并发连接,总共 100 万个请求:**
140+ ` ` ` bash
141+ redis-benchmark -h myredishost -p 6380 -c 100 -n 1000000
142+ ` ` `
143+
144+ * ** 只测试 SET 和 GET 命令,数据大小为 256 字节,使用 pipeline (每个 pipeline 16 个请求):**
145+ ` ` ` bash
146+ redis-benchmark -t SET,GET -d 256 -P 16
147+ ` ` `
148+
149+ * ** 安静模式,只看 QPS:**
150+ ` ` ` bash
151+ redis-benchmark -q
152+ ` ` `
153+
154+ # # 4.3 测试结果
155+ 我们指定如下测试选项:
156+ ` ` ` bash
157+ # 1. 在一个 Terminal 中启动 server
158+ ➜ ~ xmake run server
159+ # 2. 在另一个 Terminal 开启 redis-benchmark
160+ ➜ ~ redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000 -q -t SET,GET,INCR,SADD,HSET,ZADD
161+ WARNING: Could not fetch server CONFIG
162+ SET: 142653.36 requests per second, p50=0.527 msec
163+ GET: 134589.50 requests per second, p50=0.503 msec
164+ INCR: 132802.12 requests per second, p50=0.503 msec
165+ SADD: 131233.59 requests per second, p50=0.519 msec
166+ HSET: 123456.79 requests per second, p50=0.583 msec
167+ ZADD: 126422.25 requests per second, p50=0.615 msec
168+ ` ` `
169+
170+ > 启动测试时, 你需要确保以下几点:
171+ > 1. 使用` release` 模型编译
172+ > 2. 更改日志级别为` info` , 否则会输出大量日志, 影响测试结果。你如果确定代码没有bug,甚至可以关闭日志输出
173+ > 3. 日志输出使用` reset_log_level` 进行
174+
175+ 这是作者的实现的测试结果, 同时我们可以用官方的` redis-server` 测试进行对比:
176+ ` ` ` bash
177+ # 1. 在一个 Terminal 中启动 server
178+ ➜ ~ redis-server
179+ # 2. 在另一个 Terminal 开启 redis-benchmark
180+ ➜ ~ redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000 -q -t SET,GET,INCR,SADD,HSET,ZADD
181+ SET: 117647.05 requests per second, p50=0.527 msec
182+ GET: 134228.19 requests per second, p50=0.527 msec
183+ INCR: 132450.33 requests per second, p50=0.535 msec
184+ SADD: 125628.14 requests per second, p50=0.551 msec
185+ HSET: 128205.13 requests per second, p50=0.527 msec
186+ ZADD: 137362.64 requests per second, p50=0.535 msec
187+ ` ` `
188+ 这里我们对` SET,GET,INCR,SADD,HSET,ZADD` 命令的实现的性能与` redis-server` 的性能相近, 且有些许性能优势。你可以对比你自己的实现和` redis-server` 的QPS, 预期的结果是与` redis-server` 的QPS在同一数量级。
189+
190+ ** 压测之后呢?**
191+ 这里的压测本身不是我们的目的, 你需要关注的是压测反映出的性能不足问题, 并修改相应代码的实现。
0 commit comments