chainbuffer fixed
This commit is contained in:
107
test-redis/README.md
Normal file
107
test-redis/README.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# 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 回放影响)。
|
||||
|
||||
---
|
||||
|
||||
## 优化项 #1:ChainBuffer 接收链路改造
|
||||
|
||||
改造点:`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:6379,3轮均值)
|
||||
|
||||
| 场景 | 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:
|
||||
```
|
||||
Reference in New Issue
Block a user