解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# 裸 Socket 层性能测试报告
> 测试范围:**ä¸å«å议编ç 器**的裸 Socket æ”¶å‘链路——TCP/UDP × å•包å•帧/å•包多帧(粘包)× 包大å°ï¼ˆ32B~1MB)× å¹¶å‘ Ã— 客户端接收方å¼ï¼›**åžå与分é…以æœåŠ¡ç«¯ä¸ºå£å¾„ï¼ˆä¼˜åŒ–ç›®æ ‡ï¼‰ï¼Œå¾€è¿”å»¶è¿Ÿä¸ºå®¢æˆ·ç«¯è§‚å¯Ÿ**。
> å…³è”æŠ¥å‘Šï¼š[网络库编解ç 器Echo性能测试报告](/NewLife/X/Blob/v12.0.2026.1024/Doc/性能/网络库编解ç 器Echo性能测试报告.md)(å议层)ã€[内å˜åˆ†é…ä¸Žæ‹·è´æˆæœ¬æŠ¥å‘Š](/NewLife/X/Blob/v12.0.2026.1024/Doc/性能/内å˜åˆ†é…ä¸Žæ‹·è´æˆæœ¬æŠ¥å‘Š.md)。
> æ•°æ®ç‰ˆæœ¬ï¼š**v3.2(2026-10-09 釿ž„åŽå¤æµ‹ï¼‰**——æœåŠ¡ç«¯å£å¾„(åžå/分é…)ã€å¹¶å‘与尺寸扫æã€å¸¦å®½æ¯”特率å•ä½ï¼›æœ¬æ¬¡ä¸ºæŽ¥æ”¶çޝ/会è¯é‡æž„åŽçš„å›žå½’å¤æµ‹ï¼Œ**儿¡£ä¸Ž v3.1 æŒå¹³ã€æ— 回归**,UDP 64KB 峰值 134.5→138.9 Gbps(+3.2%)ã€TCP 1KB å¹¶å‘峰值 13.7→14.5 Gbpsï¼›v3.1 ä¼˜åŒ–é¡¹ä¸Žæœ¬æ¬¡å¤æµ‹ç»“论è§ç¬¬ä¸ƒèŠ‚ï¼›å·¥å…· `Benchmark/NetLoadTest`(`run-matrix.ps1` 一键å¤çŽ°ï¼‰ã€‚
> **v3.3ï¼ˆåŒæ—¥ï¼Œå·²äºŽ v3.8 回退)**:UDP 接收改 `ReceiveFromAsync`——æ¯åŒ…åˆ†é… **216→104 B**ã€æ¯åŒ… CPU **-1.3 µs**ã€1KB 高并å‘包率 **+18.8%**(è§ç¬¬ä¸ƒèŠ‚ï¼‰ã€‚
> **v3.4ï¼ˆåŒæ—¥ï¼‰**ï¼šå®šä½ TCP 大包档å—**å†…æ ¸æŽ¥æ”¶çª—å£**é™åˆ¶ï¼Œæ–°å¢ž `SocketSetting.ReceiveBufferSize`ï¼ˆå†…æ ¸æŽ¥æ”¶ç¼“å†²ï¼Œé»˜è®¤ 0=䏿”¹ï¼‰ï¼›è´Ÿè½½/高延迟下 1MB 报文 +25%ï¼Œç©ºé—²å›žçŽ¯æ— æ”¶ç›Šï¼ˆè§ç¬¬ä¸ƒèŠ‚ï¼‰ã€‚
> **v3.5ï¼ˆåŒæ—¥ï¼‰**ï¼šå¤šè¿›ç¨‹åŠ åŽ‹å®žéªŒè¯æ˜Ž**æœåŠ¡ç«¯è¿œæœªé¥±å’Œ**(TCP 1KB 1.48 Mpps ä»… 1.31 æ ¸ã€UDP 1KB 600 kpps 约 2.0 æ ¸ï¼‰ï¼Œä¿®æ£"å•进程接收环饱和"è¡¨è¿°ï¼ˆè§ 5.2)。
> **v3.6ï¼ˆåŒæ—¥ï¼‰**:**NativeAOT vs JIT 对比**——AOT å…¨é¢å°å¹…领先(åžå +4~11%ã€å¾€è¿” P50 -12%ã€åˆ†é…更低),å¯åŠ¨æ— å·®å¼‚ï¼ˆè§ç¬¬å…«èŠ‚ï¼‰ã€‚
> **v3.7ï¼ˆåŒæ—¥ï¼‰**:**延迟尾部分ä½å½’å› **â€”â€”å¹¶å‘æ‰«æè¯æ˜Ž RTT ≈ 并呿•°/åžå(Little 定律)⇒ å»¶è¿Ÿä¸»ä½“æ˜¯æŽ’é˜Ÿï¼›æ— è½½ä¸‹åº“ä»…æ¯”è£¸ Socket 多 2.4 µs ä¸”å°¾å»¶è¿Ÿæ›´ä¼˜ï¼ˆè§ 4.3)。
> **v3.8(2026-10-12)**:**UDP 包信æ¯å›žå½’默认**——é€åŒ…ç»™å‡ºã€Œæ•°æ®æŠ¥å®žé™…åˆ°åŒ…çš„æœ¬æœºç½‘å¡åœ°å€ã€æ˜¯ç½‘ç»œåº“æž¶æž„è®¾è®¡è¦æ±‚çš„å¯è§‚测能力,故æ¢å¤ `ReceiveMessageFromAsync` 为默认(Mono/Android ä»èµ° `ReceiveFromAsync`ï¼‰ï¼›ä»£ä»·å¤æµ‹ä¸ºæ¯åŒ… **104→216 B**ã€1KB 高并å‘包率 **-15%**(386k→327 kppsï¼‰ï¼Œä¸æƒ³ä»˜è¯¥ä»£ä»·çš„高åžå场景å¯è®¾ `UdpServer.PacketInformation=false`(è§ç¬¬ä¸ƒèŠ‚ v3.8)。
## ä¸€ã€æ ¸å¿ƒç»“论
> **å£å¾„**:æœåŠ¡ç«¯ä¸Žå®¢æˆ·ç«¯åˆ†ç¦»è¿›ç¨‹ï¼›**åžåä¸Žåˆ†é… = æœåŠ¡ç«¯å£å¾„**(åžåå–æœåŠ¡ç«¯æŽ¥æ”¶ç¨³æ€ï¼›åˆ†é…å–æœåŠ¡ç«¯è¿›ç¨‹æ¯æ¶ˆæ¯æ‰˜ç®¡åˆ†é…),**延迟 = 客户端观察 RTT**(往返时间åªèƒ½ç”±å‘起方测);æœåŠ¡ç«¯æŽ¥æ”¶å§‹ç»ˆæ˜¯å¼‚æ¥æŽ¥æ”¶çŽ¯ï¼ˆSAEA)。å•ä½ï¼šå¸¦å®½ = 比特率(1 Gbps = 10â¹ bit/s),包率 = kpps / Mpps。
### 表 1 åžå(æœåŠ¡ç«¯ç¨³æ€ï¼Œå„æ¡£å–æœ€ä¼˜å¹¶å‘)
| åè®® | 场景 | æœ€ä¼˜å¹¶å‘ | 带宽 | 包率 | 帧率(粘包) | æœåŠ¡ç«¯åˆ†é… B/msg |
|---|---|---:|---:|---:|---:|---:|
| TCP | å•帧 32B | 8C | 0.36 Gbps | 1.40 Mpps | — | 0.12 |
| TCP | å•帧 1KB | 16C | **14.5 Gbps** | 1.77 Mpps | — | 0.12 |
| TCP | å•帧 64KB | 4C * | **53.1 Gbps** | 101 kpps | — | 1.1 |
| TCP | å•帧 1MB | 8C | 32.2 Gbps | 3.8 kpps | — | 264 |
| TCP | 粘包 24B 帧(64KB 包) | 8C | 40.0 Gbps | — | **208 M帧/s** | 1.6 |
| UDP | å•帧 32B | 4C | 0.07 Gbps | 281 kpps | — | 216 |
| UDP | å•帧 256B | 4C | 0.60 Gbps | 294 kpps | — | 216 |
| UDP | å•帧 1KB | 32C | 4.12 Gbps | **503 kpps** | — | 216 |
| UDP | å•帧 4KB | 4C | 8.69 Gbps | 265 kpps | — | 216 |
| UDP | å•帧 16KB | 8C | 40.4 Gbps | 308 kpps | — | 216 |
| UDP | å•帧 64KB(IP 分片) | 32C | **138.9 Gbps** | 265 kpps | — | 216 |
| UDP | 粘包 24B 帧(64KB 包) | 4C | 81.2 Gbps | — | **417 M帧/s** | 216 |
> * TCP 大包跨è¿è¡Œæ³¢åŠ¨å¤§ï¼š64KB 本次矩阵 4 å¹¶å‘å•è·‘ 44.6 Gbps,5 æ¬¡å¤æµ‹ 49.2/58.1/53.1/58.0/41.0(ä¸ä½ 53.1,表内å–夿µ‹ä¸ä½ï¼‰ã€8 å¹¶å‘ 5 æ¬¡å¤æµ‹ 42.0/35.1/33.4/41.1/35.4(ä¸ä½ 35.4);1KB 峰值 16 å¹¶å‘ 14.5 Gbps 亦为å•跑高值,5 æ¬¡å¤æµ‹ 13.1/12.1/14.1/15.3/11.9(ä¸ä½ 13.1)。
### 表 2 往返延迟(客户端观察,µs)
| åè®® | åŒ…å¤§å° | å¹¶å‘ | æŽ¥æ”¶æ–¹å¼ | P50 | P95 | P99 | æœåŠ¡ç«¯åˆ†é… B/msg |
|---|---|---:|---|---:|---:|---:|---:|
| TCP | 32B | 4 | åŒæ¥ | 49.2 | 65.0 | 76.8 | 1.1 |
| TCP | 1KB | 4 | åŒæ¥ / å¼‚æ¥ / 事件 | 46.7 / 58.2 / 50.3 | 63.6 / 78.2 / 70.3 | 73.9 / 92.2 / 82.1 | 1.0-1.3 |
| TCP | 64KB | 4 | åŒæ¥ / å¼‚æ¥ / 事件 | 103.2 / 85.6 / 97.5 | 137.5 / 103.4 / 122.3 | 167 / 116 / 143 | 1.8-2.2 |
| TCP | 1MB | 4 | åŒæ¥ | 1509.8 | 2593.2 | 3191 | 235 |
| TCP | 1KB | 64 | åŒæ¥ / å¼‚æ¥ / 事件 | 290.7 / 271.4 / 265.5 | 381.0 / 366.7 / 328.2 | 425 / 463 / 368 | 2.3-2.4 |
| TCP | 64KB | 64 | åŒæ¥ / å¼‚æ¥ / 事件 | 1632.5 / 1375.1 / 1379.0 | 3212.8 / 2918.7 / 2789.8 | 4014 / 3756 / 3560 | 11.7-14.2 |
| UDP | 32B | 1 | åŒæ¥ | 39.5 | 52.3 | 88 | 258 |
| UDP | 1KB | 1 | åŒæ¥ / 事件 | 40.1 / 48.9 | 54.0 / 64.3 | 90 / 99 | 258-259 |
| UDP | 64KB | 1 | åŒæ¥ | 60.7 | 92.0 | 129 | 260 |
### 浓缩结论
- **TCP å°åŒ…ç”±æ¯åŒ…å›ºå®šæˆæœ¬ä¸»å¯¼**:32B 与 1KB åŒ…çŽ‡åŒæ¡£ï¼ˆâ‰ˆ1.4-1.8 Mpps);1KB 带宽从 1 å¹¶å‘ 0.62 Gbps å‡è‡³ 16 å¹¶å‘ **14.5 Gbps**,32/64 å¹¶å‘回è½ï¼ˆ13.4/13.2)——æ‹ç‚¹åœ¨ 16 å¹¶å‘。**注æ„**:这**䏿˜¯**æœåŠ¡ç«¯é¥±å’Œï¼ˆè§ 5.2 åŠ åŽ‹å®žéªŒï¼šæœåŠ¡ç«¯ä»…ç”¨ 0.75-1.31 æ ¸ï¼‰ï¼Œè€Œæ˜¯å®¢æˆ·ç«¯æ¯åŒ… 7.5 µs çš„å†…æ ¸å‘逿ˆæœ¬ä¸Žå›žçŽ¯æ ˆä¸Šé™ã€‚
- **TCP 大包进æ¯å—èŠ‚æˆæœ¬åŒºé—´**:64KB 4 å¹¶å‘夿µ‹ä¸ä½ **53.1 Gbps(≈6.3 GiB/s)**ã€8 å¹¶å‘ä¸ä½ 35.4ï¼›1MB æ¡£ 32.2 Gbps。
- **UDP 包率与并å‘强相关**:1KB 从 4C çš„ 273 kpps å‡è‡³ 32C çš„ **503 kpps**ï¼›64KB 从 4C 80.6 Gbps å‡è‡³ 32C çš„ **138.9 Gbps**(v3.1 134.5,+3.2%)。
- **UDP æœåŠ¡ç«¯æ¯æ¶ˆæ¯åˆ†é…æ’定 216 B(TCP 近零)**:v3.1 已把æ¯åŒ…å—符串键查找开销消除(330→216,GC 频率 ~-40%,è§ç¬¬ä¸ƒèŠ‚ï¼‰ï¼›å‰©ä½™ä¸ºè¿è¡Œæ—¶ç«¯ç‚¹å¯¹è±¡å¼€é”€ï¼ˆSAEA 完æˆå›žè°ƒå°±åœ°æ›´æ–°å¹¶éšä¼šè¯ä¿ç•™ï¼Œæ¯åŒ…必须新建 IPEndPoint)。
- **延迟**:TCP 1KB 4C P50 ≈47µsã€64C ≈266-291µs;事件接收尾延迟最好(64C P99 368µs vs åŒæ¥ 425µs);UDP P50 40-61µsï¼›1MB 大包往返 P50 ≈1.5ms。**延迟主体是排队**(RTT ≈ å¹¶å‘/åžåï¼Œè§ 4.3ï¼‰ï¼Œåº“åœ¨æ— è½½ä¸‹çš„è‡ªèº«å¼€é”€ä»… 2.4 µs。
- **分é…**:TCP æœåŠ¡ç«¯ 0.08-5.5 B/msg(GC 全零;1MB æ¡£ 264 B/msg å·²å½’å› ä¸ºçº¦ 1 MB/s 背景分é…ï¼Œéžæ¯åŒ…æˆæœ¬ï¼Œè§ 5.1);UDP æœåŠ¡ç«¯ 216 B/msgï¼ˆæ¯ ~6.3 万包一次 Gen0);UDP 客户端å‘é€ 41.5→**0.4 B/msg**(v3.1 自动连接,è§ç¬¬ä¸ƒèŠ‚ï¼‰ã€‚
## äºŒã€æµ‹è¯•方法
### 测试环境
```text
夿µ‹æ—¥æœŸï¼š2026-10-09(v3.2,与 v3.1 åŒæœºåŒå£å¾„)
Windows 10 (10.0.19045.6456/22H2)
Intel Core i9-10900K CPU 3.70GHz, 1 CPU, 20 é€»è¾‘æ ¸å¿ƒ / 10 ç‰©ç†æ ¸å¿ƒ
.NET SDK 10.0.401
Runtime: .NET 10.0.12, X64 RyuJIT x86-64-v3(Server GC)
网络:loopback(127.0.0.1),æœåŠ¡ç«¯ä¸Žå®¢æˆ·ç«¯åˆ†ç¦»è¿›ç¨‹
```
### 工具与å£å¾„(`Benchmark/NetLoadTest`)
- 一键å¤çŽ°ï¼š`Benchmark/NetLoadTest/run-matrix.ps1`(全矩阵约 20 分钟)输出 `results.md / results.json`ï¼›å•场景直连 `NetLoadTest.exe`ï¼›
- **分离进程**:æœåŠ¡ç«¯ç‹¬ç«‹è¿›ç¨‹ï¼ˆ`--server`,é™é»˜ 3 秒输出 `STEADY` 稳æ€ä¸ä½æ•°ï¼šå¸¦å®½/包率/帧率/æœåŠ¡ç«¯åˆ†é…/GC,然åŽè‡ªåŠ¨é€€å‡ºï¼‰ï¼Œå®¢æˆ·ç«¯ `--remote` 连接;
- **ä¸‰ç§æµ‹é‡æ¨¡å¼**:`--oneway` å•å‘上行(æœåŠ¡ç«¯åªè®¡æ•°ï¼Œæµ‹çº¯æŽ¥æ”¶ï¼‰ï¼`pipeline` å›žæ˜¾æµæ°´çº¿ï¼`roundtrip` é€åŒ…å¾€è¿”ï¼ˆé‡‡æ · P50/P95/P99);
- **客户端接收方å¼** `--recvmode`:`sync` åŒæ¥æ‹‰å–ï¼`asyncpull` å¼‚æ¥æ‹‰å–(`ReceiveAsync`)ï¼`event` 事件接收(`Received` 回调);
- å£å¾„è¦ç´ ï¼šé¢„çƒ 2s + çª—å£ 10s;测é‡å‰å‘**é¢„çƒæµé‡**ï¼ˆè§¦å‘æœåŠ¡ç«¯å†·å¯åЍ JIT ä¸Žæ± åŒ–åˆå§‹åŒ–,é¿å…é¦–æ ·æœ¬è®¡å…¥ç™¾æ¯«ç§’çº§å†·å¯åŠ¨ï¼‰ï¼›æœåŠ¡ç«¯æŽ¥æ”¶å§‹ç»ˆæ˜¯å¼‚æ¥æŽ¥æ”¶çŽ¯ï¼ˆSAEA);`--frame 24` 模拟粘包(24B 逻辑帧);UDP å•包钳制 65507 å—节;带宽用比特率(1 Gbps = 10â¹ bit/s ≈ 119 MiB/s)。
- **å¤çŽ°å‰æï¼ˆé‡è¦ï¼‰**:矩阵的ç»å¯¹æ•°å€¼**åªåœ¨å®‰é™çª—å£å†…坿¯”**。本机长期å˜åœ¨éžæœ¬æŠ¥å‘Šçš„背景负载(å¦ä¸€ä¼šè¯çš„ `java` 约 1.1 æ ¸ã€Roslyn 编译æœåС噍 `VBCSCompiler` çªå‘å¯è¾¾ **4 æ ¸**),å åŠ å›žçŽ¯å†…æ ¸æ ˆå¯¹ CPU è°ƒåº¦çš„æ•æ„Ÿæ€§ï¼ŒåŒåœºæ™¯èƒŒé èƒŒå¤æµ‹ç¦»æ•£åº¦å¯è¾¾ **3 å€**(2026-10-10 实测 `tcp-64KB-c4` 三次为 9.84 / 12.65 / 28.31 Gbpsï¼ŒåŒæœŸåކå²é«˜å€¼ 44.6 Gbpsï¼‰ã€‚å› æ¤ï¼š
1. **ä¸è¦è·¨æ—¶æ®µæ¯”较ç»å¯¹å€¼**——判æ–优化效果必须用**交替é…对 A/B**(åŒçª—å£å†…交替跑对照与实验组ã€å¤šè½®å–ä¸ä½ã€åŒºé—´ä¸é‡å )或**åŒçŽ¯å¢ƒå› æžœå®žéªŒ**ï¼›
2. 跑批å‰å…ˆç¡®è®¤ `VBCSCompiler` / `java` ç‰å¤–æ¥è¿›ç¨‹å·²é™é»˜ï¼Œå¦åˆ™å¾—到的全表ä¸èƒ½ç”¨äºŽæ›¿æ¢æŠ¥å‘Šæ•°æ®ã€‚
## 三ã€åžå(æœåŠ¡ç«¯æŽ¥æ”¶ç¨³æ€ï¼‰
### 3.1 TCP
**尺寸曲线(8 客户端)**
| åŒ…å¤§å° | 带宽 | 包率 | æœåŠ¡ç«¯åˆ†é… B/msg | GC |
|---:|---:|---:|---:|---:|
| 32B | 0.36 Gbps | 1.40 Mpps | 0.12 | 0/0/0 |
| 1KB | 12.1 Gbps * | 1.47 Mpps | 0.08 | 0/0/0 |
| 64KB | 37.7 Gbps * | 72 kpps | 1.7 | 0/0/0 |
| 1MB | 32.2 Gbps | 3.8 kpps | 264 | 1/1/1 |
**并呿‰«æï¼ˆ1KB 与 64KB)**
| å¹¶å‘ | 1KB 带宽 / 包率 | 64KB 带宽 |
|---:|---:|---:|
| 1 | 0.62 Gbps / 76 kpps | 16.8 Gbps |
| 4 | 7.05 Gbps / 861 kpps | 44.6 Gbps *ï¼ˆå¤æµ‹ä¸ä½ 53.1) |
| 8 | 12.1 Gbps * / 1.47 Mpps | 37.7 Gbps *ï¼ˆå¤æµ‹ä¸ä½ 35.4) |
| 16 | **14.5 Gbps** / 1.77 Mpps | 32.5 Gbps |
| 32 | 13.4 Gbps / 1.63 Mpps | 29.8 Gbps |
| 64 | 13.2 Gbps / 1.61 Mpps | — |
> * 8 å¹¶å‘两档跨è¿è¡Œæ³¢åŠ¨è¾ƒå¤§ï¼ˆ1KB:11.9-15.3,ä¸ä½ 13.1ï¼›64KB:33.4-42.0,ä¸ä½ 35.4);64KB 4 å¹¶å‘夿µ‹ä¸ä½ 53.1(41.0-58.1)。
- å°åŒ…æ‹ç‚¹åœ¨ **16 å¹¶å‘**(≈14.5 Gbps),å†å¢žåŠ ä¸å†æå‡â€”—**䏿˜¯æŽ¥æ”¶çŽ¯é¥±å’Œ**ï¼ˆåŠ åŽ‹å®žæµ‹æœåŠ¡ç«¯ä»… 0.75-1.31 æ ¸ï¼‰ï¼Œè€Œæ˜¯å®¢æˆ·ç«¯æ¯åŒ… 7.5 µs çš„å†…æ ¸å‘逿ˆæœ¬ä¸Žå›žçŽ¯æ ˆä¸Šé™ï¼Œè§ 5.2ï¼›
- 64KB 大包 4 å¹¶å‘å³è¾¾å³°ï¼ˆå¤æµ‹ä¸ä½ ≈53 Gbpsã€6.3 GiB/s),更多并å‘å而回è½ï¼›
- æœåŠ¡ç«¯åˆ†é…除 1MB 档外全部 ≈0(GC 零次):接收路径「轮末è£å†³ + 奿Ÿ„回挂ã€å·²è¾¾è¿‘零分é…。
### 3.2 UDP
**尺寸曲线(4 客户端)**
| åŒ…å¤§å° | 带宽 | 包率 | æœåŠ¡ç«¯åˆ†é… B/msg |
|---:|---:|---:|---:|
| 32B | 0.07 Gbps | 281 kpps | 216 |
| 256B | 0.60 Gbps | 294 kpps | 216 |
| 1KB | 2.24 Gbps | 273 kpps | 216 |
| 4KB | 8.69 Gbps | 265 kpps | 216 |
| 16KB | 30.8 Gbps | 235 kpps | 216 |
| 64KB(IP 分片) | 80.6 Gbps | 154 kpps | 216 |
**并呿‰«æï¼ˆ1KB 与 64KB)**
| å¹¶å‘ | 1KB 带宽 / 包率 | 64KB 带宽 |
|---:|---:|---:|
| 1 | 0.77 Gbps / 94 kpps | 25.4 Gbps |
| 2 | 1.37 Gbps / 168 kpps | 48.7 Gbps |
| 4 | 2.24 Gbps / 273 kpps | 80.6 Gbps |
| 8 | 3.09 Gbps / 377 kpps | 98.8 Gbps |
| 16 | 3.52 Gbps / 430 kpps | **138.7 Gbps** |
| 32 | 4.12 Gbps / **503 kpps** | **138.9 Gbps** |
| 64 | 4.03 Gbps / 492 kpps | — |
**客户端连接化**(v3.1 åº“å†…ç½®ï¼šçº¯å®¢æˆ·ç«¯æ¨¡å¼æ‰“å¼€å³ Connect 远端)
| æŒ‡æ ‡ | 旧版(SendTo) | v3.1(自动连接) |
|---|---:|---:|
| æœåŠ¡ç«¯åžå(1KB 4C / 64KB 4C) | 2.34 / 81.2 Gbps | 2.36 / 82.5 Gbps(ä¸å˜ï¼‰ |
| å®¢æˆ·ç«¯åˆ†é… | 41.5 B/msg | **0.4 B/msg** |
- 未连接 UDP å‘é€èµ° `Socket.SendTo`,æ¯åŒ…åºåˆ—化 `SocketAddress`(实测 43 B/包);连接化åŽèµ° `Send`(零分é…)——收益在客户端,æœåŠ¡ç«¯åžåä¸å˜ï¼›
- ä¼˜åŒ–åŽ UDP æœåŠ¡ç«¯åˆ†é…æ’定 **216 B/msg**(详è§ç¬¬ä¸ƒèŠ‚ï¼‰ï¼šåŒ…çŽ‡ä»Ž 4C 273 kpps æå‡è‡³ 32C çš„ 503 kpps,1KB 高并å‘åžåè¾ƒä¼˜åŒ–å‰ +20%。
### 3.3 粘包多帧(24B 逻辑帧)
| åè®® | 对é½åŽå¤§åŒ… | 帧/包 | 包率 | 帧率 | 带宽 |
|---|---:|---:|---:|---:|---:|
| TCP | 1,008 B | 42 | 1.44 Mpps | 59.0 M帧/s | 11.63 Gbps |
| TCP | 65,520 B | 2,730 | 76.4 kpps | **208 M帧/s** | 40.0 Gbps |
| UDP | 1,008 B | 42 | 270 kpps | 11.3 M帧/s | 2.18 Gbps |
| UDP | 65,496 B | 2,729 | 155 kpps | **417 M帧/s** | 81.2 Gbps |
- 帧率éšå¤§åŒ…尺寸大幅æå‡ï¼ˆå›ºå®šæˆæœ¬è¢« 2,700+ 帧摊薄);业务侧批é‡åŒ–是性价比最高的åžå手段。
### 3.4 å›žæ˜¾æµæ°´çº¿ï¼ˆå®¢æˆ·ç«¯æŽ¥æ”¶æ–¹å¼å¯¹ç…§ï¼‰
| åŒ…å¤§å° | æŽ¥æ”¶æ–¹å¼ | 回显åžå | 带宽 | æœåŠ¡ç«¯åˆ†é… | å®¢æˆ·ç«¯åˆ†é… |
|---:|---|---:|---:|---:|---:|
| 1KB | åŒæ¥ / å¼‚æ¥ / 事件 | 1.16 / 1.32 / **1.28*** M msg/s | 9.5 / 10.8 / 10.5 Gbps | 0.09-0.20 | 6.6 / 27.2 / **0.02** |
| 64KB | åŒæ¥ / å¼‚æ¥ / 事件 | 21.6 / **26.7*** / 21.6 k msg/s | 11.3 / **14.0*** / 11.3 Gbps | 12.4-13.3 | 158 / 559 / **1.0** |
> * 1KB 事件与 64KB 异æ¥å•è·‘å低(896 MiB/sã€1292 MiB/sï¼‰ï¼Œå– 3 æ¬¡å¤æµ‹ä¸ä½ï¼ˆ1250 MiB/sã€1667 MiB/s)。
- 1KB æ¡£ä¸‰ç§æŽ¥æ”¶æ–¹å¼åŒæ¡£ï¼ˆ1.16-1.32 M msg/s);**客户端分é…差异显著**ï¼šå¼‚æ¥æ‹‰å–çŠ¶æ€æœºæœ€é«˜ï¼ˆ1KB 27 B/msgã€64KB 559 B/msg),事件接收近零(1KB 0.02ã€64KB 1.0 B/msg,è§ç¬¬äº”节)。
## å››ã€å¾€è¿”延迟(客户端观察 RTT)
> RTT åªèƒ½ç”±å‘起方(客户端)观察;下列延迟å«å®¢æˆ·ç«¯è·¯å¾„æˆæœ¬ï¼ŒæœåŠ¡ç«¯å¤„ç†æˆæœ¬è§ã€ŒæœåŠ¡ç«¯åˆ†é…ã€åˆ—。
### 4.1 TCP
| åŒ…å¤§å° | å¹¶å‘ | æŽ¥æ”¶æ–¹å¼ | P50 | P95 | P99 | max | æœåŠ¡ç«¯åˆ†é… B/msg |
|---:|---:|---|---:|---:|---:|---:|---:|
| 32B | 4 | åŒæ¥ | 49.8 | 69.5 | 80.8 | 4,433 | 1.1 |
| 1KB | 4 | åŒæ¥ | 48.2 | 65.2 | 74.3 | 4,853 | 1.1 |
| 64KB | 4 | åŒæ¥ | 100.0 | 110.8 | 135.3 | 3,250 | 2.1 |
| 1MB | 4 | åŒæ¥ | 1,408.6 | 1,843.7 | 2,201.6 | 4,784 | 208 |
| 1KB | 64 | åŒæ¥ | 275.1 | 401.5 | 455.7 | 16,361 | 2.5 |
| 64KB | 64 | åŒæ¥ | 1,499.6 | 2,682.4 | 3,358.2 | 6,877 | 12.6 |
| 1KB | 4 | å¼‚æ¥ | 56.6 | 75.8 | 87.9 | 1,570 | 1.3 |
| 1KB | 64 | å¼‚æ¥ | 276.9 | 396.3 | 467.3 | 47,725 | 2.5 |
| 64KB | 4 | å¼‚æ¥ | 96.1 | 116.3 | 129.1 | 1,645 | 2.1 |
| 64KB | 64 | å¼‚æ¥ | 1,336.1 | 2,670.0 | 3,308.5 | 11,087 | 11.7 |
| 1KB | 4 | 事件 | 52.8 | 69.6 | 81.1 | 2,528 | 1.1 |
| 1KB | 64 | 事件 | 266.6 | 390.0 | 430.5 | 22,824 | 2.4 |
| 64KB | 4 | 事件 | 86.7 | 105.0 | 117.6 | 1,135 | 1.9 |
| 64KB | 64 | 事件 | 1,414.2 | 2,671.3 | 3,270.1 | 8,766 | 12.3 |
- 包大å°ï¼š32B/1KB åŒæ¡£ï¼ˆP50 ≈47-49µsï¼Œé“¾è·¯å›ºå®šæˆæœ¬ï¼‰ï¼›64KB→86-103µsã€1MB→1.5ms(带宽支é…);
- å¹¶å‘:4→64 使å°åŒ… P50 å‡è‡³ 266-291µsï¼›64KB 大包 64 å¹¶å‘å‡è‡³ 1.38-1.63msï¼›
- 接收方å¼ï¼šä½Žå¹¶å‘å°åŒ…åŒæ¥ä¸Žäº‹ä»¶æŽ¥è¿‘(46.7 vs 50.3µs);事件接收在 64KB 与尾延迟上最优(64C P99 368µs vs åŒæ¥ 425µsã€å¼‚æ¥ 463µs)。
### 4.2 UDP
| åŒ…å¤§å° | å¹¶å‘ | æŽ¥æ”¶æ–¹å¼ | P50 | P95 | P99 | max | æœåŠ¡ç«¯åˆ†é… B/msg |
|---:|---:|---|---:|---:|---:|---:|---:|
| 32B | 1 | åŒæ¥ | 32.6 | 49.2 | 87.0 | 5,824 | 258 |
| 1KB | 1 | åŒæ¥ | 40.7 | 49.6 | 84.9 | 5,882 | 258 |
| 64KB | 1 | åŒæ¥ | 59.8 | 75.6 | 129.8 | 6,104 | 260 |
| 1KB | 1 | 事件 | 48.7 | 59.7 | 94.1 | 2,236 | 260 |
- UDP 啿¬¡å¾€è¿” P50 ≈40-61µs,快于 TCP(çœåŽ»è¿žæŽ¥/ç¡®è®¤çŠ¶æ€æœºå¼€é”€ï¼‰ï¼›64KB å•包 P50 61µs(IP 分片);max 为å¶å‘调度毛刺,低频å¯å¿½ç•¥ï¼›æœåŠ¡ç«¯åˆ†é… 258-260 B/msg(接收+å›žæ˜¾ï¼Œè¾ƒä¼˜åŒ–å‰ 373 é™ 30%)。
**延迟构æˆ**ï¼šä½Žå¹¶å‘æœ€å°å¾€è¿” ≈23-27µs(TCPï¼‰ï¼›è¯¥æ•°å€¼ä¸æ˜¯ loopback ç‰©ç†æžé™ï¼ˆå†…æ ¸å•æ¬¡ä¼ 输 1-1.2µs),大头是**两次用户æ€ç³»ç»Ÿè°ƒç”¨ï¼ˆSend + 阻塞 Receive 唤醒)+ 线程调度 + æœåŠ¡ç«¯å›žæ˜¾é“¾è·¯**。分ä½ä¸Žç»„分的定é‡å½’å› è§ 4.3。
### 4.3 延迟尾部分ä½å½’å› ï¼ˆv3.7)
> 追问:P99 是 GC æš‚åœé€ æˆï¼Œè¿˜æ˜¯ CPU 调度排队?用三个相互独立的实验交å‰éªŒè¯ï¼ˆTCP 1KB 往返,10 s 窗å£ï¼ŒæœåŠ¡ç«¯ GC æš‚åœå–自æœåŠ¡ç«¯ STEADY å£å¾„)。
**实验 Aï¼šå¹¶å‘æ‰«æâ€”—RTT ≈ N/λ(Little 定律)**
```
NetLoadTest.exe --mode roundtrip --remote 127.0.0.1:<port> --clients <1..64> --size 1024 --seconds 10 --warmup 2
```
| å¹¶å‘ N | åžå λ (pps) | P50 | P95 | P99 | N/λ (µs) | P50 − N/λ |
|---:|---:|---:|---:|---:|---:|---:|
| 1 | 25,942 | 34.8 | 51.2 | 66.3 | 38.5 | −3.7 |
| 2 | 39,205 | 49.9 | 65.1 | 81.5 | 51.0 | −1.1 |
| 4 | 74,506 | 52.2 | 69.2 | 80.8 | 53.7 | −1.5 |
| 8 | 121,912 | 64.7 | 88.5 | 104.3 | 65.6 | −0.9 |
| 16 | 167,527 | 94.9 | 126.0 | 150.1 | 95.5 | −0.6 |
| 32 | 198,570 | 148.4 | 238.1 | 285.7 | 161.2 | −12.8 |
| 64 | 212,000 | 290.3 | 411.8 | 536.3 | 301.9 | −11.6 |
P50 与ç†è®ºå€¼ N/λ 在 1→64 å¹¶å‘全程å»åˆï¼ˆç»å¯¹è¯¯å·® ≤13 µs)⇒ **延迟的ç»å¤§éƒ¨åˆ†æ˜¯æŽ’队**(请求在接收环/线程队列ä¸ç‰å¾…ï¼‰ï¼Œè€Œä¸æ˜¯æ¯åŒ…固定开销;唯一的"æ¯åŒ…开销"是 N=1 æ—¶çš„ 34.8 µs。
**实验 B:裸 Socket 地æ¿å¯¹ç…§**(å•客户端 1KB ä¹’ä¹“ï¼ŒåŒæ–¹é˜»å¡ž Send/Receive 且 NoDelay,30 万次 × 3 轮)
| 实现 | P50 | P95 | P99 | max | mean |
|---|---:|---:|---:|---:|---:|
| 裸 Socket | 32.3-32.5 | 45.8-46.6 | 75.7-80.5 | 7,888-8,436 | 35.4-35.7 |
| NewLife 库 | 34.8 | 51.2 | 66.3 | 2,708 | — |
- åº“åœ¨æ— è½½ä¸‹ä»…æ¯”è£¸ Socket 多 **2.4 µs(+7%)**â€”â€”å³ handler åˆ†å‘ + 会è¯çŠ¶æ€æœº + 奿Ÿ„所有æƒè½¬ç§»çš„全部代价;
- **库的 P99 å而更好**(66.3 vs 75.7-80.5):裸阻塞 `Receive` éœ€æŠŠçº¿ç¨‹ä»Žå†…æ ¸ç‰å¾…é˜Ÿåˆ—é‡æ–°è°ƒåº¦ï¼Œè€Œåº“用**é¢„æŠ•é€’å¼‚æ¥æŽ¥æ”¶ + IO 完æˆ**,唤醒路径更çŸï¼›
- 裸 Socket å•è·‘ max 也达 7.9-8.4 ms ⇒ **毫秒级毛刺是本机 OS 调度固有**ï¼Œä¸Žåº“æ— å…³ã€‚
**实验 C:GC æš‚åœé‡ vs 人为调度压力(判别实验)**
| 场景 | P50 | P99 | 客户端 GC æš‚åœæ€»é‡ | æœåŠ¡ç«¯ GC æš‚åœ |
|---|---:|---:|---:|---:|
| 1KB 4C åŒæ¥ | 50.9 | 85.1 | 4.39 ms / 10 s(0.04%) | 0.0 ms |
| 1KB 4C åŒæ¥ + 6 æ ¸äººä¸ºå¿™ç‰ | 68.6 | 145.1 | 5.17 msï¼ˆå‡ ä¹Žä¸å˜ï¼‰ | 0.0 ms |
| 1KB 64C åŒæ¥ | 271.5 | 396.2 | 47.30 ms(0.47%) | 0.0 ms |
| 1KB 64C 事件 | 273.5 | 478.8 | **4.84 ms**ï¼ˆåŒæ¥çš„ 1/10) | 0.0 ms |
| 1KB 64C å¼‚æ¥æ‹‰å– | 315.1 | 569.0 | 104.45 ms | 0.0 ms |
- **æœåŠ¡ç«¯ GC æš‚åœæ’为 0.0 ms**:与æœåŠ¡ç«¯è¿œæœªé¥±å’Œï¼ˆè§ 5.2)一致,æœåŠ¡ç«¯ä¸è´¡çŒ®å°¾å»¶è¿Ÿï¼›
- åŠ 6 æ ¸ CPU 竞争而 **GC æš‚åœå‡ 乎ä¸å˜**时,P50 +35%ã€P99 +70% ⇒ 尾部由 **CPU 调度排队**主导;
- 事件接收的 GC æš‚åœåªæœ‰åŒæ¥çš„ 1/10(4.84 vs 47.30 ms),P99 å´**更宽**(478.8 vs 396.2)⇒ GC æš‚åœé‡ä¸Žå°¾å»¶è¿Ÿ**ä¸ç›¸å…³**。
**结论**:往返延迟 = 排队(N/λ)+ 34.8 µs æ— è½½æœåŠ¡æ—¶é—´ + OS è°ƒåº¦æ¯›åˆºã€‚åº“è‡ªèº«åœ¨æ— è½½ä¸‹åªå‰© **2.4 µs** 空间,且其尾延迟已优于裸阻塞 Socket;进一æ¥åŽ‹ä½Ž P99 åªèƒ½é å‡å°‘æŽ’é˜Ÿæ·±åº¦ï¼ˆå®¢æˆ·ç«¯é™æµã€å¤šè¿›ç¨‹åˆ†æ•£ï¼‰æˆ–改善平å°è°ƒåº¦ï¼Œå‡ä¸åœ¨åº“内。**ä¸åš**进一æ¥çš„延迟优化——收益 <2.4 µsï¼Œä»£ä»·æ˜¯å¤æ‚度。
## 五ã€å†…å˜åˆ†é…(æœåŠ¡ç«¯å£å¾„)
| 场景 | æœåŠ¡ç«¯ B/msg | GC 0/1/2 | 说明 |
|---|---:|---|---|
| TCP å•帧 32B~64KB | 0.08-1.7 | 0/0/0 | 接收路径近零(轮末è£å†³ + 奿Ÿ„回挂å¤ç”¨ï¼‰ |
| TCP å•帧 1MB | 264ï¼ˆéžæ¯åŒ…æˆæœ¬ï¼Œè§ 5.1) | 1/1/1 | ≈1 MB/s èƒŒæ™¯åˆ†é…æŠ˜ç®—ï¼›**éžç¼“å†²æ± ä¸¢æ± **ï¼ˆæ± é›¶å€Ÿè¿˜ï¼‰ |
| TCP 回显(32B~64KB) | 0.09-13.3 | 0/0/0 | 接收 + 回显å‘é€ |
| UDP å•帧(全尺寸) | **216** | æ¯ ~6.3 万包一次 Gen0 | 32 B 强制预置端点 + 184 B è¿è¡Œæ—¶å›ºæœ‰ï¼ˆè§ 5.1) |
| UDP 往返(接收 + 回显) | 258-260 | — | è¾ƒä¼˜åŒ–å‰ 373 é™ 30% |
| TCP å®¢æˆ·ç«¯åŒæ¥æ‹‰å–往返 | 187-208 | — | æ¯åŒ… `OwnerPacket + ArrayOwner` 奿Ÿ„对 |
| TCP å®¢æˆ·ç«¯å¼‚æ¥æ‹‰å–往返 | 628-661 | — | æ¯ await çš„ async çŠ¶æ€æœº + Task |
| TCP 客户端事件往返 | 43-58 | — | 接收环å¤ç”¨å¥æŸ„,近零 |
| TCP å®¢æˆ·ç«¯æµæ°´çº¿ï¼ˆåŒæ¥/异æ¥/事件) | 6.6 / 27.2 / **0.02** | — | 1KB;事件模å¼é›¶åˆ†é… |
| UDP 客户端å‘é€ï¼ˆæ—§ç‰ˆ SendTo / v3.1) | 41.5 / **0.4** | — | v3.1 自动连接åŽèµ° `Send` |
**优化进展(v3.1)**
1. ✅ **UDP æœåŠ¡ç«¯æŽ¥æ”¶è·¯å¾„**(已è½åœ°ï¼‰ï¼šä¼šè¯æŸ¥æ‰¾ç”±å—符串键改为**端点键缓å˜**——330→216 B/msg(-35%),Gen0 频率 ~-40%,UDP 高并å‘åžå +7~25%(è§ç¬¬ä¸ƒèŠ‚ï¼‰ï¼›
2. ✅ **UDP 客户端 Connect 化**(已è½åœ°ï¼‰ï¼šåº“内置纯客户端模å¼è‡ªåŠ¨è¿žæŽ¥ï¼Œ41.5→0.4 B/msgï¼›
3. ✅ TCP 1MB æ¡£ 264 B/msg å·²å½’å› ï¼ˆè§ 5.1):**éžæ¯åŒ…æˆæœ¬ã€ä¹Ÿéžç¼“å†²æ± ä¸¢æ± **——接收环稳æ€**零借还**(计数器实测),实为约 1 MB/s çš„èƒŒæ™¯åˆ†é…æŠ˜ç®—ã€‚
### 5.1 分é…与æ¯åŒ… CPU å½’å› ï¼ˆv3.2 隔离实验)
ä¸ºæŠŠã€Œå¾…ä¸“é¡¹æ ¸å®žã€å˜æˆç»“论,用**一次性裸 Socket 探针**(ä¸å« NewLife 代ç ã€ä¸æäº¤ï¼‰+ 临时计数器å¤çްåŒä¸€è·¯å¾„:
| 实验 | é…ç½® | 结果 |
|---|---|---|
| UDP 接收环(裸 Socket + SAEA) | `ReceiveMessageFromAsync`,æ¯è½®é‡æŠ• `new IPEndPoint(Any, 0)` | **216.0 B/msg**ã€11.5 µs/包ã€578 kpps |
| åŒä¸Šï¼Œä»…æ¢ `ReceiveFromAsync` | å…¶ä½™ä¸å˜ | **104.0 B/msg**ã€10.2 µs/包ã€**661 kpps(+14%)** |
| åŒä¸Šï¼Œå¤ç”¨åŒä¸€ç«¯ç‚¹å®žä¾‹ | ä»…åšæµ‹é‡ï¼Œåº“内ä¸å¯ç”¨ | 184.3 B/msg(差 **31.99 ≈ 32 B**) |
| åŒä¸Šï¼Œ`RemoteEndPoint` ä¼ null | — | 抛 `ArgumentException`:è¿è¡Œæ—¶**强制**预置éžç©ºç«¯ç‚¹ |
| TCP 接收环(裸 Socket,1MB 缓冲) | å¤ç”¨æ§½ç¼“冲 / æ¯è½® ArrayPool æ¢æ–° | ä¸¤è€…å‡ **≈0 B/msg** |
| 纯 ArrayPool 1MB 压力 | 256 缓冲常驻 + **19.6 亿次**借还 | **0 å—节**ï¼ˆæ± ä¸ä¸¢ï¼‰ |
| 库接收环临时计数器 | TCP 1MB å•å‘ç¨³æ€ | `OwnerPacket` æž„é€ **0 次**ã€"æ¢æ–°"分支 **0 次** |
| 裸 Socket TCP 客户端 CPU | 16 线程 × 1KB | 1.51 Mppsã€**7.49 µs/包** |
| 库 TcpSession 客户端 CPU | 16 客户端 × 1KB | 1.63 Mppsã€**7.47 µs/包** |
结论:
1. **UDP 216 B/msg = 32 B 强制预置端点 + 184 B è¿è¡Œæ—¶å›ºæœ‰**ï¼Œåº“å†…å·²æ— å‰©ä½™å¯åŽ»ã€‚184 B æ¥è‡ªè¿è¡Œæ—¶å®Œæˆå›žè°ƒæž„é€ çš„æŽ¥æ”¶ç»“æžœç«¯ç‚¹ï¼Œåº”ç”¨å±‚æ— æ³•è§„é¿ï¼›32 B 预置为è¿è¡Œæ—¶å¼ºåˆ¶ï¼ˆä¼ null 直接抛错)。å¤ç”¨åŒä¸€å®žä¾‹è™½å¯é™ 32 B,但端点对象éšä¼šè¯é•¿æœŸç•™å˜ï¼Œå¤ç”¨ä¼šæŠŠå…¶å®ƒä¼šè¯çš„端点改掉——**ä¸å®‰å…¨ï¼Œä¸é‡‡ç”¨**。
2. **TCP 1MB「264 B/msgã€æ—¢éžæ¯åŒ…æˆæœ¬ã€ä¹Ÿéžã€Œä¸¢æ± ã€**:接收环稳æ€**零次** `OwnerPacket` æž„é€ ä¸Ž"æ¢æ–°"(临时计数器实测),纯 ArrayPool 在 19.6 亿次借还下 0 分é…ã€‚çœŸå®žæ¥æºæ˜¯çº¦ **0.03-0.05% å—节é‡**的微é‡èƒŒæ™¯åˆ†é…(1MB æ¡£ ≈1 MB/s,å 该档åžå 0.02%),ä¸åœ¨ç¼“冲/æ± è·¯å¾„ä¸Šï¼›`B/msg` åªæ˜¯æŠŠå®ƒé™¤ä»¥ä½ŽåŒ…率放大æˆçš„**度é‡å‡è±¡**。
3. **æ¯åŒ… CPU 由平å°å†³å®š**:æœåŠ¡ç«¯å¼€é”€**远å°äºŽ**å†…æ ¸ä¾§â€”â€”åŠ åŽ‹å®žæµ‹ TCP 1KB 在 1.48 Mpps æ—¶ä»… **1.31 æ ¸**ã€UDP 1KB 在 ~600 kpps 时约 **2.0 æ ¸**ï¼ˆè§ 5.2);而å‘é€ç«¯ 7.5 µs/åŒ…çš„å†…æ ¸æˆæœ¬ç”±è£¸ Socket 与库客户端**åŒç‰æ‰¿æ‹…**(7.49 vs 7.47 µs/包)。åžå天花æ¿å› æ¤ç”± **Windows loopback å†…æ ¸åè®®æ ˆ**决定,éžåº“内瓶颈。
4. **NoDelay é»˜è®¤å€¼ç» A/B éªŒè¯æ£ç¡®**:åŒä¸€åº“ã€åŒæž„接收回环,1KB × 8C å•å‘åžå `NoDelay=false`(Nagle åˆå¹¶å°åŒ…)**11.08 Gbps** vs `NoDelay=true` **6.90 Gbps**。客户端 `TcpSession.NoDelay` 默认 false 有利于åžå,**䏿˜¯ç¼ºé™·**(æœåŠ¡å™¨æŽ¥å—连接默认 `NoDelay=true` 属延迟å–å‘,两者场景ä¸åŒï¼‰ã€‚
5. **UDP 接收 API 已回退到包信æ¯è·¯å¾„**(è§ç¬¬ä¸ƒèŠ‚ v3.8):v3.3 曾改 `ReceiveFromAsync`,çœä¸‹æ¯åŒ… **112 B** 分é…与约 **1.3 µs** CPU(1KB 高并å‘包率 +18.8%),代价是æ¯åŒ…本地地å€é€€åŒ–为绑定地å€ï¼Œå¤šå®¿æœåŠ¡å™¨æ— æ³•åˆ¤æ–æ•°æ®æŠ¥æ¥è‡ªå“ªå¼ 网å¡â€”â€”è¯¥èƒ½åŠ›æ˜¯æž¶æž„è®¾è®¡è¦æ±‚,故æ¢å¤ `ReceiveMessageFromAsync` 为默认。1KB æ¡£å¤æµ‹ï¼ˆ2026-10-12,裸 Socket åŒæž„接收环,20 æ§½ × 4 å‘é€çº¿ç¨‹ × 3 轮):**104.0 B/msgã€386 kpps** → **216.0 B/msgã€327 kpps(-15%)**,与 v3.3 报告的 -14~18.8% ä¸€è‡´ã€‚ä¸æƒ³ä»˜è¯¥ä»£ä»·çš„高åžå场景å¯è®¾ `UdpServer.PacketInformation=false`。
### 5.2 åŠ åŽ‹å®žéªŒï¼šæœåŠ¡ç«¯ä¸æ˜¯ç“¶é¢ˆï¼ˆv3.5)
矩阵用**å•个客户端进程**产生负载,而å•è¿›ç¨‹å®¢æˆ·ç«¯è‡ªèº«çš„åŒæ¥å‘é€ä¼šçƒ§æŽ‰åä½™æ ¸ï¼Œå®¹æ˜“è¢«è¯¯è¯»æˆ"æœåŠ¡ç«¯æŽ¥æ”¶çŽ¯é¥±å’Œ"。改为**多客户端进程**åŠ åŽ‹ï¼ˆåŒå场景ã€åŒçŽ¯å¢ƒï¼›`run-matrix.ps1 -ClientProcs N` 已内置该能力):
| åè®® / åŒ…å¤§å° | 客户端进程 × 连接 | æœåŠ¡ç«¯å¸¦å®½ | æœåŠ¡ç«¯åŒ…çŽ‡ | **æœåŠ¡ç«¯ CPU** |
|---|---|---:|---:|---:|
| TCP 1KB | 1 × 16 | 8.01 Gbps | 977 kpps | 0.75 æ ¸ |
| TCP 1KB | 2 × 16 | 9.56 | 1.17 Mpps | 1.05 æ ¸ |
| TCP 1KB | 4 × 16 | **12.09** | **1.48 Mpps** | **1.31 æ ¸** |
| TCP 1KB | 8 × 8 | 10.41 | 1.27 Mpps | 1.16 æ ¸ |
| UDP 1KB | 1 × 32 | 4.92 | 600 kpps | 2.04 æ ¸ |
| UDP 1KB | 2 × 32 | 4.46 | 544 kpps | 2.35 æ ¸ |
| UDP 1KB | 4 × 32 | 4.47 | 545 kpps | 2.11 æ ¸ |
| UDP 1KB | 8 × 16 | 4.52 | 552 kpps | 2.23 æ ¸ |
结论:
1. **æœåŠ¡ç«¯è¿œæœªé¥±å’Œ**:TCP 1KB 在 1.48 Mpps 时仅用 **1.31 æ ¸**(20 æ ¸æœºçš„ 6.5%);UDP 1KB 在 ~550-600 kpps 时约 **2.0-2.35 æ ¸**。
2. **åŠ å¤§å®¢æˆ·ç«¯è¿›ç¨‹æ•°ä¸å†æå‡**:TCP 从 1→4 进程æå‡ 8.01→12.09 Gbps(+51%),8 进程回è½ï¼›UDP 在 1 进程时å³è¾¾ 600 kppsï¼ŒåŠ è¿›ç¨‹å而略é™ã€‚ä¸Šé™æ¥è‡ª **Windows å›žçŽ¯å†…æ ¸æ ˆ + å®¢æˆ·ç«¯åŒæ¥å‘逿ˆæœ¬**(å‘é€ç«¯ 7.5 µs/包,裸 Socket ä¸Žåº“å®¢æˆ·ç«¯ä¸€è‡´ï¼Œè§ 5.1)。
3. å› æ¤ **"å•进程接收环饱和"çš„è¯´æ³•ä¸æˆç«‹**(§3.1 原表述已修æ£ï¼‰ï¼›æœ¬æœºå¯æµ‹çš„ TCP å°åŒ…ä¸Šé™ â‰ˆ1.5 Mpps / ≈12-14 Gbps 属**å¹³å°ä¸Šé™**,æœåŠ¡ç«¯è¿˜å‰©çº¦ 18 æ ¸ä½™é‡ã€‚
4. åŒç†ä¿®æ£æ—©æœŸ**å•点 CPU é‡‡æ ·**给出的"UDP æœåŠ¡ç«¯ 13-17 µs/包"ï¼šè¯¥é‡‡æ ·åœ¨æœºå™¨å¸¦ 3-4 æ ¸èƒŒæ™¯è´Ÿè½½æœŸé—´å–å¾—ï¼Œä¸Žæœ¬æ¬¡åŠ åŽ‹å®žæµ‹ï¼ˆ~2 æ ¸ @600 kpps ≈ 3.4 µs/包)相差数å€ï¼Œ**以åŽè€…为准**。æ¯åŒ… CPU çš„å¯é 说法是:**æœåŠ¡ç«¯å¼€é”€è¿œå°äºŽå†…æ ¸ä¾§**。
## å…ã€å·²çŸ¥é™åˆ¶
- **UDP æ— æµæŽ§**:å‘é€ç«¯è¶…过æœåŠ¡ç«¯æ¶ˆè´¹èƒ½åŠ›å¿…ç„¶ä¸¢åŒ…ï¼ˆçŒåŒ…过载场景),业务需自行é™é€Ÿï¼›è°ƒå¤§ `UdpServer.MaxAsync` å¯å¢žå¤§æŽ¥æ”¶çŽ¯å¹¶è¡Œåº¦ï¼ˆå®žæµ‹å¯¹åŒ…çŽ‡ä¸Šé™æ— æå‡ï¼Œ1KB æžé™çº¦ 500 kpps);
- **UDP æœåŠ¡ç«¯ä»æœ‰æ’定 216 B/msg**(原 330):为 .NET SAEA 完æˆå›žè°ƒçš„端点对象开销——è¿è¡Œæ—¶å°±åœ°æ›´æ–° `RemoteEndPoint` 且对象éšä¼šè¯ä¿ç•™ï¼Œæ¯è½®æŽ¥æ”¶å¿…须新建 `IPEndPoint`ï¼Œåº”ç”¨å±‚æ— æ³•å®‰å…¨è§„é¿ï¼ˆå¤ç”¨äºŽé‡ç½®ä¼šæ”¹åˆ°å…¶å®ƒä¼šè¯çš„端点)。**éš”ç¦»å®žéªŒè¯æ®**ï¼ˆè§ 5.1):裸 Socket åŒæž„接收环 216.2 B/msgï¼Œä¸Žåº“å†…ä¸€è‡´ï¼›å…¶ä¸ 32 B æ¥è‡ªè¿è¡Œæ—¶**å¼ºåˆ¶è¦æ±‚**预置的éžç©ºç«¯ç‚¹ï¼ˆä¼ null 直接抛 `ArgumentException`),184 B 为è¿è¡Œæ—¶å›ºæœ‰ï¼›å¤ç”¨å®žä¾‹å¯é™è‡³ 184.3 B/msg ä½†ä¼šç ´å端点归属,ä¸é‡‡ç”¨ã€‚默认(包信æ¯å¼€å¯ï¼‰å³è¯¥å€¼ï¼Œè®¾ `UdpServer.PacketInformation=false` å¯å›žåˆ° **104 B/msg**(v3.8 夿µ‹ï¼‰ï¼›
- **TCP 1MB æ¡£ 264 B/msg å·²å½’å› **:**éžæ¯åŒ…æˆæœ¬ï¼Œä¹Ÿéžç¼“å†²æ± ä¸¢æ± **——接收环稳æ€é›¶ `OwnerPacket` æž„é€ /é›¶"æ¢æ–°"(计数器实测),纯 ArrayPool 19.6 亿次借还 0 分é…;实为约 1 MB/s(å 该档åžå 0.02%)的**èƒŒæ™¯åˆ†é…æŠ˜ç®—**ï¼Œå±žæŠŠèƒŒæ™¯åˆ†é…æ‘Šåˆ°åŒ…数上的度é‡å‡è±¡ï¼ˆè§ 5.1);
- **UDP æ¯åŒ…本地地å€é»˜è®¤å–包信æ¯**:接收环默认走 `ReceiveMessageFromAsync`(v3.8 æ¢å¤ï¼‰ï¼Œ`e.Local` ä¸ºæ•°æ®æŠ¥**实际到包的本机地å€**,多宿æœåŠ¡å™¨ç»‘ `Any` æ—¶å¯æ®æ¤åˆ¤æ–æ•°æ®æŠ¥æ¥è‡ªå“ªä¸€å¼ 本地网å¡ï¼ˆ.NET 自动打开 IP_PKTINFOï¼Œæ— éœ€æ‰‹å·¥è®¾ç½® socket 选项);设 `UdpServer.PacketInformation=false` 则退回 `ReceiveFromAsync`,`e.Local` å˜ä¸ºæœåŠ¡å™¨ç»‘å®šåœ°å€ï¼ˆç»‘ `Any` å³ `0.0.0.0`,契约由 `UdpLocalAddress_FromServerBinding_WhenPacketInformationOff` 用例钉ä½ï¼‰ï¼›Mono/Android 䏿”¯æŒè¯¥ APIï¼Œæ’æŒ‰å…³é—处ç†ï¼›
- **æ¯åŒ… CPU 为平å°å›ºæœ‰**ï¼šåŠ åŽ‹å®žæµ‹æœåŠ¡ç«¯å¼€é”€è¿œå°äºŽå†…æ ¸ä¾§ï¼ˆTCP 1KB 1.48 Mpps ä»… ~1.31 æ ¸ã€UDP 1KB ~600 kpps 约 ~2.0 æ ¸ï¼Œè§ 5.2),åžå天花æ¿ç”±åŽ‹æµ‹å®¢æˆ·ç«¯åŒæ¥å‘é€ + Windows loopback å†…æ ¸åè®®æ ˆå†³å®šï¼Œéžåº“内瓶颈;
- **TCP 大包åžåå—å†…æ ¸æŽ¥æ”¶çª—å£é™åˆ¶**:å‘é€ä¾§å·²æŒ‰æŠ¥æ–‡å¤§å°è‡ªåŠ¨æ”¾å¤§å‘é€ç¼“冲,接收侧æ¤å‰å§‹ç»ˆç”¨ç³»ç»Ÿé»˜è®¤ï¼ˆWindows 约 64KB);带宽延迟积较大(高负载 / é«˜å»¶è¿Ÿé“¾è·¯ï¼‰æ—¶çª—å£æˆä¸ºç“¶é¢ˆï¼Œå¯ç”¨ `SocketSetting.ReceiveBufferSize` æ˜¾å¼æ”¾å¤§ï¼ˆé»˜è®¤ 0 䏿”¹ï¼‰ï¼Œä»£ä»·æ˜¯æ¯è¿žæŽ¥çš„å†…æ ¸å†…å˜ï¼ˆ4MB × 1 万连接 = 40GB);
- **`UdpSession` ä¸å®žçް `INetSession`**:`NetServer.Received` çš„ sender 在 UDP 下为 `UdpSession`(仅 `ISocketSession`),`s is INetSession` 分支ä¸å‘½ä¸ï¼Œå†™é€šç”¨ä»£ç 时注æ„ï¼›
- **延迟尾部ä¸å¯ç”±åº“内消除**ï¼šæ— è½½ä¸‹åº“ä»…æ¯”è£¸ Socket 多 2.4 µs,其余延迟为排队(N/λ)与 OS 调度毛刺(毫秒级 max 在裸 Socket åŒæ ·å‡ºçŽ°ï¼‰ï¼Œè§ 4.3。
## 七ã€ä¼˜åŒ–è®°å½•ä¸Žå¤æµ‹ï¼ˆv3.1 → v3.2)
| 优化项 | 实现 | æ•ˆæžœï¼ˆå¤æµ‹ï¼‰ |
|---|---|---|
| UDP ä¼šè¯æŸ¥æ‰¾åŽ»å—符串键 | `SessionCollection` 新增端点键缓å˜ï¼ˆ`ConcurrentDictionary<IPEndPoint>`;未命ä¸å›žé€€å—符串键,创建/移除/清ç†å„è·¯å¾„åŒæ¥ç»´æŠ¤å¹¶åšå€¼æ ¡éªŒï¼‰ | æœåŠ¡ç«¯åˆ†é… **330→216 B/msg(-35%)**,Gen0 频率 ~-40%ï¼›UDP 高并å‘åžå +7~25%(1KB 16C 404→494 kppsã€64C 499 kppsï¼›64KB 8C 94→110-122 Gbpsã€32C 126→134.5 Gbps) |
| UDP 客户端自动连接 | 纯客户端模å¼ï¼ˆæœ¬åœ°ç«¯å£è‡ªåŠ¨åˆ†é… + è¿œç«¯ä¸ºå•æ’地å€ï¼‰æ‰“å¼€å³ `Connect` 远端;广æ’/组æ’/指定本地端å£çš„åŒè§’è‰²å®žä¾‹ä¿æŒ SendTo è¯ä¹‰ | 客户端å‘é€ **41.5→0.4 B/msg**ï¼›æœåŠ¡ç«¯åžåä¸å˜ï¼ˆ2.34→2.36 Gbps åŒæ¡£ï¼‰ |
| 接收环并行度实验 | `MaxAsync` ×4(51 æ§½ä½ï¼‰å¯¹ç…§å®žéªŒ | åŒ…çŽ‡æ— å˜åŒ– → æ§½ä½æ•°ä¸æ˜¯ UDP 包率上é™çš„ç“¶é¢ˆï¼›ä¿æŒé»˜è®¤ CPU×1.6 |
| **UDP 接收改 ReceiveFromAsync** | `UdpServer.OnReceiveAsync` ç”± `ReceiveMessageFromAsync` 改为 `ReceiveFromAsync`ï¼›æœ¬åœ°åœ°å€æ”¹ç”±æ–°å¢žè™šæ–¹æ³• `GetReceiveLocalAddress`(`UdpServer` å– `Local.Address`)æä¾› | æ¯åŒ…åˆ†é… **216→104 B(-52%)**ã€æ¯åŒ… CPU **-1.3 µs**ã€**UDP 1KB 高并å‘包率 +18.8%**(åŒçŽ¯å¢ƒé…对 A/B 3 次å–ä¸ä½ï¼ŒåŒºé—´ä¸é‡å :468k→556k pps);UDP 64KB 大包档è½åœ¨çŽ¯å¢ƒå™ªå£°å†…ï¼ˆå¯¹ç…§æ¡£æŠ–åŠ¨ ±40%ï¼‰ï¼Œæ— æ˜Žç¡®å˜åŒ– |
| **UDP 包信æ¯å›žå½’默认(v3.8 回退)** | `UdpServer` æ¢å¤ `ReceiveMessageFromAsync`(Mono/Android ä»èµ° `ReceiveFromAsync`),`GetReceiveLocalAddress` 回到æ¯åŒ…包信æ¯åœ°å€ï¼›æ–°å¢ž `PacketInformation`(默认 true)作高åžå逃生开关,打开å‰åˆ¤å®šä¸€æ¬¡ | é€åŒ…æœ¬åœ°åœ°å€æ¢å¤ä¸ºã€Œæ•°æ®æŠ¥å®žé™…到包的本机地å€ã€ï¼›ä»£ä»·æ¯åŒ… **104→216 B**ã€1KB 高并å‘包率 **386k→327 kpps(-15%)**(2026-10-12 裸 Socket åŒæž„接收环 A/B,20 æ§½ × 4 å‘é€çº¿ç¨‹ × 3 轮,与 v3.3 çš„ -14~18.8% 一致);关开关å³å›žåˆ° 104 B/msg |
| **TCP å†…æ ¸æŽ¥æ”¶ç¼“å†²æ—‹é’®** | 新增 `SocketSetting.ReceiveBufferSize`(0=䏿”¹ï¼Œé»˜è®¤è¡Œä¸ºä¸Žå†…å˜å 用å‡ä¸å˜ï¼‰ï¼Œåœ¨å®¢æˆ·ç«¯è¿žæŽ¥ä¸ŽæœåŠ¡ç«¯æŽ¥å—连接处应用;`NetLoadTest` åŠ `--rcvbuf` 便于å¤çް | TCP 大包档å—**å†…æ ¸æŽ¥æ”¶çª—å£**é™åˆ¶ï¼ˆå‘é€ä¾§æŒ‰æŠ¥æ–‡è‡ªåŠ¨è°ƒä¼˜ï¼ŒæŽ¥æ”¶ä¾§æ¤å‰æ— 旋钮)。负载/高延迟æ¡ä»¶ä¸‹ 1MB 报文 8C ä¸ä½ **16.74→20.96 Gbps(+25%)**ï¼›æ—©æœŸè´Ÿè½½æ›´é‡æ—¶ 64KB +33%ã€1MB +94%ï¼›**空闲回环下 ±0%**(系统自动调优已足够)——收益å–决于带宽延迟积 |
**剩余 216 B/msg çš„æˆå› **ï¼šç» .NET è¿è¡Œæ—¶æºç 确认,SAEA 完æˆå›žè°ƒä¼š**就地更新** `RemoteEndPoint` 对象(`EndPoint.Create` è¯ä¹‰ï¼‰ï¼Œä¸”è¯¥å¯¹è±¡éšæŽ¥æ”¶ç»“æžœæˆä¸ºä¼šè¯çš„远程端点被长期ä¿ç•™â€”—æ¯è½®æŽ¥æ”¶å¿…须使用新的 `IPEndPoint`ï¼›å¤ç”¨åŒä¸€å®žä¾‹é‡ç½®ä¼šæŠŠå…¶å®ƒä¼šè¯çš„ç«¯ç‚¹æ”¹æŽ‰ã€‚è¯¥å¼€é”€åœ¨åº”ç”¨å±‚å·²æ— å®‰å…¨ä¼˜åŒ–ç©ºé—´ã€‚
**验è¯**:新增å•元测试 `UdpServerCreateSessionEndPointCache`(åŒç«¯ç‚¹å¤ç”¨/销æ¯åŽé‡å»ºï¼‰ã€`UdpClientAutoConnectRemote`(自动连接+æ”¶å‘)ã€`UdpServerNoAutoConnectForBroadcastAndLocalPort`(广æ’/åŒè§’色ä¸è¿žæŽ¥ï¼‰ï¼›UDP 相关 32 用例全绿;TCP 路径ä¸å—å½±å“ï¼ˆå¤æµ‹åŒæ¡£ï¼‰ã€‚
**v3.2(2026-10-09ï¼‰é‡æž„åŽå›žå½’夿µ‹**:接收环/会è¯é‡æž„ï¼ˆå¥æŸ„å€Ÿå‡ºå³æŒ‚æ§½ã€å…³é—é‡å¼€å¥‘约收窄ç‰ï¼‰åŽå…¨çŸ©é˜µå¤æµ‹ 61 场景,并对波动档ä½è¡¥å…… 5 æ¬¡å¤æµ‹å–ä¸ä½â€”—**儿¡£ä¸Ž v3.1 æŒå¹³ã€æ— 回归**ï¼›UDP 64KB 峰值 134.5→138.9 Gbps(+3.2%)ã€TCP 1KB å¹¶å‘峰值 13.7→14.5 Gbps;分é…(TCP è¿‘é›¶ / UDP æ’定 216 B/msgï¼‰ä¸Žå»¶è¿ŸåŒæ¡£ã€‚原始数æ®ï¼š`Benchmark/NetLoadTest/results/20261009-200337`。
**v3.2 æ·±æŒ–ï¼ˆå½’å› æ”¶å£ï¼‰**:对三项é—ç•™/疑点åšéš”ç¦»å®žéªŒï¼ˆè§ 5.1)——①**ä¸å˜åœ¨"ä¸¢æ± "**:接收环稳æ€é›¶ `OwnerPacket` æž„é€ /é›¶"æ¢æ–°",纯 ArrayPool 19.6 亿次借还 0 分é…ï¼›TCP 1MB 264 B/msg 实为约 1 MB/s 背景分é…çš„**度é‡å‡è±¡**;② UDP 216 B/msg = 32 B è¿è¡Œæ—¶å¼ºåˆ¶é¢„置端点 + 184 B è¿è¡Œæ—¶å›ºæœ‰ï¼Œæ— 安全优化空间;③ NoDelay é»˜è®¤å€¼ç» A/B 验è¯**有益于åžå**,éžç¼ºé™·ã€‚**å‘é€ä¾§å¯¹ç…§**:裸 Socket 客户端 7.49 µs/包 vs 库客户端 7.47 µs/包,库å‘é€è·¯å¾„é›¶é¢å¤–开销;æ¯åŒ… CPU å½’å£ Windows loopback å†…æ ¸åè®®æ ˆã€‚**本轮唯一å¯è½åœ°ä¼˜åŒ–**:UDP 接收改 `ReceiveFromAsync`(æ¯åŒ…çœ 112 Bã€åŒ…率 +14%),已按「本地地å€å– `Local.Address`ã€æ–¹æ¡ˆè½åœ°ï¼Œè§ä¸‹ã€‚
**v3.3(2026-10-09)UDP 接收 API 优化**:`UdpServer.OnReceiveAsync` 统一改走 `ReceiveFromAsync`(原仅 Mono/Android 分支æ‰èµ°ï¼‰ï¼Œæœ¬åœ°åœ°å€ç”±æ–°å¢žè™šæ–¹æ³• `GetReceiveLocalAddress` æä¾›ï¼ˆ`UdpServer` 返回 `Local.Address`)。收益:æ¯åŒ…åˆ†é… **216→104 B(-52%)**ã€æ¯åŒ… CPU **-1.3 µs**ã€UDP 1KB 高并å‘包率 **+18.8%**(468k→556k pps,åŒçŽ¯å¢ƒé…对 A/B 3 次ä¸ä½ï¼ŒåŒºé—´ä¸é‡å )。代价:多宿æœåŠ¡å™¨ç»‘ `Any` æ—¶ `e.Local` 由「实际到包地å€ã€å˜ä¸ºç»‘定地å€ï¼ˆä¸Žæ¶ˆæ¯è·¯å¾„ `e.Local = Local.Address` åŒå£å¾„);契约由新用例 `UdpLocalAddress_FromServerBinding` é’‰ä½ï¼Œå¹¶åšã€Œé€€å›žæ—§å®žçްå³å˜çº¢ã€çš„è´Ÿå‘验è¯ï¼›UDP 相关 62 用例全绿。(该用例在 v3.8 䏿›´åä¸ºå¼€å…³å…³é—æ€ç”¨ä¾‹ `UdpLocalAddress_FromServerBinding_WhenPacketInformationOff`。)
**v3.8(2026-10-12)UDP 包信æ¯å›žé€€**:v3.3 的本地地å€é™çº§ä½¿**多宿æœåŠ¡å™¨æ— æ³•å¾—çŸ¥æ•°æ®æŠ¥æ¥è‡ªå“ªä¸€å¼ 本地网å¡**(`e.Local` æ’为绑定地å€ï¼‰ï¼Œè€Œè¿™æ˜¯ç½‘ç»œåº“æž¶æž„è®¾è®¡è¦æ±‚çš„å¯è§‚æµ‹èƒ½åŠ›ï¼Œæ•…å›žé€€ï¼šéž Mono 平尿¢å¤ `ReceiveMessageFromAsync`,`GetReceiveLocalAddress` 回到 `se.ReceiveMessageFromPacketInfo.Address`;新增 `UdpServer.PacketInformation`(默认 `true`)作为高åžå逃生开关,打开时一次性判定,接收çƒè·¯å¾„ä¸åšå±žæ€§è¯»å–。**夿µ‹**(本机 20 æ ¸ï¼Œè£¸ Socket åŒæž„接收环,20 æ§½ × 4 å‘é€çº¿ç¨‹ × 3 s × 3 轮,payload 1KB):`ReceiveFromAsync` **104.0 B/msgã€375-387 kpps**ï¼›`ReceiveMessageFromAsync` **216.0 B/msgã€255-328 kpps**——分é…å·® **+112 B/包**与 v3.3 报告一致,包率 **-15%**(第 2/3 è½® 387k→327k)。契约用例:`UdpLocalAddress_FromPacketInformation`(默认å–到包地å€ï¼Œè´Ÿå‘验è¯ã€Œé€€å›ž `ReceiveFromAsync` å³å˜çº¢ã€ï¼‰ä¸Ž `UdpLocalAddress_FromServerBinding_WhenPacketInformationOff`(关开关退回绑定地å€ï¼‰ï¼›UDP 与 SessionLifecycle å…± 70 用例全绿,net10.0ã€net45ã€netstandard2.0 三 TFM 编译通过。
**测试环境说明**ï¼šæœ¬è½®å¤æµ‹æœŸé—´æœºå™¨å¦æœ‰çº¦ 3-4 æ ¸èƒŒæ™¯è´Ÿè½½ï¼ˆå¯¹ç…§æ¡£ `tcp-64KB-c4` 抖动达 ±40%),故 §三/§五 è¡¨æ ¼ä»ä¸º v3.2(当日空闲时)数æ®ï¼ŒUDP æ¡£ç»å¯¹é‡åœ¨è´Ÿè½½ä¸‹å低;建议在空闲机器上é‡è·‘ `run-matrix.ps1` 刷新全表。
**v3.4(2026-10-09)TCP å†…æ ¸æŽ¥æ”¶ç¼“å†²**ï¼šå®šä½ TCP 大包档「包率仅 ~80 kppsã€1MB 档仅 4 kppsã€çš„æˆå› â€”â€”**䏿˜¯** CPU 或库内开销(æœåŠ¡ç«¯ 1KB 档仅 0.58 µs/包),而是**接收窗å£**å¡ä½å¸¦å®½å»¶è¿Ÿç§¯ï¼šå‘é€ä¾§ `TuneSendBufferSize` 会按报文大å°è‡ªåŠ¨æ”¾å¤§å‘é€ç¼“冲,接收侧å´å§‹ç»ˆç”¨ç³»ç»Ÿé»˜è®¤ï¼ˆWindows 约 64KB)。用 NewLife è‡ªèº«æ ˆåšå› 果实验(åŒä¸€çŽ¯å¢ƒå†…å¯¹æ¯”ï¼‰ï¼šç½® SO_RCVBUF=4MB åŽ 1MB 报文 8C åžåä¸ä½ **16.74→20.96 Gbps(+25%)**ï¼›æ›´æ—©ã€æœºå™¨è´Ÿè½½æ›´é‡æ—¶åŒä¸€å¯¹æ¯”为 64KB **+33%**ã€1MB **+94%**。
**é‡è¦å±€é™**:机器转闲åŽåŒä¸€å¯¹æ¯”回到 **±0%**——Windows çš„ SO_RCVBUF 自动调优在空闲回环下已足够,显å¼è®¾ç½®åªåœ¨ã€Œè´Ÿè½½æˆ–链路延迟使 RTT 增大ã€BDP 超过默认窗å£ã€æ—¶æ‰è§æ•ˆã€‚æ•…æœ¬é¡¹åšæˆ**æ˜¾å¼æ—‹é’®**(默认 0 = 䏿”¹ï¼Œé›¶è¡Œä¸ºå˜åŒ–ã€é›¶å†…å˜å¼€é”€ï¼‰ï¼Œ**ä¸**默认放大(4MB × 1 万连接 = 40GB å†…æ ¸å†…å˜ï¼‰ã€‚验è¯ï¼šæ–°å¢žç”¨ä¾‹ `TcpReceiveBufferSize_AppliedToBothEnds`(两端套接å—å‡å¸¦ä¸Šè®¾ç½®å€¼ï¼‰ï¼›`NetLoadTest` åŠ `--rcvbuf` 便于å¤çŽ°ã€‚
**v3.5(2026-10-09ï¼‰åŠ åŽ‹å¤æ ¸**ï¼šç”¨å¤šå®¢æˆ·ç«¯è¿›ç¨‹åŠ åŽ‹ï¼ˆè§ 5.2ï¼‰è¯æ˜ŽæœåŠ¡ç«¯**远未饱和**——TCP 1KB 在 1.48 Mpps 时仅用 1.31 æ ¸ã€UDP 1KB 在 ~600 kpps 时约 2.0 æ ¸ï¼›1→4 客户端进程使 TCP 从 8.01 æå‡åˆ° 12.09 Gbps(+51%),继ç»åŠ è¿›ç¨‹ä¸å†æå‡ã€‚æ®æ¤**ä¿®æ£**两处早期表述:①§3.1「å°åŒ…æ‹ç‚¹ï¼å•进程接收环饱和ã€ä¸æˆç«‹ï¼Œæ‹ç‚¹æ˜¯å®¢æˆ·ç«¯/å›žçŽ¯æ ˆä¸Šé™ï¼›â‘¡ 早期å•点 CPU é‡‡æ ·ç»™å‡ºçš„ã€ŒUDP æœåŠ¡ç«¯ 13-17 µs/包ã€ä¸ŽåŠ åŽ‹å®žæµ‹ä¸ç¬¦ï¼ˆå‰è€…在带 3-4 æ ¸èƒŒæ™¯è´Ÿè½½æœŸé—´å–å¾—ï¼‰ï¼Œå·²æ”¹ä¸ºä»¥åŠ åŽ‹å®žæµ‹ä¸ºå‡†ã€‚
## å…«ã€NativeAOT 与 JIT 性能对比(v3.6,2026-10-09)
用**åŒä¸€ä»½æºç **分别以 JIT(CoreCLR)与 NativeAOT å‘布压测工具,在**åŒä¸€æ—¶æ®µäº¤æ›¿é…对**(JIT/AOT 轮转,抵消机器背景负载漂移):
- JIT:`dotnet build Benchmark/NetLoadTest -c Release` → `bin/Release/net10.0/NetLoadTest.exe`
- AOT:`dotnet publish Benchmark/NetLoadTestAot -c Release -r win-x64 -o out-aot` → åŽŸç”Ÿå•æ–‡ä»¶ **9.50 MB**
**åžåï¼ˆå„ 4 è½®å–ä¸ä½ï¼›æœ¬æœºå¦æœ‰ 3-4 æ ¸èƒŒæ™¯è´Ÿè½½ï¼Œå•轮抖动å¯è¾¾ ±40%ï¼Œæ•…åªæŠ¥ä¸ä½å¹¶æ³¨æ˜Žè½®æ•°ï¼‰**
| 场景 | JIT | AOT | å˜åŒ– |
|---|---:|---:|---:|
| TCP 1KB å•å‘ 8C | 9.01 Gbps / 1,099,964 pkt/s | **9.55 / 1,166,254** | **+6.0%** |
| UDP 1KB å•å‘ 32C | 4.88 / 595,463 | **5.09 / 621,872** | **+4.3%** |
| TCP 1KB 往返 4C | 0.62 / 75,258 | **0.69 / 84,075** | **+11.3%** |
**延迟与分é…**
| æŒ‡æ ‡ | JIT | AOT | 说明 |
|---|---|---|---|
| 往返 P50(4 轮原始) | 52 / 54.6 / 54.9 / 49.4 µs | 64.8 / 46.6 / 46.0 / 47.7 µs | ä¸ä½ 53.7 → **47.2 µs(-12%)**ï¼›AOT 首轮å高属冷å¯åЍ |
| TCP 1KB 往返 æ¯åŒ…åˆ†é… | 1.10-1.48 B/msg | **0.60-0.94 B/msg** | AOT åˆ†é…æ›´ä½Ž |
| TCP 1KB å•å‘ æ¯åŒ…åˆ†é… | 0.17 | **0.11** | 两者都近零 |
| UDP 1KB å•å‘ æ¯åŒ…åˆ†é… | 109.6 | 106.5 | 两者都 ≈ è¿è¡Œæ—¶å›ºæœ‰çš„ ~104 B/msg(v3.3 优化åŽï¼‰ |
| å¯åŠ¨åˆ°å¯æœåŠ¡ | 204-241 ms | 230-240 ms | **æ— å·®å¼‚** |
| 啿–‡ä»¶ä½“积 | 0.15 MB(apphost,ä¾èµ–共享è¿è¡Œæ—¶ï¼‰ | 9.50 MB | AOT 自带è¿è¡Œæ—¶ |
**结论**
1. **AOT å…¨é¢å°å¹…领先**:三档åžå +4~11%ã€å¾€è¿” P50 低约 12%ã€æ¯åŒ…åˆ†é…æ›´ä½Žï¼ˆè¿‘é›¶æ¡£ 0.17→0.11 B/msg)。三个方å‘ä¸€è‡´ï¼Œä¸æ˜¯å™ªå£°åå‘。
2. **å¯åŠ¨æ— ä¼˜åŠ¿**:本场景å¯åŠ¨è€—æ—¶ç”±è¿›ç¨‹åˆ›å»ºä¸Ž NewLife é…ç½®åˆå§‹åŒ–主导,"å… JIT"æ”¶ç›Šä¸æ˜Žæ˜¾ï¼›AOT çš„ä»·å€¼åœ¨è¿™é‡Œä¸»è¦æ˜¯**部署形æ€**ï¼ˆå•æ–‡ä»¶ã€æ— è¿è¡Œæ—¶ä¾èµ–ã€å¯ä¸Š AOT å¹³å°ï¼‰ä¸Žå†…å˜ï¼Œè€Œéžå¯åŠ¨ã€‚
3. **ç½‘ç»œæ ˆçƒè·¯å¾„æ— AOT 风险**:1.5 Mpps 级收å‘ã€SAEA 接收环ã€å¯¹è±¡æ± ã€`Pool.StringBuilder` 在 AOT 下全部æ£å¸¸ï¼Œæœªè§¦ç¢°åˆ°åå°„/动æ€ä»£ç ä¾èµ–。
4. 顺带修掉一处 AOT ä¸å…¼å®¹ï¼šåŽ‹æµ‹å·¥å…·æœ«å°¾çš„ `SUMMARY:` 原用 `JsonSerializer.Serialize`(åå°„å¼ï¼‰ï¼ŒNativeAOT 默认ç¦ç”¨åå°„å¼åºåˆ—化会直接抛异常;改为手写åºåˆ—åŒ–åŽ AOT äº§ç‰©å¯æ£å¸¸è¾“出汇总,ILC çš„ IL2026/IL3050 å‘Šè¦æ¸…零。
5. **å£å¾„æé†’**ï¼šå¶æ•°è½®æ¬¡ + å•è½® ±40% 抖动下,**å°å·®å¼‚(<5%)ä¸å¯å½“作定论**;本表的 +4~11% 属方å‘一致但幅度有é™ï¼Œè‹¥è¦æ›´ä¸¥ç»“è®ºéœ€åœ¨ç©ºé—²æœºå™¨ä¸ŠåŠ å¤§è½®æ¬¡ã€‚
## å¤çް命令
```bash
# 全矩阵一键跑批(约 20 分钟;-Quick 冒烟 / -SkipBuild 跳过编译 / -Only æ£åˆ™è¿‡æ»¤ï¼‰
pwsh -File Benchmark/NetLoadTest/run-matrix.ps1
# å¤šå®¢æˆ·ç«¯è¿›ç¨‹åŠ åŽ‹ï¼ˆçªç ´å•进程客户端 CPU 上é™ï¼ŒåŽ‹å‡ºæœåŠ¡ç«¯çœŸå®žä½™é‡ï¼›è§ 5.2)
pwsh -File Benchmark/NetLoadTest/run-matrix.ps1 -Only "tcp-1KB" -ClientProcs 4
# NativeAOT å‘布与对比(åŒä¸€ä»½æºç ï¼›AOT å·¥ç¨‹è§ Benchmark/NetLoadTestAot)
dotnet publish Benchmark/NetLoadTestAot -c Release -r win-x64 -o out-aot
out-aot/NetLoadTest.exe --server --port 7789 --oneway
# å•场景:分离进程å•å‘åžå(æœåŠ¡ç«¯ç‹¬ç«‹è¿›ç¨‹ + 客户端åªå‘䏿”¶ï¼›æœåŠ¡ç«¯ STEADY å«åˆ†é…/GC)
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --server --port 7789 --oneway
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --remote 127.0.0.1:7789 --clients 8 --size 65536 --seconds 10 --warmup 2 --oneway
# å•场景:往返延迟(客户端接收方å¼å¯é€‰ sync|asyncpull|event)
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --server --port 7789 --size 1024
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --remote 127.0.0.1:7789 --mode roundtrip --clients 4 --size 1024 --seconds 10 --recvmode event
# 粘包å£å¾„(24B 逻辑帧)与 UDP 连接化实验
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --remote 127.0.0.1:7789 --clients 8 --size 65536 --seconds 10 --oneway --frame 24
Benchmark/NetLoadTest/bin/Release/net10.0/NetLoadTest.exe --remote 127.0.0.1:7789 --udp --clients 4 --size 1024 --seconds 10 --oneway --udpconnect
```
|