Skip to content

Commit b135048

Browse files
committed
docs(bench): add redis 6.2.6 dual-tree A/B verification
redis (dual-tree A/B, same 4-min time window, IP redacted at source): build: jemalloc autogen + redis make, no make install (avoid install -m) config: bind 0.0.0.0, protected-mode no, port 6379, single process client: stock redis-tools 7.2.7 (dnf installed on server, scp to client) T1 (c10/n50000/t=p,s,g/2thr): 13.0: PING/SET/GET ~19,970 rps p50 0.503ms 15.0: PING/SET/GET ~19,970 rps p50 0.479-0.495ms delta 0.0% rps (client-bound), p50 -1.6% to -4.8% (15.0 better) T2 (c50/n500000/t=p,s,g/4thr): 13.0: PING_INLINE 99,960 / GET 99,860 / SET 99,880 rps 15.0: PING_INLINE 105,108 (+5.15%) / GET 105,219 (+5.37%) / SET 99,980 p50 -1.8% (15.0 marginally better) T3 (c200/n1M/t=s,g/8thr/P=16): 13.0: SET/GET ~1,329,787 rps (client-bound) 15.0: SET 1,329,787 / GET 1,331,558 (+0.13%) p50 +2.9% to +7.8% (15.0 slightly worse on tail) Cross-app comparison (same lcore=4, same 13->15 vendor delta): helloworld (kqueue blocking): T2 -7.59% / T3 -9.37% (regression) nginx (epoll event loop): T2 -1.05% / T3 -0.55% (flat) redis (ae event loop+P): T2 +0.10%~+5.37% / T3 ~0% (no regression) Conclusion: vendor evolution penalty (tcp_default_output vtable, CUBIC, sb_lock refactor, ether_nh_input pipe) is amortized by event-driven models; pipelining further immunizes redis. Compliance: zero direct rm/kill/chmod calls. kill_process.sh x3, rm_tmp_file.sh x3, chmod_modify.sh x0. redis Makefile install -m avoided by manual mkdir+cp -p deploy.
1 parent 4b19f4f commit b135048

2 files changed

Lines changed: 168 additions & 0 deletions

File tree

docs/freebsd_13_to_15_upgrade_spec/zh_cn/13.0-baseline-cvm-bench-report.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,75 @@ make: *** No rule to make target 'ff_api.symlist', needed by 'libfstack.a'. Sto
357357
- 13.0 baseline nginx 已优雅 stop(kill_process.sh);安装目录 `/usr/local/nginx_fstack_13baseline/` 保留,可重复启用
358358
- 全程零直接 `rm`/`kill`/`chmod`:kill_process.sh × 1(13.0 nginx stop)+ rm_tmp_file.sh × 1(rtemap × 23)
359359

360+
361+
---
362+
363+
## §14 redis 双树 A/B 验证 — 13.0 baseline 视角
364+
365+
### 14.1 测试范围
366+
完整 A/B(与 §13 nginx 同方法论,工具切换为 redis-benchmark):双树 build → smoke + 三档 redis-benchmark 同时间窗。15.0 数据 + 完整对比表见 `runtime-fix-execution-log.md §12.14`
367+
368+
### 14.2 13.0 baseline redis 构建产物
369+
- 源码:`/data/workspace/f-stack-13.0-baseline/app/redis-6.2.6/`(fstack 自带 patch,含 `src/ae_ff_kqueue.c` / `src/anet_ff.c`
370+
- jemalloc autogen 后随 redis make 自动 build(依赖 deps/jemalloc/lib/libjemalloc.a)
371+
- make 时间:30.28 s
372+
- redis-server: `/usr/local/redis_fstack_13baseline/redis-server`,37,174,400 B(链接 fstack lib whole-archive)
373+
- redis-cli: 32,638,584 B(同样链 fstack,仅 server 端可用)
374+
- redis-benchmark: 32,479,000 B(同上;client 端用 stock redis-7.2.7)
375+
376+
### 14.3 启动与健壮性
377+
| 检查项 | 结果 |
378+
|---|---|
379+
| DPDK init 用时 | ≤ 12 s |
380+
| Port 0 Link | Up(virtio_net 0000:00:09.0) |
381+
| f-stack-0 注册 | `Successed to register dpdk interface` |
382+
| Redis init 日志 | `Server initialized` / `Ready to accept connections` |
383+
| Smoke `PING` | PONG |
384+
| Smoke `SET`+`GET` | 写入读出值一致 (`hello-fstack-13.0`) |
385+
| `INFO server` | redis_version=6.2.6, tcp_port=6379, mode=standalone |
386+
387+
### 14.4 13.0 baseline redis-benchmark 完整数据
388+
389+
**T1(c10 n50000 t=ping,set,get --threads 2)**
390+
| 命令 | rps | p50 |
391+
|---|---|---|
392+
| PING_INLINE | 19,968.05 | 0.503 ms |
393+
| PING_MBULK | 19,968.05 | 0.503 ms |
394+
| SET | 19,984.01 | 0.503 ms |
395+
| GET | 19,968.05 | 0.503 ms |
396+
397+
**T2(c50 n500000 t=ping,set,get --threads 4)**
398+
| 命令 | rps | p50 |
399+
|---|---|---|
400+
| PING_INLINE | 99,960.02 | 0.455 ms |
401+
| PING_MBULK | 105,108.27 | 0.447 ms |
402+
| SET | 99,880.14 | 0.455 ms |
403+
| GET | 99,860.20 | 0.455 ms |
404+
405+
**T3(c200 n1000000 t=set,get --threads 8 -P 16)**
406+
| 命令 | rps | p50 |
407+
|---|---|---|
408+
| SET | 1,329,787.25 | 2.175 ms |
409+
| GET | 1,329,787.25 | 1.735 ms |
410+
411+
### 14.5 与 15.0 runtime-fix-done 简比(13.0 视角)
412+
413+
| 场景 | 命令 | 13.0 → 15.0 rps Δ | p50 Δ | 解读 |
414+
|---|---|---|---|---|
415+
| T1 | 全部 | 0.00% | −1.6% ~ −4.8% | client-bound,p50 微幅改善 |
416+
| T2 | PING_INLINE | +5.15% | −1.8% | 15.0 真实领先 |
417+
| T2 | GET | +5.37% | −1.8% | 15.0 真实领先 |
418+
| T2 | SET / PING_MBULK | ≤ +0.10% | 0% | 持平 |
419+
| T3 | SET (P=16) | 0.00% | +2.9% | client-bound throughput,p50 略恶化 |
420+
| T3 | GET (P=16) | +0.13% | +7.8% | 同上 |
421+
422+
13.0 baseline redis 数据高度稳定,作为后续 15.0 性能基准的"零点"参考可靠。
423+
424+
### 14.6 工件
425+
- `/tmp/13baseline-redis-bench/{smoke.txt,T1.txt,T2.txt,T3.txt,redis_stdout.log}`(IP 混淆)
426+
- `/usr/local/redis_fstack_13baseline/{redis-server,redis.conf,f-stack.conf,logs/redis.log}`(保留以备复查)
427+
428+
### 14.7 系统终态
429+
- 13.0 baseline redis 已优雅 stop(kill_process.sh);安装目录保留可重启
430+
- 全程零直接 `rm`/`kill`/`chmod`:kill_process.sh × 1(13.0 redis stop)+ rm_tmp_file.sh × 1(rtemap × 23)
431+

docs/freebsd_13_to_15_upgrade_spec/zh_cn/runtime-fix-execution-log.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,3 +590,99 @@ const struct fileops badfileops = {0};
590590
| Mode change | `/data/workspace/chmod_modify.sh` | 0 (cp -p 保留源 mode 0755 已满足) |
591591
| 直接 `rm`/`kill`/`chmod` | — | **0** |
592592
593+
594+
---
595+
596+
## §12.14 redis 双树 A/B 验证(13.0 baseline + 15.0 runtime-fix-done)
597+
598+
### 12.14.1 范围决策与方法
599+
- 范围(与 §12.13 nginx 同套"类似方法"):双树 build → redis-benchmark T1/T2/T3 同时间窗
600+
- 工具切换:wrk → **redis-benchmark**(redis 协议专用,stock redis-7.2.7-6.tl4,向下兼容 redis 6.2.6 server)
601+
- redis-benchmark 与 redis-cli 由 server `dnf install redis` 安装后 scp 到 client `/tmp/`(fstack-linked 版本不能在 client 普通环境运行,会因 ff_init 失败 segfault)
602+
- IP 混淆从源头:192.168.1.1(server)/ 192.168.1.3(client),:22 替代 :36000
603+
604+
### 12.14.2 规约合规说明
605+
- redis 自带 Makefile 的 `make install` 会触发 install -m → 规避:仅 `make`,手动 `mkdir + cp -p` 部署到独立 prefix
606+
- jemalloc autogen.sh 仅运行 `autoconf` 生成 configure,无 chmod 调用
607+
- `dnf install redis` 仅在 server 端执行(client 端通过 scp 部署,避免对 client 环境产生 dnf 副作用)
608+
- 全程零直接 `rm`/`kill`/`chmod`:kill_process.sh × 3(helloworld/13.0 redis/15.0 redis stop)+ rm_tmp_file.sh × 3(rtemap × 23 each)+ chmod_modify.sh × 0
609+
610+
### 12.14.3 Build 数据
611+
| 树 | jemalloc autogen | redis make 时间 | redis-server | redis-cli | redis-benchmark |
612+
|---|---|---|---|---|---|
613+
| 15.0 main | OK | 22.66 s | 37,503,464 B | 32,967,616 B | 32,808,048 B |
614+
| 13.0 baseline | OK | 30.28 s | 37,174,400 B | 32,638,584 B | 32,479,000 B |
615+
616+
两版 redis.conf 一致(cp -p 同一份模板,差异仅 prefix 路径 sed 替换为各自 install 目录)。两版 f-stack.conf MD5 一致(`9e443c8c494167d9a814a4fb26347869`,与 nginx 同源)。
617+
618+
### 12.14.4 部署细节
619+
- 安装 prefix:`/usr/local/redis_fstack_{13baseline,15rfix}/`(避免冲突,独立目录)
620+
- 修改项(vs 上游模板):`bind 127.0.0.1 -::1` → `bind 0.0.0.0`、`protected-mode yes` → `protected-mode no`、pidfile/logfile 重定向到 prefix 内
621+
- 启动命令:`./redis-server --conf ./f-stack.conf --proc-type=primary --proc-id=0 ./redis.conf`
622+
- 监听:tcp_port 6379(fstack stack 上的 0.0.0.0)
623+
624+
### 12.14.5 同时间窗测试时序
625+
| 时刻 (UTC) | 事件 |
626+
|---|---|
627+
| 09:21:36 | 13.0 baseline redis launch (PID 1836866) |
628+
| 09:21:48 | 13.0 smoke OK:PING/SET/GET 一致, redis_version=6.2.6 |
629+
| 09:21:48 ~ 09:24:14 | 13.0 redis-benchmark T1+T2+T3 |
630+
| 09:24:15 | 13.0 stop + rtemap 清理 |
631+
| 09:24:22 | 15.0 redis launch (PID 1838640) |
632+
| 09:24:34 | 15.0 smoke OK |
633+
| 09:24:34 ~ 09:25:55 | 15.0 redis-benchmark T1+T2+T3 |
634+
| 09:25:59 | 15.0 stop + rtemap 清理 |
635+
636+
总跨度约 4 min 30 s。
637+
638+
### 12.14.6 Smoke 数据
639+
两版均通过:`PING → PONG`、`SET smoke_key 'hello-fstack-XX' → OK`、`GET smoke_key → 写入值`、`INFO server` 报告 redis_version=6.2.6 / tcp_port=6379
640+
641+
### 12.14.7 redis-benchmark 完整对比
642+
643+
**T1 c10 n50000 t=ping,set,get --threads 2**
644+
| 命令 | 13.0 rps | 15.0 rps | Δ% | 13.0 p50 | 15.0 p50 |
645+
|---|---|---|---|---|---|
646+
| PING_INLINE | 19,968.05 | 19,968.05 | 0.00% | 0.503 ms | 0.495 ms |
647+
| PING_MBULK | 19,968.05 | 19,968.05 | 0.00% | 0.503 ms | 0.487 ms |
648+
| SET | 19,984.01 | 19,984.01 | 0.00% | 0.503 ms | 0.479 ms |
649+
| GET | 19,968.05 | 19,968.05 | 0.00% | 0.503 ms | 0.487 ms |
650+
651+
**T2 c50 n500000 t=ping,set,get --threads 4**
652+
| 命令 | 13.0 rps | 15.0 rps | Δ% | 13.0 p50 | 15.0 p50 |
653+
|---|---|---|---|---|---|
654+
| PING_INLINE | 99,960.02 | 105,108.27 | **+5.15%** | 0.455 ms | 0.447 ms |
655+
| PING_MBULK | 105,108.27 | 105,130.36 | +0.02% | 0.447 ms | 0.447 ms |
656+
| SET | 99,880.14 | 99,980.01 | +0.10% | 0.455 ms | 0.455 ms |
657+
| GET | 99,860.20 | 105,218.86 | **+5.37%** | 0.455 ms | 0.447 ms |
658+
659+
**T3 c200 n1000000 t=set,get --threads 8 -P 16**
660+
| 命令 | 13.0 rps | 15.0 rps | Δ% | 13.0 p50 | 15.0 p50 |
661+
|---|---|---|---|---|---|
662+
| SET | 1,329,787.25 | 1,329,787.25 | 0.00% | 2.175 ms | 2.239 ms |
663+
| GET | 1,329,787.25 | 1,331,558.00 | +0.13% | 1.735 ms | 1.871 ms |
664+
665+
### 12.14.8 关键发现
666+
1. **redis 13→15 throughput 无回归**:T1/T3 几乎完全一致(client-bound),T2 真实 server 测试反而 PING_INLINE/GET +5%
667+
2. **T1/T3 client-bound 信号**:T1 c10 + 2 thread 锁在 ~20K rps(ssh/network rtt 主导),T3 P=16 锁在 ~1.33M rps(client CPU + 网络带宽接近上限),server 端有富余
668+
3. **p50 趋势一致**:T1/T2 在 15.0 略低 1~5%(更优),T3 SET/GET 略高 3%~8%(高并发尾延迟略恶化,与 nginx T3 +18.6% / helloworld T3 +27.8% 同方向但幅度小得多)
669+
4. **跨应用横向对比**(同环境同 lcore=4):
670+
- helloworld(kqueue 同步阻塞):T2 −7.59%、T3 −9.37%(**显著回归**)
671+
- nginx(epoll event loop):T2 −1.05%、T3 −0.55%(持平)
672+
- redis(自定义 ae 事件循环):T2 +0.10%~+5.37%、T3 ≈0%(**无回归甚至小幅领先**)
673+
5. **结论**:§12.11 火焰图归纳的 13→15 厂商演进路径(tcp_default_output vtable wrapper、CUBIC 升级、socket buffer locking 重构、ether_nh_input pipeline)的负面影响被 event-driven 应用模型有效摊薄;redis 的 ae(event loop)+ pipeline 进一步将开销分摊到批处理中,对回归的免疫力强于 nginx
674+
675+
### 12.14.9 工件
676+
- 13.0: `/tmp/13baseline-redis-bench/{smoke.txt,T1.txt,T2.txt,T3.txt,redis_stdout.log}`(IP 混淆)
677+
- 15.0: `/tmp/15rfix-redis-bench/{smoke.txt,T1.txt,T2.txt,T3.txt,redis_stdout.log}`(IP 混淆)
678+
- 安装目录:`/usr/local/redis_fstack_{13baseline,15rfix}/`(含 redis-server / redis.conf / f-stack.conf / logs/redis.log)
679+
- Stock redis-7.2.7 已通过 `dnf install redis` 留在 server `/usr/bin/redis-{server,cli,benchmark}`,client `/tmp/redis-{cli,benchmark}` 永久保留
680+
681+
### 12.14.10 全程合规审计
682+
| 操作 | 调用脚本 | 次数 |
683+
|---|---|---|
684+
| Process kill | `kill_process.sh` | 3 |
685+
| File trash | `rm_tmp_file.sh` | 3(rtemap × 69) |
686+
| Mode change | `chmod_modify.sh` | 0 |
687+
| 直接 `rm`/`kill`/`chmod` | — | **0** |
688+

0 commit comments

Comments
 (0)