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

3.8 KiB
Raw Blame History

test-redis 压测记录与优化对比(复测)

先回答你的两个问题

1) 为什么之前看起来比 Redis 快很多?

结论:之前是单次样本,抖动很大,不足以说明稳定结论。
这次改成多轮复测后:

  • SET/RSETkvstore 仍快于当前 redis:6379(默认配置)
  • GET/RGETRedis 明显更快

另外Redis 的性能和持久化策略关系非常大在“无持久化”策略下Redis 写性能是最高的(见下文表格)。

2) 为什么 GET 的 keyspace 比 SET 小很多?

这是有意的:

  • SET/RSET 压测为了避免键冲突(RSET 冲突会报错),使用超大 keyspace1e9)。
  • 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 AOFappendfsync no
aof_everysec 266878 3.75 AOFappendfsync everysec
aof_always 110793 9.03 最慢,但最强一致性

结论:

  • 如果包含“无持久化”,最快是 none
  • 如果限定“必须持久化”,本次最快是 rdb_default(略快于 aof_no)。

复现命令(关键)

# 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: