Table of Contents

Core.Net 形态面 loopback 基线

复现入口:dotnet run -c Release --project benchmarks/TC.Tier.Core.Net.Benchmarks (测量纪律:AutoFlush 输出不进测量区间 / Stopwatch 净计时 / GC 计数对照 / 收端到齐确认才停表) 环境:12th Gen Intel Core i5-12400 · Windows 11 (10.0.26200) · .NET 8 · TCP loopback ∥ InProcess 同轮对照

数字(2026-09-01 收口轮)

TCP loopback InProcess(直通对照)
数据报 64B × 100k(串行单向) 47.7k msg/s 5.75M msg/s
数据报 64KiB × 2k 5.07k msg/s(317 MB/s) 5.77M msg/s(引用传递)
请求 RTT 64B × 2k 均值 0.086ms · p50 0.081ms · p99 0.165ms 均值 0.002ms
请求流水线 64B 窗口 256 × 50k 49.4k op/s 812k op/s
流式 64KiB 帧 × 2k(125MB) 308 MB/s(4.9k 帧/s) ~118 GB/s(直通)
流式 1KiB 帧 × 20k(20MB) 45 MB/s(45.8k 帧/s) 4.5 GB/s

怎么读这些数字

  • 请求 RTT 86µs 是单请求同步往返的全链成本(编解码 + 帧头/CRC + TCP loopback 栈 + 关联表);InProcess 直通 2µs——传输税 ≈ 84µs,由 loopback 网络栈主导,协议面 (帧编解码/关联表)占比小。
  • 小帧吞吐地板 ≈ 20µs/帧:数据报 64B 串行(21µs/条)与流式 1KiB 帧(22µs/帧)同量级 ——单连接逐帧 syscall 写是地板;64KiB 帧摊薄后达 308 MB/s。
  • 窗口并发收益有界:流水线窗口 256(49.4k op/s)≈ 串行 RTT 吞吐(11.6k)的 4.3× ——单链路读循环+写锁串行化是天花板,与 raft 场景实测(单连接流水线 98.6k op/s)同量级。
  • InProcess 是同构基准而非性能目标:hub 直通零拷贝派发,用于隔离传输栈成本 (机制/形态代码两介质共用——差异即网络栈+帧编解码税)。

raft 引擎三节点(Core.Net 夹具装配,2026-09-09——5s 预算窗口径)

复现:RAFT_PROBE_SECONDS=5 dotnet run -c Release --project benchmarks/RaftPerfProbe (TCP 形态 RAFT_PROBE_NET=tcp;committed 完成档 RAFT_PROBE_COMMITTED=1RAFT_PROBE_ROUNDS 改定轮数 / RAFT_PROBE_HOLD 保持窗供剖析;DotNext 对照 = benchmarks/RaftProtocolProbe 同机同轮)。 装配 = FsRaftStore(memory 卷)+ ApplyPipeline + RaftStateMachine + InProcessTransportHub/ ClusterTransport(同构夹具模式)。

测量口径:缺省 5s 时间预算内跑满微轮(数千轮 × 800 in-flight);sustained = 总条 / 总墙钟, 轮中位/p10/p90 为微轮瞬时吞吐分布——定轮短窗(<100ms)处于调度噪声区出不了性能。 线编码为 0-Copy 装配(EncodePooled 池化载荷):全链分配 ~2KB/条(InProcess)· ~12KB/条(TCP), 编码数组占比 <3%——端到端吞吐对单点分配不敏感(同轮 A/B:新旧 ±4%,在轮方差内)。

数字(2026-09-09 轮,3 形态 × 3 同轮交替取中位;12 逻辑核 · .NET 8 · Windows 11):

引擎 形态/完成档 串行 p50 流水线 sustained 轮中位(p10 / p90) 分配/条
TC.Tier Core.Net InProcess · applied 0.09ms 606k op/s 1.18M(308k / 1.60M) ~2.0KB
TC.Tier Core.Net TCP · applied 0.25ms 142k op/s 397k(155k / 497k) ~12.5KB
TC.Tier Core.Net TCP · committed 0.22ms 147k op/s 517k(174k / 635k) ~12.7KB
  • 完成语义档位ReplicateAsync 完成 = applied(read-your-writes); ReplicateCommittedAsync 完成 = committed(多数派提交即返——DotNext 同口径)。 两档 TCP sustained 同级(142k ∥ 147k)——完成档不是吞吐差异点。
  • 轮级方差(sustained 114k–185k)= 队列驱动多执行体调度税:每节点共识循环/apply worker/ tick/lane×2/writer×2/reader×2 专执行体 ×3 节点,同机 12 核随机竞争——跨版本/跨轮对比 取同轮交替 + 中位口径。
  • DotNext 同轮对照(2026-09-09,两探针同机交替 3 轮,测量窗 ≈5-6.5s):DotNext TCP commit sustained 中位 191k(189k-191k,极稳)∥ 本探针 TCP committed 中位 183k(146k-206k)—— 0.96× 同级;串行 p50 DotNext 0.11ms ∥ 本探针 0.23ms(单请求串行 RTT 约 2× 差距, loopback 往返主导——引擎侧 InProcess 串行 0.09ms 为协议+引擎净成本)。
  • 引擎侧每条 ~3.8µs(InProcess)——吞吐上限 = 串行化链摊薄(共识循环单写者 + follower 追加门 + apply 单 worker)。
  • ★ 夹具存储读面 O(1) 直接寻址(index 连续 + 截前缀全量保留 → _entries[index-1])+ 纯追加定位写(整批单缓冲单次写 + 缓存句柄;坏尾截断 = SetLength 原位)是硬前提: O(N) 线性扫/全量重写形态下流水线随日志长度单调退化(90.9k@2k 条 → 35.5k@8k 条、分配 55KB/条)。

复现

dotnet build benchmarks/TC.Tier.Core.Net.Benchmarks -c Release
dotnet build-server shutdown        # 净测量——关构建服务
dotnet run --no-build -c Release --project benchmarks/TC.Tier.Core.Net.Benchmarks
  • 段序固定(数据报小/大 → RTT → 流水线 → 流式 64KiB/1KiB),每段先探测/预热再净计时;
  • 基准全部走公开消费面(IProtocolTransport 三形态 API)——数字即使用方视角;
  • TCP 装配 = 成员制两节点(较大方监听、较小方拨号);同轮先 TCP 后 InProcess,数字可比。