tnet 网络库
tnet 是 tRPC Group 的 Go 高性能网络库,采用事件循环模型,提供 TCP、UDP、TLS、HTTP 等能力,并保持与 net.Conn 相近的使用方式。trpc-go 在 Linux、FreeBSD、DragonFly BSD 和 macOS 的构建中通过空白导入注册 tnet transport;因此,在这些 Unix 平台上它是框架默认可用的传输实现之一。^[来源:tnet README] ^[来源:trpc-go tnet_unix.go]
与 tRPC-Go 的关系
[[2026-07-27-trpc|tRPC]] 负责把服务、编解码、调用链和治理能力组织成 RPC 框架;tnet 位于更底层的网络 I/O 路径。把 tnet 视为 tRPC-Go 的一个可替换 transport 更准确,而不是把两者混为同一个框架:transport 的实际选择仍受操作系统、构建条件和运行配置影响。
tnet 的 README 列出事件循环、非阻塞处理、批量 ReadV/WriteV、零拷贝读取 API,以及可选的业务 goroutine 池等机制。其目的分别是降低连接等待时的 goroutine/调度开销、减少系统调用或用户态拷贝,并让 I/O 与 CPU 密集业务能采用不同的并发模型。^[来源:tnet README - Features and models]
关键 API 与性能含义
| 机制 | 接口或模型 | 可能节省的成本 | 使用约束 |
|---|---|---|---|
| 事件循环与非阻塞 I/O | WithNonBlocking | 减少“一连接一阻塞 goroutine”的等待成本 | handler 不能长时间阻塞 poller |
| 零拷贝读 | Peek、Next、Skip、Release | 可直接引用底层 linked buffer,减少把数据复制到新切片 | 返回切片会在后续读取或 Release 后失效 |
| 向量写 | Writev | 可将帧头、消息体等多段数据顺序写出,免去手工拼接大缓冲区 | 是否减少系统调用取决于底层实现与实际写入路径 |
| I/O 与业务分离 | poller + 业务 goroutine 池 | I/O 轮询不必被 CPU 处理长时间占用 | 池大小、排队和业务耗时仍决定尾延迟 |
这些机制会受 Go GMP 调度模型 的影响:事件循环、业务 goroutine 和下游调用最终都由 Go runtime 调度。高并发连接数并不等于业务一定有高 QPS;CPU、GC、锁竞争、序列化、网络和下游服务都可能成为先出现的瓶颈。
不应如何解读
tnet README 的“高性能、低内存”是项目目标和设计声明,不能替代特定服务的性能结论。验证时应固定消息大小、并发度、连接复用策略、TLS、业务处理时间、下游依赖和 Go 版本,分别观察吞吐、P50/P99 延迟、分配率、GC 和 CPU profile,再与候选 transport 在同一负载下比较。^[来源:tnet README]