简单来说:WireGuard 是“通往终点的直线”,而 EasyTier 是“带着复杂导航系统的越野车”。
以下是 EasyTier CPU 开销大、且与 WireGuard 有本质区别的三个核心原因:
1. 用户态(User-space)与 内核态(Kernel-space)的鸿沟
这是你观察到 CPU 占用差异的最直接原因。
- WireGuard (内核态): 数据包到达网卡后,直接在内核里加密并发出。整个过程不离开内核,零拷贝,零上下文切换。
EasyTier (用户态): 1. 数据包先进内核网卡。
- 内核通过
TUN接口把包丢给用户态的 EasyTier 程序(第一次切换)。 - EasyTier 在内存里完成加解密、压缩、路径计算(消耗 CPU)。
- EasyTier 把包重新丢回内核,通过真实的物理网卡发出(第二次切换)。
- 内核通过
- 代价: 这种在内核与用户态之间的“反复跳跃”和内存拷贝,在高带宽下会吞噬大量的 CPU 周期。
2. “协议复杂性” vs “极简协议”
- WireGuard: 它的逻辑极其简单——只负责“加密”和“转发”。它不关心你有没有 NAT,不关心路径怎么选,更没有“去中心化”的概念。
EasyTier: 它是一个全功能组网方案。为了实现“全网通”,它在后台做了大量极其耗费资源的工作:
- NAT 穿透 (Hole Punching): 持续探测网络环境,尝试打洞。
- 路径发现 (Path Finding): 动态计算哪条路最快(是点对点直连,还是经过某个 Peer 转发?)。
- 去中心化协议: 每个节点都是“路由器”,需要维护庞大的邻居表和全网拓扑信息。
- 多协议回退: 如果 UDP 不行,它可能还会尝试 TCP 或其他封装模式。
3. 处理逻辑的区别 (Tool vs. Protocol)
| 特性 | WireGuard (内核态) | EasyTier / Tailscale / ZeroTier |
|---|---|---|
| 角色 | 基础协议 (Protocol) | 组网工具/软件 (Networking Tool) |
| 加解密位置 | 系统内核 (最深处) | 用户态程序 (应用层) |
| 拓扑结构 | 静态 Point-to-Point | 动态 Mesh (网状) |
| 资源消耗 | 极低 (线性增长) | 较高 (随着节点和路径复杂度增长) |
| 灵活性 | 差 (需手动配置每一对连接) | 极强 (全自动、自愈、打洞) |
💡 为什么你会觉得 EasyTier 这么“重”?
在你的 VPS 环境下,如果你只是简单的点对点连接,EasyTier 的复杂功能反而成了累赘:
- 频繁的握手与探测: 为了维持 Mesh 网络,它会不断地与其他 Peer 交换状态,产生额外的 CPU 负载。
- Rust 实现的权衡: 虽然 EasyTier 是用 Rust 写的(性能很高),但它目前的架构设计优先考虑了“去中心化”和“灵活性”,而不是像 WireGuard 那样为了极致性能可以牺牲一切功能。
- 用户态 TUN 瓶颈: 只要工具运行在用户态且通过 TUN 通信,在高带宽(如跑测速或看 4K 视频)时,CPU 占用率通常是内核态 WireGuard 的 3-5 倍 以上。
总结建议
- 追求极致性能(固定链路): 坚持使用你现在的 WireGuard (内核态) 或
wg-easy。虽然配置死板,但它最省 CPU,且速度最快。 - 追求管理便利(复杂环境): 使用 Netbird。Netbird 的聪明之处在于,它用 WireGuard (内核态) 处理数据流量,只用用户态处理控制指令,达到了性能与便利的平衡。
- 追求无中心化(异地互联): EasyTier 适合在没有公网 IP、节点变动频繁、且对 CPU 占用不那么敏感的家庭内网环境中使用。
我还测试了用ssh -L到本地端口的方案,发现占用也不低。(使用ssh连接公网ip地址,绕开了caddy的https加密)【参数-c [email protected],用较轻量的加密】

总结:
算法 vs. 架构:谁才是真正的瓶颈?
SSH (AES-GCM + AES-NI):
算法速度: 极快。在支持 AES-NI 的 CPU 上,AES-GCM 的加解密速度几乎不占用感知上的 CPU 时间。
架构瓶颈: sshd 运行在用户态。每传输一个数据包,数据都要在“内核网卡 -> 内核网络栈 -> SSH 进程 -> 内核网络栈 -> 目标应用”之间来回拷贝。
结果: 对于 100GB 的文件,sshd 会产生数百万次上下文切换(Context Switch)。你的 CPU 并不是死在“加解密”上,而是死在“搬运数据包”的过程中。
WireGuard (ChaCha20-Poly1305):
算法速度: 虽然是纯软件实现(无专用硬件指令集),但它是为现代 CPU 矢量指令优化过的,速度极快(通常能跑满万兆)。
架构优势: 内核态、零拷贝。数据包在内核里直接加解密并转发,完全跳过了用户态的搬运过程。
结果: 正如你之前 vmstat 看到的 cs(上下文切换)只有个位数,WireGuard 的 CPU 效率极高。
1. SSH (sshd) 的加密方式
现代 OpenSSH(sshd)的加密并不是单一算法,而是一个分层协议栈,在建立连接时会进行协商:
对称加密(数据传输): * 默认/主流: ChaCha20-Poly1305。这与 WireGuard 使用的算法一致,非常适合没有硬件加速的 CPU。
- 高性能/硬件加速: AES-GCM (如
[email protected])。如果你的 CPU 支持 AES-NI 指令集,这个算法的开销极低。
- 高性能/硬件加速: AES-GCM (如
- 密钥交换(握手): 通常使用 Curve25519 (ECDH),这是一种非常快速且安全的椭圆曲线算法,计算压力远小于传统的 RSA。
- 身份验证: 使用 Ed25519 或 RSA 密钥。
- 完整性校验 (MAC): 如果使用了 AEAD 算法(如 AES-GCM 或 ChaCha20),完整性校验是内置的,不再需要额外的 HMAC 计算,进一步节省了 CPU。
2. 为什么理论上比 HTTPS (TLS) 更快?
说 SSH “比 HTTPS 快”通常指的是协议开销(Overhead)和连接效率,而不是指加解密本身的数学速度(因为两者都可能使用相同的 AES-GCM 算法)。
A. 握手更“轻” (No Certificate Bloat)
- HTTPS (TLS): 必须处理复杂的证书链(Certificate Chain)。服务端要发送证书,客户端要验证 CA 签名、检查吊销列表(CRL/OCSP)。这些步骤涉及大量的非对称加密运算和多次网络往返。
- SSH: 采用的是 TOFU (Trust On First Use) 模式。它只验证服务器的公钥指纹,不涉及庞大的证书链验证。握手报文非常小,建立连接的速度极快。
B. 头部开销更小 (Binary vs. HTTP Headers)
- HTTPS: 即使是数据传输阶段,每一个 HTTP 请求都会附带大量的文本头信息(User-Agent, Cookie, Referer 等),即便在 HTTP/2 下有头部压缩,依然存在应用层的封装开销。
- SSH 转发: 一旦隧道建立,它传输的是纯粹的 TCP 流。它只在数据包外面套一层非常薄的 SSH 协议头。没有 HTTP 的语义解析压力,对 CPU 来说处理逻辑更简单。
C. 更好的复用与持久化 (Multiplexing)
- SSH: 原生支持信道复用(Multiplexing)。你可以在一个已经建立好的 SSH 隧道里开启无数个转发通道,这些通道共享同一个加密 session,不需要重复握手。
- HTTPS: 传统的 HTTPS 往往是“请求-响应”模式,虽然有 Keep-Alive 和 HTTP/2 改进,但在复杂的代理场景下,处理状态机的负担比 SSH 的纯流转发要重。
3. 现实中的“翻车”点:TCP in TCP
虽然 SSH 转发理论开销小,但它有一个致命的弱点,在网络质量差时会变得极慢:
TCP 熔断 (TCP Meltdown) 效应:
SSH 本身是基于 TCP 的。如果你通过 SSH 隧道再跑一个 TCP 协议(比如访问一个网页),就形成了“TCP 嵌套”。
如果底层网络丢包,外层的 SSH 会尝试重传,内层的 TCP 也会尝试重传。两层重传计时器互相冲突,会导致延迟指数级增加,吞吐量暴跌。
💡 总结建议
- 性能排序: WireGuard (内核态) > SSH 转发 > HTTPS (用户态代理)。
适用场景:
- 如果你在 局域网或稳定的骨干网 之间倒腾数据,SSH 转发的低开销和免证书配置非常香。
- 如果你在 高延迟、不稳定 的网络下使用,SSH 转发会因为 TCP 嵌套问题输给基于 UDP 的 WireGuard。
测试 SSH 转发时,是用它来做数据库同步,还是简单的网页代理?
不同的负载对 MTU 和 TCP 窗口的敏感度完全不同。
对于传输 100GB 以上的大规模文件,WireGuard(内核态) 的优势依然非常明显,即便你的 CPU 支持 AES-NI 指令集且 sshd 的 AES-GCM 算法在“纯数学计算”上可能更快。
这里有三个深层次的对比逻辑,决定了为什么在大规模传输中,WireGuard 通常是更好的选择:
1. 算法 vs. 架构:谁才是真正的瓶颈?
SSH (AES-GCM + AES-NI):
- 算法速度: 极快。在支持 AES-NI 的 CPU 上,AES-GCM 的加解密速度几乎不占用感知上的 CPU 时间。
- 架构瓶颈:
sshd运行在用户态。每传输一个数据包,数据都要在“内核网卡 -> 内核网络栈 -> SSH 进程 -> 内核网络栈 -> 目标应用”之间来回拷贝。 - 结果: 对于 100GB 的文件,
sshd会产生数百万次上下文切换(Context Switch)。你的 CPU 并不是死在“加解密”上,而是死在“搬运数据包”的过程中。
WireGuard (ChaCha20-Poly1305):
- 算法速度: 虽然是纯软件实现(无专用硬件指令集),但它是为现代 CPU 矢量指令优化过的,速度极快(通常能跑满万兆)。
- 架构优势: 内核态、零拷贝。数据包在内核里直接加解密并转发,完全跳过了用户态的搬运过程。
- 结果: 正如你之前
vmstat看到的cs(上下文切换)只有个位数,WireGuard 的 CPU 效率极高。
结论: 算法上的微小差距(AES vs ChaCha20)完全被架构上的巨大鸿沟(内核态 vs 用户态)抵消了。
2. TCP 与 UDP 的本质区别(针对大文件)
传输 100GB 文件时,网络波动是不可避免的。
SSH (基于 TCP):
- TCP 是极其“谨慎”的。一旦发生丢包,TCP 的拥塞控制算法会立即缩减窗口,导致传输速度骤降。
- 在高延迟或有轻微丢包的长距离公网链路上,SSH 的传输速度往往很难跑满带宽。
WireGuard (基于 UDP):
- WireGuard 只是提供了一个高效的“管道”。
- 如果你在管道里跑
rsync或rclone,它们可以利用更激进的算法(或者多线程并发)来填充带宽。 - 关键点: WireGuard 对丢包不敏感。底层 UDP 丢一个包,不会导致整个加密隧道“卡住”等待重传。
3. 传输工具的差异:scp/sftp vs rsync/rclone
当你决定用 SSH 还是 WireGuard 时,其实你也决定了使用的工具:
使用 SSH (scp/sftp):
scp的协议设计非常陈旧,它是同步的——发一个块,等一个确认。在长距离传输大文件时,scp极其慢。sftp稍微好一点,但依然受限于单线程和 SSH 缓冲区限制。
使用 WireGuard + rclone/rsync:
- 你可以使用
rclone开启多个并发流(--transfers),通过 WireGuard 管道并行传输。 - 因为 WireGuard 是内核态,这种多线程并发产生的 CPU 负载比在 SSH 进程里开多线程要小得多。
- 你可以使用
📊 100GB+ 传输对比表
| 特性 | SSH 隧道 (AES-GCM) | WireGuard (内核态) |
|---|---|---|
| CPU 消耗主要来源 | 上下文切换 & 内存拷贝 | 纯数学加解密运算 |
| 硬件加速利用 | 完美利用 AES-NI | 依靠 CPU 矢量指令 |
| 吞吐量稳定性 | 容易受 TCP 拥塞控制限制 | 非常稳定,易于跑满带宽 |
| 断线重连 | 需重新握手,连接易中断 | 无感重连 (Roaming) |
| 推荐传输工具 | sftp, rsync | rclone, rsync, nfs |
💡 最终建议
对于你的 100GB+ 大文件传输 任务:
首选方案: WireGuard (内核态) +
rclone或rsync。- 理由:CPU 占用最低(由于内核态),带宽利用率最高,且即使网络波动也不会导致任务彻底崩溃。
次选方案(如果你不想配置 WG): SSH 配合
rsync或hpn-ssh。- 注意:千万不要用
scp!如果非要用 SSH,请确保开启了[email protected]这种高性能算法。
- 注意:千万不要用
一个实战技巧:
如果你正在传输 100GB 文件,请务必检查一下你的 MTU。在 WireGuard 链路上,将 MTU 设置为 1360 通常能避开绝大多数公网链路的 MTU 瓶颈,从而进一步降低由于分片(Fragmentation)导致的 CPU 额外开销。