Files
ldb/test-redis/README.md
2026-03-04 07:20:09 +00:00

108 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# test-redis 压测记录与优化对比(复测)
## 先回答你的两个问题
### 1) 为什么之前看起来比 Redis 快很多?
结论:之前是**单次样本**,抖动很大,不足以说明稳定结论。
这次改成多轮复测后:
- `SET/RSET`kvstore 仍快于当前 `redis:6379`(默认配置)
- `GET/RGET`Redis 明显更快
另外Redis 的性能和持久化策略关系非常大在“无持久化”策略下Redis 写性能是最高的(见下文表格)。
### 2) 为什么 GET 的 keyspace 比 SET 小很多?
这是有意的:
- `SET/RSET` 压测为了避免键冲突(`RSET` 冲突会报错),使用超大 keyspace`1e9`)。
- `GET/RGET` 必须先 prefill 全部 keyspace若也设为 `1e9`,预填充成本过高,不适合日常回归测试。
---
## 测试口径
- 时间2026-03-04
- 工具:`./test-redis/bench`
- kvstore 测试命令:`RSET/RGET`
- Redis 测试命令:`SET/GET`
- 通用参数:
- 写:`requests=10000 pipeline=128 keyspace=1000000000 value-size=32`
- 读:`requests=300000 pipeline=128 keyspace=100000 value-size=32`
- kvstore 复测时临时使用 `persistence=none`(避免历史 oplog 回放影响)。
---
## 优化项 #1ChainBuffer 接收链路改造
改造点:`readv` 直写 + 回环 chunk + 节点池(减少接收路径中转拷贝)。
### A. 改造前后kvstore
| 指标 | 改造前(旧记录,单次) | 改造后本次3轮均值 | 变化 |
|---|---:|---:|---:|
| RSET QPS | 260604 | 331063 | **+27.04%** |
| RGET QPS | 294951 | 288107 | **-2.32%** |
> 说明:旧值来自此前同文档记录;新值是本次重跑 3 轮的均值,可信度更高。
### B. 本次 3 轮明细kvstore
| 场景 | Round1 | Round2 | Round3 | 平均 |
|---|---:|---:|---:|---:|
| RSET QPS | 323041 | 352476 | 317673 | **331063** |
| RGET QPS | 271069 | 313658 | 279593 | **288107** |
---
## Redis 对照(同口径复测)
### A. 默认 Redis 实例127.0.0.1:63793轮均值
| 场景 | Round1 | Round2 | Round3 | 平均 |
|---|---:|---:|---:|---:|
| SET QPS | 299221 | 130792 | 312117 | **247377** |
| GET QPS | 349242 | 343573 | 353091 | **348635** |
### B. 与 kvstore 对比(本次均值)
| 指标 | kvstore | redis:6379 | 相对变化kvstore 对 redis |
|---|---:|---:|---:|
| 写 QPS | 331063 | 247377 | **+33.83%** |
| 读 QPS | 288107 | 348635 | **-17.36%** |
> 解释这说明“kvstore 在当前写路径上有优势,但读路径仍落后 Redis”。
---
## Redis 持久化策略对比写压测SET
| 策略 | QPS | avg(us/op) | 备注 |
|---|---:|---:|---|
| `none`(无持久化) | **492561** | 2.03 | 最高吞吐(但不持久) |
| `rdb_default` | **285885** | 3.50 | 本次“持久化策略中最快” |
| `aof_no` | 281870 | 3.55 | AOF`appendfsync no` |
| `aof_everysec` | 266878 | 3.75 | AOF`appendfsync everysec` |
| `aof_always` | 110793 | 9.03 | 最慢,但最强一致性 |
结论:
- 如果包含“无持久化”,最快是 `none`
- 如果限定“必须持久化”,本次最快是 `rdb_default`(略快于 `aof_no`)。
---
## 复现命令(关键)
```bash
# kvstore 写RSET
./test-redis/bench --host 127.0.0.1 --port 8888 --mode set --set-cmd RSET --get-cmd RGET --requests 10000 --pipeline 128 --keyspace 1000000000 --value-size 32 --key-prefix bench:<ts>:set:
# kvstore 读RGET
./test-redis/bench --host 127.0.0.1 --port 8888 --mode get --set-cmd RSET --get-cmd RGET --requests 300000 --pipeline 128 --keyspace 100000 --value-size 32 --verify-get --key-prefix bench:<ts>:get:
# Redis 策略对比示例6381 配置成 rdb_default
./test-redis/bench --host 127.0.0.1 --port 6381 --mode set --requests 10000 --pipeline 128 --keyspace 1000000000 --value-size 32 --key-prefix bench:<ts>:redis:
```