Files
zvfs/plan/baseline_commands.md

3.3 KiB
Raw Blame History

Phase 0 - 基线命令与验证记录

  • 日期: 2026-03-02
  • 主机: ubuntu(本地开发机)
  • db_bench 路径: /home/lian/env/rocksdb-test/db_bench
  • LD_PRELOAD 库: /home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so

1) 成功基线(不启用 LD_PRELOAD

命令

rm -rf /tmp/rdb_phase0_plain && \
strace -f -qq -o /tmp/phase0_plain.strace \
  -e trace=%file,%desc,fsync,fdatasync,ftruncate,fallocate,pread64,pwrite64,lseek,rename,renameat,renameat2 \
  /home/lian/env/rocksdb-test/db_bench \
  --benchmarks=fillseq \
  --db=/tmp/rdb_phase0_plain \
  --num=5000 \
  --value_size=128 \
  --threads=1 \
  --compression_type=none \
  --stats_interval_seconds=0

结果摘要

  • 命令退出码: 0
  • db_bench 输出: fillseq ... 5000 operations(成功)
  • errno 分布trace 全局):
    • ENOENT x11
    • EEXIST x9
  • 关键 syscall全局计数:
    • openat 91, fcntl 82, pread64 8, fsync 10, fdatasync 10, ftruncate 5, fallocate 5, rename 9
  • DB 路径相关 syscall/tmp/rdb_phase0_plain:
    • openat 61, mkdir 12, access 10, rename 9, unlink 12, rmdir 2

2) 失败分支(启用 LD_PRELOAD/zvfs 路径)

命令

strace -f -qq -o /tmp/phase0_preload.strace \
  -e trace=%file,%desc,fsync,fdatasync,ftruncate,fallocate,pread64,pwrite64,lseek,rename,renameat,renameat2 \
  env LD_PRELOAD=/home/lian/share/10.1-spdk/zvfs/zvfs/libzvfs.so \
  /home/lian/env/rocksdb-test/db_bench \
  --benchmarks=fillseq \
  --db=/zvfs/rdb_phase0_preload \
  --num=1000 \
  --value_size=128 \
  --threads=1 \
  --compression_type=none \
  --stats_interval_seconds=0

结果摘要

  • 命令退出码: 1
  • 关键报错:
    • Cannot use IOVA as 'PA'
    • Failed to initialize DPDK
    • open error: ... While mkdir if missing: /zvfs/rdb_phase0_preload: No such file or directory
  • /zvfs/rdb_phase0_preload 相关错误码:
    • ENOENT x4
  • 直接证据trace:
    • openat(..., "/zvfs/rdb_phase0_preload", ... O_DIRECTORY) = -1 ENOENT
    • mkdir("/zvfs/rdb_phase0_preload", 0755) = -1 ENOENT

3) 提取统计的复用命令

3.1 syscall 频次(全局)

sed -E 's/^\[pid +[0-9]+\] +//; s/^[0-9]+ +//' /tmp/phase0_plain.strace \
  | grep -oP '^[a-zA-Z_][a-zA-Z0-9_]*(?=\()' \
  | sort | uniq -c | sort -nr

3.2 errno 分布

grep -oP '= -1 [A-Z0-9]+' /tmp/phase0_plain.strace | awk '{print $3}' | sort | uniq -c | sort -nr
grep -oP '= -1 [A-Z0-9]+' /tmp/phase0_preload.strace | awk '{print $3}' | sort | uniq -c | sort -nr

3.3 DB 路径相关 syscall

grep '/tmp/rdb_phase0_plain' /tmp/phase0_plain.strace \
  | sed -E 's/^\[pid +[0-9]+\] +//; s/^[0-9]+ +//' \
  | grep -oP '^[a-zA-Z_][a-zA-Z0-9_]*(?=\()' \
  | sort | uniq -c | sort -nr

4) Phase0 正确性验证清单(执行记录)

  • 每个“phase2 必须实现 syscall”都在矩阵中给出复现证据或来源。
  • 基线命令可重复执行(成功路径与失败路径各 1 组)。
  • 输出包含 syscall 统计与错误码分布。
  • 验证记录已写入 plan/baseline_commands.md

5) 已知限制phase1 前需处理)

  1. 当前环境中 SPDK 初始化失败IOVA/PA导致无法在本机直接完成完整 /zvfs I/O 链路验证。
  2. phase0 主要覆盖 fillseqphase1/phase2 开始前应补 readrandom/overwrite 的 syscall 采样。