我们如何通过 5 倍的提升在 Go 中改进用户空间 TCP 栈的性能

主要观点:

  • Coder 致力于打造出色的云开发环境,远程开发时连接工作区的速度和质量很重要,吞吐量是衡量连接好坏的重要指标。
  • Coder v2.12 包含多项网络改进,使吞吐量大幅提升,超过 5 倍,通过不同 AWS 环境的测试结果对比展示。
  • Coder 嵌入 gVisor 的网络栈,因需端到端加密且跨多种系统运行,不用操作系统的 TCP 实现,需对 gVisor 进行配置和修改以适应 Coder 用户。
  • TCP 缓冲区大小与吞吐量直接相关,与延迟成反比,增加缓冲区可提升吞吐量,如 Coder 2.10 增加缓冲区后吞吐量显著提高。
  • TCP 慢启动可能导致连接速度在开始时卡顿,研究人员提出的 HyStart 算法可解决此问题,Coder 实现并 upstreamed 到 gVisor 后,TCP 吞吐量得到改善。
  • Coder 网络性能受丢包影响,部分丢包发生在 Coder 进程内部,通过使用 Go 的缓冲通道可改善,使吞吐量翻倍。
  • 尽管 Coder 已取得很大进步,但仍将继续追求更高性能,直到瓶颈是底层网络本身。

关键信息:

  • 吞吐量:每秒发送或接收数据的速率,通常以比特每秒为单位,现代网络从几兆比特每秒到几十吉比特每秒不等。
  • gVisor:容器运行时,在 Go 中重新实现整个 Linux ABI,Coder 用于网络栈。
  • TCP 慢启动:TCP 连接开始时拥塞窗口很小,每确认一个数据包拥塞窗口翻倍,避免网络拥塞,但可能导致发送数据过快。
  • HyStart:解决 TCP 慢启动问题的算法,通过跟踪往返时间的细微变化检测网络拥塞。
  • 缓冲通道:Go 中的数据结构,可在缓冲区满时继续写入,避免阻塞,用于改善 Coder 网络性能。

重要细节:

  • 不同测试环境的延迟情况,如 60ms 是跨大陆的延迟,10ms 是同一地理区域的延迟,1ms 是同一建筑或园区内的极低延迟。
  • Coder CLI 的 speedtest 命令可测试到工作区的吞吐量,并可在 Wireshark 中捕获 TCP 数据包进行分析。
  • TCP 窗口:接收方缓冲区的可用空间,发送方不能发送超过此窗口大小的未确认数据。
  • 网络性能受多种因素影响,如连接速度、网络拥塞等。
阅读 13
0 条评论