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=1;RAFT_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,数字可比。