Skip to content

Commit 05b8000

Browse files
update redis-benchmark
1 parent 16b0cdb commit 05b8000

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

src/lab6/lab6.6-redis-server.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)